プログラミングのお題スレ Part22at TECH
プログラミングのお題スレ Part22 - 暇つぶし2ch2:デフォルトの名無しさん
23/08/03 14:04:23.10 Lr04Zjag.net
>>1
O2

3:デフォルトの名無しさん
23/08/06 12:21:14.08 /9zIb/V0.net
お題
1行につき一つの文章が入力されます
アルファベット26文字がすべて含まれている文章をフィルタリングしてください
大文字小文字は区別しません
そのうちもっとも短い文章を出力してください

入力
The quick brown fox jumps over a lazy dog.
The jay, pig, fox, zebra and my wolves quack!
Pack my box with seven dozen liquor jugs.
The horse, pig, fox, zebra and my wolves quack!
Jackdaws love my small sphinx of quartz.
Jackdaws love my big sphinx of quartz.
The quick brown fox jumps over a lazy cat.
Pack my box with five dozen liquor jugs.

出力
Jackdaws love my big sphinx of quartz.

4:デフォルトの名無しさん
23/08/06 17:47:37.64 RhhSFLLO.net
>>3
Kotlin
URLリンク(paiza.io)

5:デフォルトの名無しさん
23/08/06 18:08:09.04 RhhSFLLO.net
>>3
C
URLリンク(paiza.io)

6:デフォルトの名無しさん
23/08/06 19:07:03.27 Md+pNxjw.net
use std::io::{self, BufRead, BufReader};
const FULL_BITS: u32 = (1 << 26) - 1;
fn main() {
 let mut shortest: Option<String> = None;
 for line in BufReader::new(io::stdin()).lines() {
  let line = line.unwrap();
  let mut bits = 0;
  for b in line.as_bytes() {
   let index = match b {
    b'A'..=b'Z' => b - b'A',
    b'a'..=b'z' => b - b'a',
    _ => continue,
   };
   bits |= 1 << index;
  }
  if bits != FULL_BITS {
   continue;
  }
  if let Some(ref shortest) = shortest {
   if shortest.len() < line.len() {
    continue;
   }
  }
  shortest = Some(line);
 }
 if let Some(shortest) = shortest {
  println!("{shortest}");
 } else {
  eprintln!("ERROR: no matched lines");
 }
}

7:デフォルトの名無しさん
23/08/06 20:04:54.35 pJXl8PQk.net
>>3
R
URLリンク(ideone.com)

8:デフォルトの名無しさん
23/08/07 01:25:47.55 dolrRGoi.net
>>6
それなんて言語?

9:9
23/08/07 01:46:18.23 PMO8D1QO.net
>>3 Perl5

for (<DATA>) {
 my %h = map{$_ => 1} grep{/[a-z]/i} split '';
 push @a, $_ if 26 == keys %h;
}
@s = sort{length($a) <=> length($b)} @a;
print $s[0];
__DATA__
The quick brown fox jumps over a lazy dog.
The jay, pig, fox, zebra and my wolves quack!
Pack my box with seven dozen liquor jugs.
The horse, pig, fox, zebra and my wolves quack!
Jackdaws love my small sphinx of quartz.
Jackdaws love my big sphinx of quartz.
The quick brown fox jumps over a lazy cat.
Pack my box with five dozen liquor jugs.

※ 見易くするためインデントを全角スペースに置換してあります。


実行結果:

$ perl 22_3_az26.pl
Jackdaws love my big sphinx of quartz.

10:デフォルトの名無しさん
23/08/07 01:57:03.56 PMO8D1QO.net
>>9 ゴメン、2行目に間違いあり…orz

 my %h = map{$_ => 1} grep{/[a-z]/i} split '';
 ↓正しくは
 my %h = map{$_ => 1} map{lc} grep{/[a-z]/i} split '';

実行結果は今回のテストデータだとたまたま同じ結果になる。

11:デフォルトの名無しさん
23/08/07 09:39:33.60 3KYy8N/l.net
>>8
Rustでは?

12:デフォルトの名無しさん
23/08/07 19:28:19.42 dolrRGoi.net
>>11
言われてみればRustに見えるな。
Rustは趣味で学習始めたばかりでよく分からなかった。

13:デフォルトの名無しさん
23/08/07 20:51:54.50 ZWV0+Q1Z.net
>>3
Haskell
URLリンク(ideone.com)

14:デフォルトの名無しさん
23/08/08 16:30:48.37 mHXT/QMM.net
>>10 2行目はもっと簡潔に書ける
 my %h = map{$_ => 1} map{lc} grep{/[a-z]/i} split '';
 ↓
 my %h = map{lc $_ => 1} /([A-Za-z])/g;

結局、これでよい筈
for (<DATA>) {
 my %h = map{lc $_ => 1} /([A-Za-z])/g;
 push @a, $_ if 26 == keys %h;
}
@s = sort{length $a <=> length $b} @a;
print $s[0];
__DATA__
… (ry

15:デフォルトの名無しさん
23/08/08 19:36:27.56 ODiXw46s.net
>>3
Rust
use std::collections::HashSet;
use std::io::{self, BufRead, BufReader};
fn main() {
 match BufReader::new(io::stdin())
  .lines()
  .map(Result::unwrap)
  .filter(|line| {
   line.bytes()
    .filter(|b| matches!(b, b'A'..=b'Z'| b'a'..=b'z'))
    .collect::<HashSet<_>>()
    .len()
    .eq(&26)
  })
  .min_by_key(String::len)
 {
  Some(shortest) => println!("{shortest}"),
  None => eprintln!("ERROR: no matched lines"),
 }
}

16:デフォルトの名無しさん
23/08/09 12:27:32.68 ZMLVZrF/.net
無駄に比較回数が増えるsortを使っている>>13>>14は不正解
単純にminが正解

17:デフォルトの名無しさん
23/08/10 13:37:16.01 YYBOmFjO.net
>>3
Perl
URLリンク(paiza.io)

18:蟻人間 ◆T6xkBnTXz7B0
23/08/10 19:00:30.10 kqXaMgBC.net
お題: ちょっとした画像処理。
赤い丸がいくつか描画された不透明な画像ファイル「input.png」を読み込んで、赤い丸を緑の丸に描き変えたものを画像ファイル「output.png」に保存するプログラム。
ここに「赤い」とは、HSV色空間において、色相が0度~60度か300度~360度の範囲にあり、彩度が30%以上で、明度が50%以上の色であると定義する。
「丸」とは、円形度が0.7~1.3の範囲の単一色の図形であると定義する。
「緑」とはRGBで#008000の色であると定義する。

19:デフォルトの名無しさん
23/08/10 19:03:42.87 0ymjHRaX.net
絶対自分でやる気ないお題出すな

20:デフォルトの名無しさん
23/08/10 19:07:41.57 yqkCXlxz.net
>>6
>>15
同じ言語とは思えないほど違うな

21:デフォルトの名無しさん
23/08/10 21:44:28.63 4K08AJqU.net
>>16
このスレで正解とか不正解とか言ってる時点で不正解

22:デフォルトの名無しさん
23/08/11 00:03:07.62 6txSsch+.net
>>16
head , sort で無駄ソートは起こらない
minimumByと最大2倍程度の差しか発生しない
URLリンク(hackage.haskell.org)

23:デフォルトの名無しさん
23/08/11 00:37:49.70 NzWkf1P2.net
今回のようなsortを一切必要としない問題で何度もsortを用いるプログラマーは劣等生

24:デフォルトの名無しさん
23/08/11 00:43:13.53 0bfZQT9B.net
>>23
Haskellのhead . sortはソートしないってのに
sortって書いてあるからソートすると思ってるんやろ?

25:デフォルトの名無しさん
23/08/11 01:09:02.59 NzWkf1P2.net
sortを使うことを問題にしているのであって
sortしていないなら問題ないだろう
個別の話などしていない
そこまで言うならとHaskellのプログラム
>>13を見にいってみたが
入力文字列を各文字でソートして重複を取り除いてabcdefghijklmnopqrstuvwxyzと比較しているのか
hasAllAlph = ( == [ 'a' .. 'z' ] ) . tail . nub . sort . map toLowOrSp . ( ' ' : )

26:9
23/08/11 02:38:50.64 4P/NDj/+.net
スレが伸びているので何かと思えば、オレほか一部の回答者がsortを使ったのが
そんなに気に入らなかったか、気に障ったか、
ざまぁみろw としか言いようがないが
後出しでケチつけてるのは出題者じゃないようだが
そしたらsortも、そしてminもあえて使わないバージョン、
書き方はいろいろあると思うけど:
>>3 Perl5
use List::Util 'first';
for (<DATA>) {
 my %h = map{lc $_ => 1} /([A-Za-z])/g;
 $a[length $_] = $_ if 26 == keys %h;
}
print first{defined} @a;
__DATA__
The quick brown fox jumps over a lazy dog.
The jay, pig, fox, zebra and my wolves quack!
Pack my box with seven dozen liquor jugs.
The horse, pig, fox, zebra and my wolves quack!
Jackdaws love my small sphinx of quartz.
Jackdaws love my big sphinx of quartz.
The quick brown fox jumps over a lazy cat.
Pack my box with five dozen liquor jugs.
実行結果
~ $ perl 22_3_az26_a.pl
Jackdaws love my big sphinx of quartz.

27:デフォルトの名無しさん
23/08/11 02:52:08.14 45O+1i6X.net
そう、haskellの評価戦略はcall by need (の一種) で必要に応じて展開される、head . sort では 「sortした後の最初の項」を求めているのでそれを出すための必要最小限の事しかしない
件のData.Listにおけるsortでは
①与えられた列を1回目のバスで広義単調増大列いくつかに分割する、コストはO(n)
②できた列を2つずつマージして広義単調増大列の個数を半分にする、全部やればコストはO(n)
③②を列の数が1になるまで繰り返す、コストはO(log(n))
で全部の処理を要求してもO(nlog(n))でいわゆるクイックソートと同じコスト
しかしheadがこのsortの処理を呼ぶ時にはmergeする2列の中の最小値だけ残されてあとは捨てられる、なので最初の①の結果が最悪のケース、長さ1の列がn個できた場合でもmerge処理は最大n-1回だけ行われて終了する、すなわち事実上minimumと一緒
じゃあminimumBy ( on length )でいいじゃんという話なのだけど「遅延評価を利用すればほとんどコストレスでminimumByと同様の事ができる」というのがHaskellの面白いところ
なのでそっちを採用
これは遅延評価の文化に慣れてないと中々わからない

28:デフォルトの名無しさん
23/08/11 07:58:17.97 vOTsx3Ge.net
>>25
そちらのsortはO(nlog(n))なのでダメですね

29:9
23/08/11 08:37:47.88 4P/NDj/+.net
O(nlog(n))がダメかどうかは、データの規模および実行時間による

30:デフォルトの名無しさん
23/08/11 09:12:59.75 BG0MJIEb.net
あかん、通じてないね
時間の無駄やった

31:デフォルトの名無しさん
23/08/11 09:22:47.99 HI+ykM5H.net
Perlな人の短く書ければよいだけで計算量とか知らないだろうから仕方ないと思うよ
しかしHaskellな人がsortを何箇所も使っているのは驚いた
head . sort以外のsortはあかんね

32:デフォルトの名無しさん
23/08/11 09:27:54.00 vdwKG93K.net
お前ら賢いんだから自分も疑え

33:デフォルトの名無しさん
23/08/11 14:03:26.02 v1edpQDw.net
doubt

34:17
23/08/11 16:34:17.24 j3k4ZyED.net
俺は Perl で書いたやつも sort 使わず >>4,5 と同じやり方にした。
一番短い文を最後に出すだけで良いなら sort やる必要ないよね。
何らかの制約があってそうしなければ出来ないとか、使っても思い切り最適化されて最終的に同じ動きになるというなら使うかも知れないが。

35:デフォルトの名無しさん
23/08/11 17:25:08.27 I5t9Gg6x.net
遅延評価は馴染みない人にはわからんからしょうがない

36:デフォルトの名無しさん
23/08/11 17:41:01.68 Nevl7mZs.net
Haskell版で問題にされてるのは
遅延評価でO(n)となるhead $ sort部分ではなく
O(nlog(n))のsortが別途あること

37:デフォルトの名無しさん
23/08/11 22:35:55.39 H5Y2+fuz.net
>>35
遅延評価は色んな言語にあるよ
その対象や動作は各言語や各機能によって様々で
PromiseやFutureのような非同期に遅延評価されるものもあるけど
今回のお題だとC#のLINQメソッドチェーンによる遅延評価やRubyのlazy指定などが有効だね
>>15のRustのイテレータメソッドチェーンも遅延評価されるから何万行の入力が来てもメモリを消費せずに済むね

38:デフォルトの名無しさん
23/08/14 19:55:41.01 KSpEuPpD.net
マサナヲマサナヲマサナヲマサナヲマサナヲマサナヲマサナヲマサナヲ
マサナヲマサナヲマサナヲマサナヲマサナヲマサナヲマサナヲマサナヲ
マサナヲマサナヲマサナヲマサナヲマサナヲマサナヲマサナヲマサナヲ
マサナヲマサナヲマサナヲマサナヲマサナヲマサナヲマサナヲマサナヲ
ヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマ
ヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマ
ヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマ
ヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマ
マサナヲマサナヲマサナヲマサナヲマサナヲマサナヲマサナヲマサナヲ
マサナヲマサナヲマサナヲマサナヲマサナヲマサナヲマサナヲマサナヲ
マサナヲマサナヲマサナヲマサナヲマサナヲマサナヲマサナヲマサナヲ
マサナヲマサナヲマサナヲマサナヲマサナヲマサナヲマサナヲマサナヲ
ヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマ
ヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマ
ヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマ
ヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマ

39:デフォルトの名無しさん
23/08/14 20:16:21.84 29MXQOm3.net
>>38
Java
public class Main {
 public static void main(String[] args) {
  System.out.println(
    "マサナヲ".repeat(8).concat("\n").repeat(4).concat("\n")
      .concat("ヲナサマ".repeat(8).concat("\n").repeat(4).concat("\n"))
      .repeat(2));
 }
}

40:デフォルトの名無しさん
23/08/15 16:29:06.61 eu+UdA0l.net
このサイトより
URLリンク(agora.ex.nii.ac.jp)
2023/8/1/0/0 から 2023/8/16/23/0 まで
表示日時を変更しながら1時間毎の静止気象衛星画像(地球)を収集し
(衛星画像 は 可視光 2048x2048 程度 512x512 等も可 起動オプションで指定出来るとボーナス特典)
gif animation または png animation ファイルに変換せよ


8/14/0/0 URLリンク(agora.ex.nii.ac.jp)
8/15/0/0 URLリンク(agora.ex.nii.ac.jp)
8/15/15/0 URLリンク(agora.ex.nii.ac.jp)

41:デフォルトの名無しさん
23/08/15 23:36:55.46 GhE5EH0z.net
蟻人間がコテハン外したのかな

42:デフォルトの名無しさん
23/08/16 10:34:21.25 tgyEZLGb.net
可視光より赤外線の方が雲はきれいだけど
可視光は影が毎日くるくる回るからこっちはこっちで面白いね

43:9
23/08/16 13:32:44.58 vjpqg3x7.net
>>40 bash、curl および GraphicsMagick の convert コマンドを使用。動作確認したOSはUbuntu 20.04LTS。数百枚のjpegからgifへのconvertには多少時間がかかります。
オプション -h または --highres を指定すると 2048x2048、オプション無しあるいは -l または --lowreso を指定すると 512x512、なおボーナスはスイス銀行の秘密口座に。
※見易くするためインデントは全角スペースに置換してあります。8月16日23時まで取得するようにしているがまだ無い将来の画像は含まない。

res='512x512' # default
OPT=`getopt -o hl -l highreso,lowreso -- "$@"`
eval set -- "$OPT"
while true; do
 case "$1" in
  -h | --highreso)
   res='2048x2048'
   shift ;;
  -l | --lowreso)
   res='512x512'
   shift ;;
  --)
   shift
   break ;;
 esac
done
dir=$(mktemp -d TmpDir.XXXXXX)
for d in $(seq -w 01 16); do
 for h in $(seq -w 0 23); do
  dh="$d$h"
  file="HMW92308${dh}.globe.1.jpg"
  url="URLリンク(agora.ex.nii.ac.jp)
  echo $url; curl -f -s -R -o "$dir/$file" $url
 done
done
#set -x
time convert $(ls $dir/*.jpg) TyphoonAime${res}.gif
ls -o TyphoonAime${res}.gif

44:9
23/08/16 13:42:58.39 vjpqg3x7.net
>>43 typo orz
-h または --highres

-h または --highreso

45:9
23/08/16 19:12:35.95 y9YJABkH.net
>>43 これだと、scriptを実行するたびに全てのjpegファイルをtemporaryディレクトリにdownloadするためサーバの負荷の面で行儀がよくないので、
 ディレクリは TyphoonJpegDir512x512 または TyphoonJpegDir2048x2048 で固定とし、未取得のjpegがあればdownloadするように直すわ。

res='512x512' # default
OPT=`getopt -o hl -l highreso,lowreso -- "$@"`
eval set -- "$OPT"
while true; do
 case "$1" in
  -h | --highreso)
   res='2048x2048'
   shift ;;
  -l | --lowreso)
   res='512x512'
   shift ;;
  --)
   shift
   break ;;
 esac
done
dir=./TyphoonJpegDir${res}
for d in $(seq -w 01 16); do
 for h in $(seq -w 0 23); do
  file="HMW92308${d}${h}.globe.1.jpg"
  url="URLリンク(agora.ex.nii.ac.jp)
  [ -f $dir/$file ] || { echo $url; curl -f -s -R -o "$dir/$file" $url; }
 done
done
#set -x
time convert $(ls $dir/*.jpg) TyphoonAime${res}.gif
ls -o TyphoonAime${res}.gif

※見やすくするためインデントは全角スペースに置換してあります。

46:17
23/08/17 00:52:29.22 YACPkQ1f.net
>>40
Kotlin

ただし paiza.io のサイトの都合で大きい画像の出力がうまく行かないのと時間が掛かるとタイムアウトしてしまうので、
それらを避けるために 2023/08/15~2023/08/16 の8時間間隔(0, 8, 16 時)の画像を収集して 120x120 の大きさに
変更してアニメーションGIFにして出力するようにした。その時に HTML で <img src="data:image/gif;base64,...">
で埋め込んでいるのでHTMLモードで表示させるとブラウザに画像が表示される。スマホでも見てみたがちゃんと
動いている画像で表示された。

URLリンク(paiza.io)

47:デフォルトの名無しさん
23/08/18 10:27:20.40 Rd3M1fjh.net
可視光は globe.0 だな
しかも夜のデータ無いやん

48:デフォルトの名無しさん
23/08/18 11:07:33.13 wx26N4AH.net
>>40
UTC で答えてる人が多いみたいだけど
>例
>8/14/0/0 URLリンク(agora.ex.nii.ac.jp)
JST ですよね

49:デフォルトの名無しさん
23/08/18 17:11:49.56 TT1gR8pP.net
過去未来100年(幅201年)の範囲で
2023年とカレンダーの曜日が一致する年を全て出力せよ
また任意の指定年の前後100年で同じ動作をする(閏年も考慮)ように改変せよ

50:デフォルトの名無しさん
23/08/18 20:03:41.92 Bxqhk529.net
>>49
R
URLリンク(ideone.com)

51:デフォルトの名無しさん
23/08/19 00:14:13.53 Za4r2XUP.net
>>50
曜日をわざわざ求める必要はなかったな。
R 
URLリンク(ideone.com)

52:デフォルトの名無しさん
23/08/19 02:12:13.34 7swIlm9f.net
6,11,11,6,11,11,・・・なんでこうなうの?

53:デフォルトの名無しさん
23/08/19 10:40:53.03 7swIlm9f.net
>>48
JSTだとしたら
>8/15/15/0 URLリンク(agora.ex.nii.ac.jp)

8/15/14/0
じゃないかな
夏時間?

54:む げ
23/08/20 17:53:44.63 yELvYXkhV
初カキコ失礼します
あのさ夏休みの宿題学びポケットとかいうWEB問題サイトに追われてるんだけど
「あと夏休み期間2か」それの自動回答ロボットを作ってくれない
作ってくれたら命に代えても感謝するんだけどなーとか言ってる
冗談じゃなくてまじで追われていて学校退学になりそうだ方まじで助けで,、、、

55:む げ
23/08/20 17:54:11.37 yELvYXkhV
タスケテ>>>

56:デフォルトの名無しさん
23/08/20 20:19:24.17 T0IVLETo.net
>>52
365と366を7で割った余りは1と2なので、平年には翌年の元日の曜日が1つ進み、閏年には2つ進む。
100の倍数の年の例外を除けば、曜日の進みは1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2, ...のように
1, 1, 1, 2というパターンの繰り返しになる。
パターン1, 1, 1, 2のうちの最初の1の年から始めて、何年後に曜日の進みの累積が7の倍数かつ
その年が閏年でなくなるかを順々に求めれば6, 11, 11年後となり、ここでパターン1, 1, 1, 2の
うちの最初の1の年に戻るので、以降は6, 11, 11年後というパターンの繰り返しになる。
      ┌─────┐
      │          ↓
①①①❷①①①❷①①①❷①①①❷①①①❷①①①❷①①①❷①①①❷
│     ↑          │          ↑
└───┘          └─────┘

57:蟻人間 ◆T6xkBnTXz7B0
23/08/20 21:28:53.42 KEiNPJgB.net
お題: お風呂の準備。
容積225Lの浴槽に適温39度のお湯200Lを用意したい。
次の2つのスイッチのON/OFFを切り替えてお湯を用意するプログラムを作れ。
スイッチ1: これをONにすると浴槽に水温20度の水を分速10Lで投入する。
スイッチ2: これをONにすると浴槽の水を800ワットの電熱線で加熱する。
ただし、浴槽に容積の1/2以上の水またはお湯が入っていないときは、空焚き防止のため、加熱しないものとする。
放熱は考慮しなくてもよい。
出力例)
時刻??: スイッチ1をONにしました。
時刻??: スイッチ2をONにしました。
時刻??: お風呂ができました。
時刻??: スイッチ1をOFFにしました。
時刻??: スイッチ2をOFFにしました。

58:17
23/08/20 22:57:39.22 pbHEs6OP.net
>>49
Kotlin
折角なので Iterator で作った。(でも AbstractIterator クラス使ったので特に苦労はしていない)
URLリンク(paiza.io)

59:17
23/08/20 23:07:16.25 pbHEs6OP.net
>>57
800Wの電熱線で加熱するとどれだけの量の水がどのぐらいの時間で1度上がるか、など、基本的な事が分からない。

60:デフォルトの名無しさん
23/08/21 05:17:48.42 9NybdpKD.net
>>58
200年分のデータを配列を貯め込む>>51の方法よりも
そのようなメモリ消費を必要としないイテレータを作る案は好ましい方法ですね
しかし-100や+100は今回たまたまのマジックナンバーに過ぎないですし
例えばお題が「指定した年とその後(またはそれ以前に)同じカレンダーになる年を100個求めよ」もありえます
したがって作成しておくべき汎用イテレータは指定した年から順方向に返すイテレータと逆方向に返すイテレータでしょう
それがあれば今回のお題を含めた様々なバリエーションのお題に対応できると思います

61:デフォルトの名無しさん
23/08/21 10:53:53.65 qNeGin4f.net
>>60へのお題
指定した年とその後(またはそれ以前に)同じカレンダーになる年を100個求めよ

62:デフォルトの名無しさん
23/08/21 12:55:28.09 tqXtwiP4.net
// Rust 双方向イテレータ版
struct SameCalendarYear(u32);
impl Iterator for SameCalendarYear {
 type Item = u32;
 fn next(&mut self) -> Option<u32> {
  common_next(self.0, false).map(|year| { self.0 = year; year })
 }
}
impl DoubleEndedIterator for SameCalendarYear {
 fn next_back(&mut self) -> Option<u32> {
  common_next(self.0, true).map(|year| { self.0 = year; year })
 }
}

fn common_next(start_year: u32, is_before: bool) -> Option<u32> {
 let mut day = 0;
 let mut year = start_year;
 while year > 0 {
  if is_before { year -= 1; }
  day += 1 + leap(year);
  if day >= 7 { day -= 7; }
  if !is_before { year += 1; }
  if day == 0 && leap(year) == leap(start_year) {
   return Some(year);
  }
 }
 None
}

fn leap(year: u32) -> u32 {
 (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) as u32
}

63:デフォルトの名無しさん
23/08/21 12:57:26.59 tqXtwiP4.net
>>61
指定した年と同じカレンダーの年を前後 n 個表示
(長くなるので今回は10個だけ表示)

fn main() {
 let n = 10;
 for year in [2000, 2023, 2024, 2025, 2100] {
  println!("{year}年より前: {:?}", SameCalendarYear(year).rev().take(n).collect::<Vec<_>>());
  println!("{year}年より後: {:?}", SameCalendarYear(year).take(n).collect::<Vec<_>>());
 }
}

このRust公式の実行環境で実行やコード編集ができます
URLリンク(play.rust-lang.org)

// 実行結果
2000年より前: [1972, 1944, 1916, 1876, 1848, 1820, 1780, 1752, 1724, 1684]
2000年より後: [2028, 2056, 2084, 2124, 2152, 2180, 2220, 2248, 2276, 2316]
2023年より前: [2017, 2006, 1995, 1989, 1978, 1967, 1961, 1950, 1939, 1933]
2023年より後: [2034, 2045, 2051, 2062, 2073, 2079, 2090, 2102, 2113, 2119]
2024年より前: [1996, 1968, 1940, 1912, 1872, 1844, 1816, 1776, 1748, 1720]
2024年より後: [2052, 2080, 2120, 2148, 2176, 2216, 2244, 2272, 2312, 2340]
2025年より前: [2014, 2003, 1997, 1986, 1975, 1969, 1958, 1947, 1941, 1930]
2025年より後: [2031, 2042, 2053, 2059, 2070, 2081, 2087, 2098, 2110, 2121]
2100年より前: [2094, 2083, 2077, 2066, 2055, 2049, 2038, 2027, 2021, 2010]
2100年より後: [2106, 2117, 2123, 2134, 2145, 2151, 2162, 2173, 2179, 2190]

64:蟻人間 ◆T6xkBnTXz7B0
23/08/21 15:10:32.39 GU1DZq8L.net
>>59
中学校の物理で習うはずなんだけどなあ。忘れたか。
URLリンク(chuugakurika.com)

65:デフォルトの名無しさん
23/08/21 22:02:18.08 s7o0Gu1A.net
>>61
R
URLリンク(ideone.com)

66:デフォルトの名無しさん
23/08/24 05:04:40.60 UkV1PQmo.net
お題:2Dゲームのスクロール処理
整数の二次元配列(高さ50, 横幅100)上にランダムに整数1〜9が200個配置される。
この配列を高さ20, 横幅40の矩形領域に切り取って表示したい。キーボードの入力(l, r, t, b)で矩形領域を移動させ切り取る領域を変化させよ。

67:デフォルトの名無しさん
23/08/24 08:57:28.75 a6n854uv.net
>>66
試しに自分で書いてどんなプログラムになるのか見せてくれ

68:デフォルトの名無しさん
23/08/24 22:51:17.82 hcnR5QOK.net
>>66
PowerShell (等幅フォント限定。最初は一番左上の領域が表示される。qキーで終了。Ubuntu版ではカーソルが消えない)
$a = random (1..9999) -count 200 |% {$_ % 9 + 1}
$b = random (0..4999) -count 200
$c = [char[][]](,(," " * 100) * 50)
0..199 |% {$c[[Math]::Floor($b[$_] / 100)][$b[$_] % 100] = [string]$a[$_]}
$L = 0..49 |% {-join $c[$_]}
$UI = $Host.UI.RawUI
$p, $s = $UI.CursorPosition, $UI.CursorSize
$p.y = [Math]::Min($p.y, $UI.BufferSize.Height - 23)
$x = $y = 0
$border = "+" + "-" * 40 + "+"
while ($true) {
   try {$UI.CursorSize = 0} catch {}
   $UI.CursorPosition = $p
   $border
   0..19 |% {"|" + $L[$y + $_].SubString($x, 40) + "|"}
   $border
   switch ($UI.ReadKey(6).Character) {
     "l" {if ($x -gt +0) {$x--}}
     "r" {if ($x -lt 60) {$x++}}
     "t" {if ($y -gt +0) {$y--}}
     "b" {if ($y -lt 30) {$y++}}
     "q" {try {$UI.CursorSize = $s} catch {} return}
   }
}

69:デフォルトの名無しさん
23/08/25 00:19:01.99 P3glK3pZ.net
お題:ウィンドウのアラインメント処理
マウスの座標の変化からウインドウを描画すべき座標を計算したい。
ただし変形する形は縦横4方向、斜め4方向の8パターンとし、寄せた方向に幅が1/2となること。

70:デフォルトの名無しさん
23/08/25 14:02:15.09 5+gJach+.net
>>66-67
OpenCVのROI便利だよな

71:デフォルトの名無しさん
23/08/26 14:14:02.40 EQIr/PqP.net
世界で最初の月曜日ってどうやって決まったの?

72:17
23/08/26 14:42:38.00 Wr5tcJsi.net
曜日はシュメール人が使い始めたらしいので、お近くのシュメール人に聞きください。

73:デフォルトの名無しさん
23/08/26 20:03:48.42 LJcWLtrE.net
文字列Sの中に含まれる回文をすべて列挙ってどうやったらいいですかね(*_*)
aとかbみたいな一文字でも回文とみなしますです
文字列Sは1文字以上100文字以下で、半角英字であることがわかってます

とんでもない計算量になる気がするのですが、鮮やかなやりかたってないものかと…トホ(ヽ´ω`)

74:17
23/08/26 22:26:37.90 Wr5tcJsi.net
>>73
それって例えば "ABCBAXYZZYX" だったら "ABCBA" と "XYZZYX" が抜き出せれば良いの?
途中の "BCB", "C", "YZZY", "ZZ" も抜き出すの?

75:蟻人間 ◆T6xkBnTXz7B0
23/08/26 23:04:31.69 JYg5slq9.net
回文の長さに制限があるから、回文の長さで場合分けすれば、全部列挙可能。

76:デフォルトの名無しさん
23/08/26 23:09:39.72 jGmIYD91.net
>>74
途中のもぜんぶっす…
含まれる回文、ひとつのこらず出力です(;´∀`)
たとえAとかBみたいな一文字でも回文と定義します

なのでAとかXも抜き出します٩(′д‵)۶
で、一文字目にAがあって、5文字目にもAがあるじゃないですか?こういった場合は、どっちも出力しちゃって大丈夫です!
重複された出力が行われるのは問題ないんです!
ただ、「過去にすでにその分の出力が行われていた場合、重複した出力を再度行わない」というやりかたでもし計算量が飛躍的に下がるということであれば、そのやりかたが知りたいというのもまああります(*_*;
重複する出力をするかしないか、それはどちらでもオケーです

全パターンチェックするようにループ回すならとりあえず理屈ではできると思うんですが、計算量がとんでもないことになりそうな感じで、ちょっとお手上げでした/(^o^)\

77:デフォルトの名無しさん
23/08/26 23:20:42.48 jGmIYD91.net
たとえば文字列Sがabbbaだとすると、すくなくともa,b,bb,bbb.abbbaが最低一回は出力される必要があります

できればaやbが複数回出力されず一回しか出力されないほうがいいですが、必須ではないです

78:蟻人間 ◆T6xkBnTXz7B0
23/08/26 23:29:51.32 JYg5slq9.net
>>73 C++
#include <stdio.h>
bool is_kaibun(const char *str, size_t len)
{
for (size_t i = 0; i < len/2; i++)
if (str[i] != str[len - i - 1]) return false;
return true;
}
void detect_kaibun(const char *str, size_t len)
{
for (size_t klen = 1; klen <= len; klen++)
{
for (size_t i = 0; i < len - klen + 1; i++)
if (is_kaibun(str + i, klen))
printf("%*s\n", (int)klen, str + i);
}
}
int main(void)
{
detect_kaibun("ABCBCXC", 7);
return 0;
}

79:蟻人間 ◆T6xkBnTXz7B0
23/08/26 23:37:32.47 JYg5slq9.net
>>78 間違えた。
printf("%*s\n", (int)klen, str + i);

printf("%.*s\n", (int)klen, str + i);
に訂正。

80:デフォルトの名無しさん
23/08/26 23:40:14.43 jGmIYD91.net
>>79
ありがとうございます、ちょっとためしてみますm(_ _)m

81:デフォルトの名無しさん
23/08/26 23:44:49.05 M8vKemPr.net
連続部分列 URLリンク(en.m.wikipedia.org)
部分列 URLリンク(judge.u-aizu.ac.jp)

82:デフォルトの名無しさん
23/08/27 00:17:21.22 3rRjeZjU.net
>>79
動いている様子を確認させていただきました!!ありがとうございました!

当チケットはこれにてクローズとさせていただきたいと思いますヽ(=´▽`=)ノ

83:デフォルトの名無しさん
23/08/27 01:14:16.06 xDzSjAxc.net
>>78
こうすると計算量を減少できる

fn len_of_eq(s: &str, index: usize, even: usize) -> usize {
 let mut len = 0;
 for (p, q) in std::iter::zip(s[(index + even)..].chars(), s[0..=index].chars().rev()) {
  if p != q {
   break;
  }
  len += 1;
 }
 return len;
}

fn print_kaibun(s: &str) {
 for index in 0..s.len() {
  for even in 0..=1 {
   for len in 1..=len_of_eq(s, index, even) {
    let first = index + 1 - len;
    let last = index + len - 1 + even;
    println!("{first}~{last}: {}", &s[first..=last]);
   }
  }
 }
}

fn main() {
 print_kaibun("ABCBAXYZZYX");
}

84:デフォルトの名無しさん
23/08/27 01:16:42.56 xDzSjAxc.net
まずこの部分が最初のヒントで

>>それって例えば "ABCBAXYZZYX" だったら "ABCBA" と "XYZZYX" が抜き出せれば良いの?
>>途中の "BCB", "C", "YZZY", "ZZ" も抜き出すの?
>途中のもぜんぶっす…

最も長いものを抜き出せばその一部分はその中に含まれている
だから短いのが判明した時点で引き続き長いのも探索しないと多重に無駄に比較が行なわれてしまう

もう一つのポイントは回文は対称系で長さ奇数と偶数の二種類があること
長さ奇数「DCBABCD」と長さ偶数「DCBAABCD」どちらの場合も
比較は対称点となるAからのみ出発して比較していけばよくて
順方向&逆方向へ最長分を比較していけば上述の無駄な比較を減らせる

このような順番で見つかっていくことになる
>>83の実行結果
0~0: A
1~1: B
2~2: C
1~3: BCB
0~4: ABCBA
3~3: B
4~4: A
5~5: X
6~6: Y
7~7: Z
7~8: ZZ
6~9: YZZY
5~10: XYZZYX
8~8: Z
9~9: Y
10~10: X

85:17
23/08/27 05:51:19.72 A+RJ0qtc.net
>>82
ここはお題スレなのでクローズはない。

86:17
23/09/07 20:20:41.05 HlrfnodH.net
>>73
Kotlin
URLリンク(paiza.io)

87:デフォルトの名無しさん
23/09/20 14:42:58.26 I55f6i4N.net
お題
abc1.mp4 abc2.mp4 .. abc20.mp4があるとします
これを名前順でソートできるようにするため
abc001.mp4 abc002.mp4 ... abc020.mp4
とリネームしてください

88:デフォルトの名無しさん
23/09/20 18:43:20.77 DIo9fsPi.net
コレでどーかぬ
#!/bin/bash
# ファイル名のプレフィックス
prefix="abc"
# ソート対象のファイルリストを取得
file_list=$(ls ${prefix}*.mp4 | sort)
# ファイルを001、002、...の形式にリネーム
counter=1
for file in $file_list; do
new_name=$(printf "${prefix}%03d.mp4" $counter)
mv "$file" "$new_name"
counter=$((counter + 1))
done

89:デフォルトの名無しさん
23/09/20 18:50:38.69 I55f6i4N.net
いいだしっぺということで作ってきたら既に投稿が
printfするところは一緒ですね
bash,勉強になります
haskell
import Text.Printf
import System.IO
import System.Directory
import System.FilePath.Glob
import Data.List
import Control.Monad
kaku = ".mp4"
fn = "abc"
main = do
files <- glob (fn <> "*" <> kaku)
zipWithM_ (\a b -> renameFile a b) files (map f files)
where
f l =
let r1 = reverse $ takeWhile ((/=) '/') $ reverse l in
let r2 = (r1 \\ fn) \\ kaku in
fn <> printf "%03d" (read r2 :: Int) <> kaku

90:デフォルトの名無しさん
23/09/22 11:23:46.58 R2SvRL0Z.net
お題:celeronで快適に動作するwebブラウザを作れ

91:9
23/09/22 16:53:16.55 8M97O6g7.net
>>87 Perl5
rename "abc$_.mp4", sprintf 'abc%03d.mp4',$_ for 1..20;
※abc1.mp4 abc2.mp4 .. abc20.mp4 があるとしています。
 また abc001.mp4 abc002.mp4 ... abc020.mp4 は既存かのチェックは省いています。

92:デフォルトの名無しさん
23/09/22 17:31:41.64 fCKJ4NGF.net
すごい簡潔ですね!perlすごい
これはワンライナーではないのでしょうか
#!/usr/bin/perl
..
としてperl rename.plを動かすと動きました
ファイルはこれ(bash)で用意できます
for i in {1..20}; do touch abc$i.mp4; done

93:デフォルトの名無しさん
23/09/22 20:45:10.11 CSDqgjJn.net
tcsh のバヤイわこうかぬ
foreach i (`seq 1 20`) # 1から20までの数値を生成
# ファイル名を生成し、touchコマンドでファイルを作成
set filename = "abc$i.mp4"
touch $filename
end

94:17
23/09/24 00:36:54.25 FZ40Ia2p.net
>>87
Kotlin
URLリンク(paiza.io)

95:17
23/09/24 00:44:46.90 FZ40Ia2p.net
1~20を決め打ちして良いならもっと簡単にできたな。まあいいや。

96:デフォルトの名無しさん
23/09/24 01:16:14.31 nC1Pu7Ba.net
>>94
なかなかおもろいサイトやぬ

97:デフォルトの名無しさん
23/09/24 01:37:34.83 XDqOvN5B.net
>>87 haskellで再投稿
URLリンク(ideone.com)

98:デフォルトの名無しさん
23/09/26 17:04:35.08 lhHS5sJh.net
お題:32ビット浮動小数点数のnextafter()
32ビット精度(IEEE754のbinary32)の変数aを
64ビット精度(IEEE754のbinary64)の変数bに代入する。
ここで、nextafterf(a, 0)やnextafterf(a, 正の無限)などに相当する操作を
bに対して行え(bを32ビット浮動小数点数に戻すのは無しで)。
操作結果のoverflowやunderflowは考慮しなくてもよい。

99:デフォルトの名無しさん
23/09/27 11:02:54.03 Jpj1XONB.net
お題:日本語の文章が入力されるので「、」をカンマに、「。」を改行に変換せよ

100:デフォルトの名無しさん
23/09/27 11:36:52.67 uGji0T93.net
Python

s = input()
s = s.replace("、", ",")
s = s.replace("。", "\n")
print(s)

101:デフォルトの名無しさん
23/09/27 13:01:54.91 9Ywamwi5.net
Haskell

import Data.List.Utils

main = do
s <- getContents
putStrLn $ replace "。" "\n" $ replace "、" "," s
コンパイルはしてないので動かないかも

102:デフォルトの名無しさん
23/09/27 20:48:13.39 hJUMqAFS.net
>>99
R
URLリンク(ideone.com)

103:デフォルトの名無しさん
23/09/28 08:18:15.29 q8VwFY1b.net
お題
文字列S=abcdefghij(10文字)が与えられて
配列[0,4,7]が与えられる
このときSの0番目を4番目、4番目を7番目、7番目を0番目に移動した文字列を出力するプログラムを書いてください

104:デフォルトの名無しさん
23/09/28 09:17:20.57 iiudb0JA.net
>>103 lisp
URLリンク(www.ideone.com)

105:デフォルトの名無しさん
23/09/28 13:09:43.08 tckV2TlV.net
>>103 Ruby
文字列S='abcdefghij'
配列=[0,4,7]
文字列 = 文字列S.dup
配列.zip( 配列.rotate ).each{|i,j| 文字列[i] = 文字列S[j] }
puts 文字列

106:蟻人間 ◆T6xkBnTXz7B0
23/09/28 13:15:33.53 eLIN3EHU.net
お題: コンソールに指定したUTF-8文字列のQRコードを表示するプログラム。

107:デフォルトの名無しさん
23/09/28 14:55:17.75 7+/lnWbq.net
use std::io::{stdin, Read};
use std::error::Error;
use qrcode::QrCode;

fn read() -> Result<String, Box<dyn Error>> {
Ok(stdin().lock().bytes().map(|c| c.expect("char") as char).collect())
}

fn main() -> Result<(), Box<dyn Error>> {
let qr = QrCode::new(read()?.as_bytes())?;
let s = qr.render().light_color(' ').dark_color('#').build();
println!("{}", s);
Ok(())
}

108:蟻人間 ◆T6xkBnTXz7B0
23/09/28 21:17:30.48 yc7Vl2N1.net
お題: 指定されたフォントのひらがなの各文字について
ひらがなの線に囲まれて閉じた領域の個数を調べ、最もその個数の多い文字ベスト3を出力せよ。

109:デフォルトの名無しさん
23/09/28 22:53:24.99 8VuS2PIw.net
自分でやれ
いやできないかすまん

110:デフォルトの名無しさん
23/09/28 22:59:15.05 isk1iJ0r.net
pythonならcv2使ってやるかな

111:17
23/09/29 10:58:18.12 eBy6R6wt.net
>>99
bash のコマンドラインで以下のように入力すると標準入力から入力して「、」が「,」に、「。」が改行に変換されて標準出力に出力される。
(起動する環境は bash でなければならないということはないと思うが、他のシェルは確認していない)。

sed 's/、/,/g;s/。/\n/g'

もちろん日本語入出力可能な端末を使用して、尚且つ sed がその入力をまともに受け付けてくれなければちゃんと動かない。

112:デフォルトの名無しさん
23/09/29 11:02:02.85 F8aJXNq9.net
お題: 指定されたフォントのひらがなの各文字について
ひらがなの線に囲まれて閉じた領域の面積を調べ、各文字毎にそれぞれの面積の順序を最も大きい物から順に出力せよ。
またその情報を元に輪郭のhierarchy情報をcv2で利用出来る形で出力せよ

113:デフォルトの名無しさん
23/09/30 17:32:44.04 xxjzuZuq.net
お題
文字列が入力されます
赤と緑を入れ替えて
黒と白を入れ替えて
黄と青を入れ替えてください

入力: 緑のカバンに500万入れて白の紙で黄色のカバン言うて書きながら赤のカバン言いながら置いてくれたら俺黒のカバン言いながら取りに行くわ
出力: 赤のカバンに500万入れて黒の紙で青色のカバン言うて書きながら緑のカバン言いながら置いてくれたら俺白のカバン言いながら取りに行くわ

114:デフォルトの名無しさん
23/09/30 18:00:29.42 oqu6hf3+.net
>>113 node
const swap = (text, [w1, w2]) => text.split(w1).map(v => v.replaceAll(w2, w1)).join(w2)
const swapAll = (text, rules) => rules.reduce(swap, text)
const text = '緑のカバンに500万入れて白の紙で黄色のカバン言うて書きながら赤のカバン言いながら置いてくれたら俺黒のカバン言いながら取りに行くわ'
const rules = [['赤', '緑'], ['黒', '白'], ['黄', '青']]
const replaced = swapAll(text, rules)
// console.log(replaced)
console.log(replaced === '赤のカバンに500万入れて黒の紙で青色のカバン言うて書きながら緑のカバン言いながら置いてくれたら俺白のカバン言いながら取りに行くわ')
// true

115:デフォルトの名無しさん
23/09/30 19:24:03.19 t2v1jL5l.net
>>113
R
URLリンク(www.ideone.com)

116:デフォルトの名無しさん
23/09/30 20:00:09.54 iuoy3pEW.net
>>113 ウェブブラウザのJavaScript
URLリンク(pastebin.com)
ユーザースクリプトの体裁で書いたけどブラウザーのConsoleでも動かせる
Firefox: Ctrl+Shift+K
Chrome: Ctrl+Shift+J
スレリンク(tech板:113番) を開いてそこで実行
結果はレスに直接追記
重複がないからXPathのtranslate()でいけるな思った、それだけ

117:17
23/10/02 01:36:39.53 hWT/DRlk.net
>>103
Kotlin
URLリンク(paiza.io)

118:17
23/10/02 01:52:26.35 hWT/DRlk.net
>>106
1. qrencode というプログラムをインストールする。(例: RedHat系Linuxなら yum install qrencode)
2. qrencode で出力に ansi 等を指定して文字列で出力する。
例: qrencode -t ansi やっほー
3. 画面に出て来たQRコードをスマホで撮影する等して確認する。
4. 終わり。

119:デフォルトの名無しさん
23/10/02 11:46:19.28 0odvDMYE.net
>>118
よくできました
蟻ポイント30

120:デフォルトの名無しさん
23/10/06 16:54:06.65 jg1c5xSH.net
[クライシスアクター」「豊島保養所」←画像検索&拡散!

他スレに丸ごとコピペよろしっく!!
ネットでできる反レプティリアン・反イルミ活動です!!!!!
動画サイトのコメ欄もねらい目だぞーーーー!!!!!!!

121:デフォルトの名無しさん
23/10/06 16:54:28.09 jg1c5xSH.net
[クライシスアクター」「豊島保養所」←画像検索&拡散!

他スレに丸ごとコピペよろしく!!
ネットでできる反レプティリアン・反イルミ活動です!!!!!
動画サイトのコメ欄もねらい目だぞ!!!!!!!

122:デフォルトの名無しさん
23/10/08 19:28:55.20 faQf3SiN.net
お題:n階建てのビルに定員4人のエレベーターがある。エレベーターは各階でボタンが押されるとその階に向かう。住人達はエレベータを呼んで乗るとエレベーター内で次に向かう階へのボタンを押す。ボタンを押すのは乗員全員である。乗るのを待っている住人が定員より多かった場合、エレベーターは乗れなかった住人を優先的に回収する。住人は列の先頭から順番にエレベーターに乗り込む。エレベーターは乗員を降ろしている間に住人を追加で乗せることはなく、すべての乗員を降ろしてから次の住人の回収に向かうものとする。

もっとも効率がいいエレベーターの停止順序を求め、入力に対して停止階のリストを出力せよ。
エレベーターの初期位置は1階とする。

入力
階数
乗員数 住人たちがいる階 乗員iが向かう階 乗員iが向かう階 …
5
1 1 5
2 4 3 2
3 2 1 3 5

出力
停止階 停止階 …
1 5 4 3 2 1 3 5

入力
10
5 1 1 2 3 4 4
9 4 10 10 10 1 8 6 6 6 5

出力
1 2 3 4 1 4 1 10 4 6 8 4 5

123:9
23/10/08 20:24:03.46 zYJ3wh+h.net
>>122
「もっとも効率がいいエレベーターの停止順序」とは?
1.停止回数がもっとも少ない
2.移動した階数の和が最も小さい
3.ほか
など、どのような指標?

124:デフォルトの名無しさん
23/10/09 13:56:36.62 V7NN5mnX.net
>>123
2.移動した階数の和が最も小さい

125:デフォルトの名無しさん
23/10/09 19:10:41.03 5dE8x2G+.net
>>87
C#
URLリンク(paiza.io)

126:デフォルトの名無しさん
23/10/09 22:18:18.11 5dE8x2G+.net
>>113
C#
URLリンク(paiza.io)

127:デフォルトの名無しさん
23/10/12 11:02:46.67 u59ybXeV.net
スイカゲームを自動操縦するプログラムを造れ

128:デフォルトの名無しさん
23/10/12 12:31:12.32 hnj5q8Ch.net
while (true) push(BUTTON_A)

129:デフォルトの名無しさん
23/10/14 00:00:08.85 sMwx6jpS.net
お題:角カッコの列が入力されるのでカッコの対応が取れていたら1,取れていなかったら0と表示せよ

< [[]]
> 1

< [[]
> 0

130:17
23/10/14 02:22:24.53 BgrcFKKf.net
>>129
Perl

bash 等のシェルのコマンドラインで以下のように入力すると標準入力から入力して結果を標準出力に出力する。

perl -ne '$n=0;while(/(.)/g){if($1eq"["){$n++}elsif($1eq"]"){$n--}}$f=$n==0?1:0;print"$f\n"'

実行例
[[]]
1
[[]
0
[[[[]][[]]]
0
[[[[]][[]]]]
1

131:17
23/10/14 04:16:14.71 BgrcFKKf.net
>>113
Kotlin
URLリンク(paiza.io)

132:デフォルトの名無しさん
23/10/14 10:19:17.10 BRbCCPQd.net
>>129 Ruby
%W( [[]] [[] [[[[]][[]]] [[[[]][[]]]] ][ #{} ).each{|s|
w = s.dup
{} while w.sub!( /\[\]/, '' )
puts "#{(s != '' && w == '')? 1 : 0} #{s.inspect}"
}
# 1 "[[]]"
# 0 "[[]"
# 0 "[[[[]][[]]]"
# 1 "[[[[]][[]]]]"
# 0 "]["
# 0 ""

133:デフォルトの名無しさん
23/10/14 22:38:53.08 5dUK8HoW.net
>>129
C#
URLリンク(paiza.io)

134:デフォルトの名無しさん
23/10/16 08:51:26.93 kgcCjrnK.net
1)
BY
RG
2)
RG
BY
3)
GR
YB
1-3を回転対称で同じとみなせるグループと線対称で同じとみなせるグループに分類せよ
4色を2x2の升にランダムに一つづつ配置して4x3x2通りのパターンを作成し
それぞれを上の基準でグループ分けせよ

135:デフォルトの名無しさん
23/10/17 07:02:57.86 InaHR8fg.net
>>134 Ruby
URLリンク(ideone.com)

136:デフォルトの名無しさん
23/10/18 20:40:59.79 4ifgnZXl.net
お題:Pythonのmath.ulp()と同機能の関数
引数が正規化数限定のサブセットでも可(その旨を明記)。
Pythonで実装する場合は(もちろん)math.ulp()を使ってはならない。

137:134
23/10/18 20:46:23.24 4ifgnZXl.net
簡単なお題:
>>135のサブセット(求めたulpも正規化数限定)

138:デフォルトの名無しさん
23/10/18 20:56:02.06 L3TY2GGf.net
import struct
def my_ulp(x):
# 浮動小数点数xをバイト列に変換
b = struct.pack("d", x)
# バイト列を整数に変換
i = int.from_bytes(b, "little")
# 符号部(1ビット)を取り出す
s = i >> 63
# 指数部(11ビット)を取り出す
e = (i >> 52) & 0x7ff
# 仮数部(52ビット)を取り出す
m = i & 0xfffffffffffff
# 指数部が0や最大値ならエラー
if e == 0 or e == 0x7ff:
raise ValueError("x is not a normalized number")
# 仮数部の最下位ビット(1ビット)を求める
lsb = m & 1
# 符号部と指数部を元に戻す
i = (s << 63) | ((e - lsb) << 52)
# 整数をバイト列に変換
b = i.to_bytes(8, "little")
# バイト列を浮動小数点数に変換
return struct.unpack("d", b)[0]

139:134
23/10/18 21:44:13.43 4ifgnZXl.net
>>137
間違えましたorz

140:134
23/10/18 21:52:04.82 4ifgnZXl.net
>>138
math.ulp()は符号を戻さないらしいです:
ulp(1) == ulp(-1)

141:デフォルトの名無しさん
23/10/21 04:08:56.28 TaroWUwV.net
お題:文字列「せんだ」「みつを」「ナハナハ」がランダムに100行入力される。せんだ、みつを、ナハナハが順番に入力されたときに1と一行出力せよ

142:デフォルトの名無しさん
23/10/21 23:03:24.39 x0YGunAE.net
>>141
C#
URLリンク(paiza.io)

143:デフォルトの名無しさん
23/10/25 07:23:48.08 gFkqcLnH.net
お題:
(1)Python3.12以降の、math.nextafter()のサブセット
(実装はPythonでなくても構いません)
64ビット長程度の整数iを引数として、
a)iがゼロ:foo(i) = 0.0
b)i > 0:foo(i) = nextafter(0, inf, steps=i)
c)i < 0:foo(i) = nextafter(0, -inf, steps=-i)
を満たすfoo()を書く。
Python3.12を使う場合は、nextafter()を使ってはならない。
(2)(1)の逆関数。

144:141
23/10/25 07:27:56.03 gFkqcLnH.net
補足:(1)(2)いずれも実用的な時間内で求める事(steps=1相当のnextafter()をループで回すのは不可)。

145:デフォルトの名無しさん
23/10/25 12:47:47.78 Bgy3SEXp.net
なんだnextafterって

146:141
23/10/25 23:22:03.23 gFkqcLnH.net
>>145
nextafter()は、浮動小数点数の、(数直線上での)「隣」を求めるやつですね(C99以降?)。
Python3.12のやつは、隣の隣の隣の…を求める事が出来る様に拡張されました。

147:21-923
23/10/26 00:31:46.93 7aLp+Ojb.net
前スレの補足:
V8やLLVMは、自前でstrtod()的なものを実装してました。
URLリンク(arxiv.org)

148:デフォルトの名無しさん
23/10/28 20:54:22.44 U0JINWpQ.net
>>103 octave
URLリンク(ideone.com)
function s = f(s, i)
s(circshift(i, -1, 2)) = s(i);
end

>>129 ocaml
URLリンク(ideone.com)
let chars s =
let rec aux acc i =
if i < 0 then acc else aux (s.[i] :: acc) (i - 1)
in aux [] ((String.length s) - 1)
let f s =
let rec aux = function
([], []) -> 1
| (_, []) -> 0
| ('['::bs, ']'::cs) -> aux (bs, cs)
| (bs, c::cs) -> aux (c::bs, cs)
in aux ([], (chars s))

149:デフォルトの名無しさん
23/10/31 00:00:13.24 mywig6Xf.net
>>3 c
URLリンク(ideone.com)
int has26(const char *p) {
int c, count[26] = {0};
for (; c = tolower(*p); p++) if (isalpha(c)) count[c - 'a']++;
for (c = 'a'; c <= 'z'; c++) if (count[c - 'a'] < 1) return 0;
return 1;
}
const char *f(const char **lines, int n) {
const char *found = 0;
int i, len, minlen;
for (i = 0; i < n; i++)
if (has26(lines[i]))
if (!found)
found = lines[i], minlen = strlen(lines[i]);
else if (len = strlen(lines[i]) < minlen)
found = lines[i], minlen = len;
return found;
}

150:デフォルトの名無しさん
23/11/02 14:01:24.52 4TnUpiLT.net
お題
URLリンク(i.imgur.com)

151:17
23/11/05 02:55:01.08 w6RhJs5K.net
>>150
ChatGPT にそのままテキストを読ませたらこう答えた。
-------------------------------------------------------------------------------------------------
通学に自転車を使わない学生は34人、自転車を使うがバスを使わない学生は39人、バスを使うが自転車を使わない学生は18人です。
100人の学生全体からこれらの人数を引いた残りの学生がバスと自転車の両方を使っている学生の数です。
100人 - 34人 (自転車を使わない学生) - 39人 (バスを使わない学生) - 18人 (自転車を使わない学生) = 9人
したがって、通学にバスと自転車の両方を使う学生は9人です。
-------------------------------------------------------------------------------------------------
ここで徒歩については考慮しないのかとツッコミを入れたらこう答えた。
-------------------------------------------------------------------------------------------------
申し訳ありません、徒歩の学生についての情報が提供されていなかったため、上記の計算では徒歩を選択した学生については考慮されていませんでした。徒歩を選択した学生の数についての情報がなければ、バスと自転車の両方を使う学生の正確な数を計算することはできません。
-------------------------------------------------------------------------------------------------

152:17
23/11/05 02:58:00.24 w6RhJs5K.net
そして更にこういうツッコミを入れる。
最初の34人は自転車を使っていないだけで密かにバスを使っているかも知れないのだが、そのことは考慮しないのか?
ChatGPT
申し訳ありません、私の以前の回答は不完全でした。確かに、最初の34人のうち自転車を使っていないという情報だけでは、彼らがバスを使っているかどうかを確定することはできません。そのため、正確な答えを得るためには追加の情報が必要です。
もし最初の34人のうち何人かが実際にはバスを利用している場合、それを考慮する必要があります。与えられた情報だけからは、バスと自転車の両方を使う学生の正確な数を特定することはできません。必要な情報が揃わない限り、正確な答えを提供することはできません。

153:デフォルトの名無しさん
23/11/06 00:02:49.99 fuk9k4cf.net
お題:単方向リストを逆順にせよ

154:デフォルトの名無しさん
23/11/06 00:48:06.04 uPzAm2Gi.net
>>153
Java
URLリンク(paiza.io)

155:デフォルトの名無しさん
23/11/11 20:39:33.71 iU/7lT3J.net
>>87
Ruby で作った。
FileUtils::DryRun を使っているので、実際には変更されません

require 'fileutils'

HEAD = 'abc' # 先頭文字
EXT = '.mp4' # 末尾の拡張子
HEAD_LEN = HEAD.length # 3文字
EXT_LEN = EXT.length # 4文字

# 絶対パスのディレクトリ名の後ろに、* を付けること!
# . で始まる、隠し directory, file を除く
glob_pattern = "C:/Users/Owner/Documents/test/*#{ EXT }"
target_dir = File.dirname( glob_pattern ) # ディレクトリパスだけを取り出す

# 元のファイル名の配列
fname_src_ary = Dir.glob( glob_pattern )
.select { |full_path| File.file?( full_path ) } # ファイルのみ
.select do |full_path|
file_name = File.basename( full_path )
# 先頭文字が abc かつ、末尾が .mp4 だけに絞り込む
file_name.start_with?( HEAD ) && file_name.end_with?( EXT )
end
.map { |full_path| File.basename( full_path ) }

次へ続く

156:153
23/11/11 20:41:20.19 iU/7lT3J.net
# 変更後のファイル名の配列
fname_dest_ary = fname_src_ary.map do |file_name|
str = String.new( file_name )
# 先頭文字の abc と、末尾の .mp4 を取り除いて、数字だけにする
str.slice!(-EXT_LEN, EXT_LEN)
str.slice!(0, HEAD_LEN)
# 10進数の数値型に変換してから、3桁0埋め文字にする
HEAD + "%03d" % Integer( str, 10 ) + EXT
end

require 'set'
# 変更後のファイル名が既に存在しているか、チェックする。
# abc100.mp4 など、3桁以上の数値もエラー!
fname_src_set = Set.new( fname_src_ary ) # 集合
fname_dest_ary.each { |file_name|
raise "ファイル名: #{ file_name } が重複しています" if
fname_src_set.include?( file_name )
}

# ファイル名を変更する
fname_src_ary.zip( fname_dest_ary ) do |src_filename, dest_filename|
src_path = target_dir + "/" + src_filename
dest_path = target_dir + "/" + dest_filename
FileUtils::DryRun.move( src_path, dest_path )
end

出力
mv C:/Users/Owner/Documents/test/abc0.mp4
C:/Users/Owner/Documents/test/abc000.mp4
mv C:/Users/Owner/Documents/test/abc99.mp4
C:/Users/Owner/Documents/test/abc099.mp4

157:17
23/11/21 04:31:35.72 aOoah041.net
>>153
Kotlin
URLリンク(paiza.io)

158:デフォルトの名無しさん
23/11/25 20:07:06.40 zpqT0hBE.net
お題:ランダムに1から9999までの整数を得た時、何回で全種類出揃うか確認せよ
擬似乱数列生成法については指定しないものとする
ruby
URLリンク(ideone.com)
require 'set'
r = 1..9999
c = r.to_a.fill(0)
s = r.to_set
while !s.empty?
n = rand(r)
c[n - r.first] += 1
s.delete n
end
p c.sum

84736

159:デフォルトの名無しさん
23/11/25 22:17:37.68 Al0Rw+0l.net
>>158
R
URLリンク(ideone.com)

160:デフォルトの名無しさん
23/11/26 10:44:04.74 dd78ITN+.net
プログラミングの依頼はここでいいでしょうか。
ココナラで依頼したのですが見送りになってしまいました。
お金は出すので製品版を作って欲しいです。
できないなら何が定義できていないのか教えて下さい。
AIによる詩作成
まずAIが詩を作成するための学習ツールを作ります
AIがリンゴの形相を分解するには辞書が必要となる
リンゴを検索し辞書を比較し関連性の高いワード
リンゴ⊇(赤い、丸い、果物…)を拾うのだ
これが学習ツールであり
一致したワードからさらに形相に分解する
リンゴ⊇(赤い、丸い、果物、酸っぱい…)
その中の果物を形相分解するには
果物⊇(リンゴ、サクランボ、なし…)
その中のなしを様相分解すると
なし⊇(果物、丸い、黄緑…)
ここから詩を作るには『黄緑のリンゴ』などになる
形相分解すると客観的な『深さ』(今回は三段階)を持った詩になる

161:デフォルトの名無しさん
23/11/26 10:50:43.54 d/KzVdDP.net
>>158
設定があいまいなんだが
shuffleとかselectとかchoice系なら
高々9999回で必ず全部出る

162:デフォルトの名無しさん
23/11/26 11:41:26.07 1iIVw+fD.net
>>158
Java
URLリンク(paiza.io)

163:158
23/11/26 12:29:54.58 dd78ITN+.net
製品版なら10万円出します
AIでなくても詩作成ツールでいいです

164:デフォルトの名無しさん
23/11/26 13:43:11.68 4uIV+oN2.net
>>158 lisp
URLリンク(ideone.com)

165:デフォルトの名無しさん
23/11/26 21:12:35.28 SfQeb61a.net
>>159
これだと150001回以上となる場合が本来よりも起こりにくくなってしまい駄目だった。
活かしながら書き換えると URLリンク(ideone.com)

166:17
23/11/27 10:19:46.26 VB+FhCy9.net
>>160
ここは誰かがお題を出して答えたい人が答えるスレなので、どんなお題を書いても構わないが、誰も答えないことはよくある。
また、バグがあっても気づかずにそのままになる事もある。多分大半のプログラムは作った本人以外は検証しないので。
ごく稀に他人がバグを発見することはあるが、発見されてもわざわざ指摘するとは限らないし修正もされないかも知れない。

167:17
23/11/27 10:35:37.58 VB+FhCy9.net
>>158
Kotlin
URLリンク(paiza.io)
こんなので良いのか?やっぱ Set とか使わずにやった方が良いかな?

168:デフォルトの名無しさん
23/11/27 12:57:15.00 lzpjbGZv.net
>>158 Ruby
>>158 の例が個別の出現回数をカウントしていたのでそれに合わせた
c = [0] * 9999
9999.times {
redo unless ( c[ rand(9999) ] += 1 ) == 1
}
p c.sum

169:17
23/11/27 13:09:30.74 VB+FhCy9.net
>>158
また Kotlin
URLリンク(paiza.io)
今度は add ではなく remove でやるようにした。
これでその Ruby の例に近くはなるがカウントする方法は前と同じで個別にはやってない。

170:デフォルトの名無しさん
23/11/27 18:30:50.07 O6HTjvgJ.net
>>158
Perl
perl -E 'for ($r = 9999; $n < $r; $_++) { $h{int(rand($r)) + 1} ||= ++$n }; say'
79596

171:156
23/11/27 20:35:49.92 VuTnBSK2.net
>>158 c
URLリンク(ideone.com)
・lispのひとの(>>164)をパク…参考にしました
・乱数生成部分は URLリンク(c-faq.com) からコピペしました
int main() {
int a[9999] = {0}, size = sizeof a / sizeof *a, sum, min, max, r, i, j, k;
srand(time(0));
#define randi(size) ((int)((double)rand() / ((double)RAND_MAX + 1) * (size)))
for (r = size; 0 < r; ) if (!a[randi(size)]++) r--;
for (sum = min = max = a[0], i = 1; i < size; i++) {
sum += a[i];
min = min < a[i] ? min : a[i];
max = a[i] < max ? max : a[i];
}
printf("%d\n%f\n[%d, %d]\n", sum, (double)sum / size, min, max);
for (i = min; i <= max; i++) {
for (k = j = 0; j < size; j++) if (i == a[j]) k++;
printf("%d\t%d\n", i, k);
}
return 0;
}

172:17
23/11/28 15:35:44.30 cIauX08C.net
>>158
今度はC言語
URLリンク(paiza.io)
1~9999ではなく実際には0~9998でやっているが、表示する必要もないし一々1足したり後で引いたりも馬鹿らしいのでそのままにした。

173:デフォルトの名無しさん
23/11/30 06:46:26.20 /rzYr39l.net
お題:英字の羅列された文字列が与えられる。この文字列を分析して数字列を出力せよ。数字の表記ルールは、その文字の両隣の文字がASCIIコードにおける奇数だったら1、そうでなければ0.

174:デフォルトの名無しさん
23/11/30 09:19:30.52 AZ5oWFgm.net
前提としてエラー入力はなくて
出力は両隣がある時のみでいいのかな
use itertools::{Itertools, assert_equal};
fn convert(input: &[u8]) -> Vec<u8> {
 input
 .iter()
 .tuple_windows()
 .map(|(prev, _curr, next)| (prev & next & 1) + b'0')
 .collect()
}
fn main() {
 assert_equal(&convert(b"ABC"), b"1");
 assert_equal(&convert(b"abcIJKpqrXYZ"), b"1001010000");
}

175:デフォルトの名無しさん
23/11/30 20:13:06.94 tzHzM+FM.net
>>173 octave
URLリンク(ideone.com)
function a = f(s)
o = rem([0 uint8(s) 0], 2) == 1;
a = o(1:end-2) & o(3:end);
end
>>173 c
URLリンク(ideone.com)
void f(const char *s, int *out, int *len) {
int i;
for (*len = strlen(s), i = 0; i < *len; i++)
out[i] = (i == 0 || i == *len - 1) ? 0 : s[i - 1] & s[i + 1] & 1;
}

176:デフォルトの名無しさん
23/11/30 20:40:22.09 2Igm/ys/.net
>>R
URLリンク(ideone.com)

177:17
23/12/02 14:30:47.66 FLL1Kaqa.net
>>173
Kotlin
URLリンク(paiza.io)
両隣が存在する文字のみを対象に処理をするようにした。なので3文字未満はエラーになる。3文字の場合は2文字目だけを対象にして一つ結果を出す。

178:デフォルトの名無しさん
23/12/04 20:26:07.07 LtCaDuZa.net
>>173 Ruby
def solution1( str )
a = 0
str.chars.inject(''){|s,c|
s << ( (5 & (a = 7 & a << 1 | c.ord & 1) == 5)? '1' : '0' )
}[2..-1] || ''
end
solution( '' ) #=> ""
solution( 'AB' ) #=> ""

179:デフォルトの名無しさん
23/12/08 09:07:44.84 Fcz3Modv.net
>>173 lisp
URLリンク(ideone.com)

180:デフォルトの名無しさん
23/12/10 17:41:17.00 Dj8Ho2Ik.net
>>173
C#
URLリンク(paiza.io)

181:デフォルトの名無しさん
23/12/13 09:27:48.18 NbIWTS6w.net
お題
ビールの空きビンをN本集めると新品のビール1本と交換してもらえる
あなたが新品のビールをP本持っている
そのとき、あなたが飲めるビールはR本である
N, Pを引数としてRを返す関数を定義してください

182:17
23/12/13 15:17:15.28 WwinWAeQ.net
>>181
Kotlin または Kotlin script
fun beer(n: Int, p: Int) = p + p / n

183:17
23/12/13 15:19:45.81 WwinWAeQ.net
ごめん。これだと1回分しか計算してないね。ということで >>182 はボツ。

184:17
23/12/13 15:47:32.26 WwinWAeQ.net
>>181
Kotlin
URLリンク(paiza.io)

作り直した。
もっと簡略化できそうな感じもしたがやってない。何か画期的な計算方法やアルゴリズムに気付いたらまた作る。

185:デフォルトの名無しさん
23/12/13 18:37:32.11 8Qa5an+7.net
>>181 Ruby
def solution( n, m )
b = r = n
while (k = b.div( m )) != 0
b += k - k * m
r += k
end
r
end
solution( 5, 3 ) #=> 7

186:デフォルトの名無しさん
23/12/14 00:01:58.90 WyfgSj4g.net
>>181
URLリンク(ideone.com)
let f n p =
let rec aux r p q =
if p = 0 then r else aux (r + p) ((p + q) / n) ((p + q) mod n)
in aux 0 p 0
let () = print_int @@ f 3 5

7

187:デフォルトの名無しさん
23/12/14 00:03:09.36 uNhVrYF2.net
>>181
R
R <- function(N, P) ((P - 1) * N) %/% (N - 1) + 1

188:17
23/12/19 15:39:00.18 S/sB6wJe.net
>>181
Kotin
URLリンク(paiza.io)
再帰にすればとても簡単だったことに、さっき気付いた。

189:デフォルトの名無しさん
24/01/16 00:33:05.98 n8j0XaXx.net
お題:時刻の文字列が与えられる。その時刻から1秒後の時刻を出力せよ。

入力:00:00:00
出力:00:00:01
入力:23:59:59
出力:00:00:00

190:9
24/01/16 02:37:52.68 SfyAs2IF.net
>>189 Perl5

use Time::Piece;
use Time::Seconds;
for (qw{00:00:00 23:59:59}) {
 $t = Time::Piece->strptime($_, '%T') + 1;
 print "入力:$_\n出力:", $t->strftime('%T'), "\n";
}

※見易くするためインデントを全角スペースに置換してあります


実行結果
~ $ perl 22_187_1秒後.pl
入力:00:00:00
出力:00:00:01
入力:23:59:59
出力:00:00:00

191:9
24/01/16 02:38:47.78 SfyAs2IF.net
>>190

use Time::Seconds;
これ要らなかった…orz

192:デフォルトの名無しさん
24/01/16 20:31:44.73 76+p6SY+.net
>>189 octave
URLリンク(ideone.com)
f = @(s) datestr(addtodate(datenum(s), 1, 'second'), 'HH:MM:SS');
in = ['00:00:00';'23:59:59'], out = f(in)

193:デフォルトの名無しさん
24/01/16 20:54:27.73 OiJoE8pV.net
>>189 PowerShell
"00:00:00", "23:59:59" |% {[String]([DateTime]$_).AddSeconds(1).TimeOfDay}

194:デフォルトの名無しさん
24/01/16 21:26:50.38 76+p6SY+.net
>>189 ruby
URLリンク(ideone.com)
require 'time'
f = -> s {(Time.parse(s) + 1).strftime('%T')}
p ['00:00:00', '23:59:59'].map {|s| [s, f.(s)]}

195:デフォルトの名無しさん
24/01/16 23:32:13.09 +Emu7d1R.net
>>189 js
const decode = (s) => s.split(":").map(Number);
const encode = (nums) => nums.map((v) => String(v).padStart(2, "0")).join(":");
const inct = (s, sec = 1) => {
const a = decode(s);
const ss = [
{ n: a[0], max: 24 },
{ n: a[1], max: 60 },
{ n: a[2], max: 60 },
];
let up = sec;
const b = ss
.reverse()
.map(({ n, max }) => {
n += up;
up = Math.floor(n / max);
return n % max;
})
.reverse();
return encode(b);
};
console.log(inct("00:00:00"));// 00:00:01
console.log(inct("23:59:59"));// 00:00:00
console.log(inct("00:00:00", 100));// 00:01:40

196:デフォルトの名無しさん
24/01/17 00:04:27.61 g7dwo5vO.net
>>189 ocaml
URLリンク(ideone.com)
let sec_of_hms hms =
let at i = int_of_string (String.sub hms i 2) in at 0 * 60 * 60 + at 3 * 60 + at 6
let hms_of_sec sec =
Printf.sprintf "%02d:%02d:%02d" (sec mod 86400 / 3600) (sec mod 3600 / 60) (sec mod 60)
let (<<) f g x = f (g x)
let f = hms_of_sec << (+) 1 << sec_of_hms

197:デフォルトの名無しさん
24/01/17 01:45:50.10 xvgJymQe.net
>>189
Rust (date/timeライブラリ不使用版)

fn next_time(cur: &str) -> String {
 let [sec, min, hour] = cur
 .rsplitn(3, ':')
 .map(|s| s.parse().unwrap())
 .zip([60, 60, 24])
 .scan(1, |carry, (mut value, limit)| {
  value += *carry;
  (*carry, value) = if value == limit { (1, 0) } else { (0, value) };
  Some(value)
 })
 .collect::<ArrayVec<_, 3>>()[..] else { unreachable!() };
 format!("{hour:02}:{min:02}:{sec:02}")
}

fn main() {
 assert_eq!(next_time("00:00:00"), "00:00:01");
 assert_eq!(next_time("23:59:59"), "00:00:00");
}

198:17
24/01/18 03:01:51.54 opxINJAy.net
>>189
Kotlin
Java のライブラリそのまま使ってるだけの怠惰なプログラム
URLリンク(paiza.io)

199:17
24/01/19 19:43:44.34 hxZRcaHh.net
>>189
Kotlin
今度は Java のライブラリは使わずに時分秒を保持するクラスを自分で作ってそこで秒に足すとか文字列にするとかやるようにした。
URLリンク(paiza.io)

200:デフォルトの名無しさん
24/01/20 23:08:19.98 PCaU0wMN.net
>>189 dart 2.3.0
URLリンク(ideone.com)
void main() {
var sec_of_hms = (hms) => hms.split(':').fold(0, (acc, s) => acc * 60 + int.parse(s));
var hms_of_sec = (sec) => [sec % 86400 ~/ 3600, sec % 3600 ~/ 60, sec % 60].map((x) => x.toString().padLeft(2, '0')).join(':');
var f = (hms) => hms_of_sec(sec_of_hms(hms) + 1);
print(f('00:00:00'));
print(f('23:59:59'));
}

201:デフォルトの名無しさん
24/01/21 17:06:46.39 BpmEGVkv.net
>>189
c++
スレリンク(tech板:124番)

202:デフォルトの名無しさん
24/01/21 21:15:52.66 BWkvMixc.net
>>189 c
URLリンク(ideone.com)
int hmstosec(const char *hms) {
int h, m, s;
return sscanf(hms, "%d:%d:%d", &h, &m, &s) == 3 ? h * 3600 + m * 60 + s : 0;
}
char *sectohms(char *buff, int sec) {
sprintf(buff, "%02d:%02d:%02d", sec % 86400 / 3600, sec % 3600 / 60, sec % 60);
return buff;
}
char *f(char *buff, const char *hms) {
return sectohms(buff, hmstosec(hms) + 1);
}

>>189 c
URLリンク(ideone.com)
int hmstosec(const char *hms) {
#define _(i) ((hms[i] - '0') * 10 + (hms[i + 1] - '0'))
return _(0) * 3600 + _(3) * 60 + _(6);
#undef _
}
char *sectohms(char *buff, int sec) {
#define _(i, value) buff[i] = '0' + (value) / 10, buff[i + 1] = '0' + (value) % 10
return _(0, sec % 86400 / 3600), buff[2] = ':', _(3, sec % 3600 / 60), buff[5] = ':', _(6, sec % 60), buff[8] = '\0', buff;
#undef _
}
char *f(char *buff, const char *hms) {
return sectohms(buff, hmstosec(hms) + 1);
}

203:デフォルトの名無しさん
24/01/22 15:47:46.18 PT6/fzaV.net
>>189 lisp
URLリンク(ideone.com)

204:デフォルトの名無しさん
24/01/23 20:39:51.43 8rvcqFQo.net
>>189 gawk
URLリンク(ideone.com)
BEGIN {FS=":"}
{print strftime("%T", mktime(sprintf("2024 01 23 %s %s %s", $1, $2, $3)) + 1);}

>>189 sqlite
URLリンク(ideone.com)
select time('00:00:00', '+1 second');
select time('23:59:59', '+1 second');

>>189 bash
URLリンク(ideone.com)
while read hms; do
date '+%T' --date="+1 seconds $hms"
done

205:デフォルトの名無しさん
24/01/23 22:56:23.02 8rvcqFQo.net
>>189 pascal
URLリンク(ideone.com)
program ideone;
Uses sysutils, dateutils;
function f(hms : string) : string;
begin
f := TimeToStr(IncSecond(StrToTime(hms), 1))
end;
begin
writeln(f('00:00:00'));
writeln(f('23:59:59'));
end.

206:デフォルトの名無しさん
24/01/23 23:54:34.15 39Fs96AV.net
>>189を時間ライブラリ無しで作成できている言語は現時点で
193のJavaScript
194のOCaml
195のRust
197のKotlin
198のDart
199のC++
200のC
201のLisp
以上

207:17
24/01/24 00:08:17.22 n4ooUyFj.net
>>189
Perl
bashのコマンドラインから長い長いワンライナーで。
$ perl -ne 'if(/(\d+):(\d+):(\d+)/){$h=$1;$m=$2;$s=$3;printf"入力:%02d:%02d:%02d\n",$h,$m,$s;$s++;if($s>=60){$m++;$s=0;if($m>=60){$h++;$m=0;if($h>=24){$h=0}}}printf"出力:%02d:%02d:%02d\n",$h,$m,$s}'
1:2:3
入力:01:02:03
出力:01:02:04
0:0:0
入力:00:00:00
出力:00:00:01
23:59:59
入力:23:59:59
出力:00:00:00
$

208:デフォルトの名無しさん
24/02/02 06:41:15.23 CC6U77IS.net
お題
入力データをグループ分けして出力せよ

入力データの、= の左右は同じグループである。
出力する順番は、入力データの出現順とする

UnionFind を使えば良いかも

入力データ
["a1=a2", "b1=b2", "b3=b2", "c1=c2", "e1=e2",
"a3=a4", "c3=c4", "e1=e3", "a2=a4", "c3=c1",
"b3=a4", "c2=d1", "a4=a5", "d2=c1", "b4=b3", "d3=c3"]

出力
[["a1", "a2", "b1", "b2", "b3", "a3", "a4", "a5", "b4"],
["c1", "c2", "c3", "c4", "d1", "d2", "d3"],
["e1", "e2", "e3"]]

Ruby で、UnionFind を自作してみた。
下はユニットテストです

URLリンク(paiza.io)
URLリンク(paiza.io)

209:デフォルトの名無しさん
24/02/02 10:50:23.49 fEMhv+T7.net
>>208
Rust

fn foo<'a, 'b>(input: &'b [&'a str]) -> Vec<Vec<&'a str>> {
 struct Data<'a> { name: &'a str, rep: usize, coll: Option<Vec<usize>>, }
 let mut data = Vec::<Data>::new();
 let mut map = HashMap::<&str, usize>::new();
 for s in input {
  let (index0, index1) = s.splitn(2, '=')
   .map(|s| match map.get(s) {
    Some(&index) => data[index].rep,
    None => {
     let index = data.len();
     map.insert(s, index);
     data.push(Data { name: s, rep: index, coll: Some(vec![index]), });
     index
    },
   })
   .sorted().tuple_windows().next().unwrap();
  if index0 != index1 {
   let coll0 = data[index0].coll.take().unwrap();
   let coll1 = data[index1].coll.take().unwrap();
   coll1.iter().for_each(|&index| data[index].rep = index0);
   data[index0].coll = Some(itertools::merge(coll0, coll1).collect());
  }
 }
 data.iter().map(|data| &data.coll).flatten()
  .map(|coll| coll.iter().map(|&index| data[index].name).collect()).collect()
}

210:デフォルトの名無しさん
24/02/02 10:53:02.58 fEMhv+T7.net
>>209の動作確認用追加分

use std::collections::HashMap;
use itertools::Itertools;

fn main() {
 let input = [
  "a1=a2", "b1=b2", "b3=b2", "c1=c2", "e1=e2",
  "a3=a4", "c3=c4", "e1=e3", "a2=a4", "c3=c1",
  "b3=a4", "c2=d1", "a4=a5", "d2=c1", "b4=b3", "d3=c3"
 ];
 let output = [
  vec!["a1", "a2", "b1", "b2", "b3", "a3", "a4", "a5", "b4"],
  vec!["c1", "c2", "c3", "c4", "d1", "d2", "d3"],
  vec!["e1", "e2", "e3"]
 ];
 assert_eq!(foo(&input), output);
}

211:デフォルトの名無しさん
24/02/02 22:48:33.27 UezRkqGy.net
>>208 ruby
URLリンク(ideone.com)
f = -> a {
w = a.map {|s| s.split('=')}.flatten.uniq.map.with_index.to_h
a.each_with_object([]) {|s, acc|
x, xa, y, ya = s.split('=').map {|k| [k, acc.find {|b| b.include? k}]}.flatten(1)
if xa && ya then xa.concat (acc.delete ya) << x << y
elsif xa then xa << x << y
elsif ya then ya << x << y
else acc << [x, y]
end
}.map {|a| a.uniq.sort_by {|s| w[s]}}.sort_by {|a| w[a[0]]}
}

212:デフォルトの名無しさん
24/02/02 22:51:42.74 UezRkqGy.net
>>208 rust
URLリンク(ideone.com)
fn f<'a>(a: &[&'a str]) -> Vec<Vec<&'a str>> { // '
let h = a.iter().map(|&s| s.split('=')).flatten().rev().enumerate().map(|(p, s)| (s, p)).collect::<HashMap<_, _>>();
let mut acc = Vec::<Vec<&str>>::new();
for xy in a.iter().map(|s| s.split('=').collect::<Vec<_>>()) {
match (acc.iter().position(|b| b.contains(&xy[0])), acc.iter().position(|b| b.contains(&xy[1]))) {
(Some(xi), Some(yi)) => {
let ys = acc[yi].clone();
acc[xi].extend(ys);
acc[xi].extend(xy);
acc.remove(yi);
},
(Some(xi), None) => acc[xi].extend(xy),
(None, Some(yi)) => acc[yi].extend(xy),
_ => acc.push(xy),
}
}
for b in acc.iter_mut() {
b.sort_by(|c, d| h.get(d).cmp(&h.get(c)));
b.dedup();
}
acc.sort_by(|c, d| h.get(d[0]).cmp(&h.get(c[0])));
acc
}

213:デフォルトの名無しさん
24/02/02 23:24:19.60 UezRkqGy.net
>>208 ruby
URLリンク(ideone.com)
・若干の修正
f = -> a {
w = a.map {|s| s.split('=')}.flatten.uniq.map.with_index.to_h
a.each_with_object([]) {|s, acc|
x, xa, y, ya = s.split('=').map {|k| [k, acc.find {|b| b.include? k}]}.flatten(1)
if xa && ya then xa.concat (acc.delete ya)
elsif xa then xa << y
elsif ya then ya << x
else acc << [x, y]
end
}.map {|a| a.sort_by {|s| w[s]}}.sort_by {|a| w[a[0]]}
}

214:デフォルトの名無しさん
24/02/02 23:24:45.86 UezRkqGy.net
>>208 rust
URLリンク(ideone.com)
・若干の修正
fn f<'a>(a: &[&'a str]) -> Vec<Vec<&'a str>> { // '
let h = a.iter().map(|&s| s.split('=')).flatten().rev().enumerate().map(|(p, s)| (s, p)).collect::<HashMap<_, _>>();
let mut acc = Vec::<Vec<&str>>::new();
for xy in a.iter().map(|s| s.split('=').collect::<Vec<_>>()) {
match (acc.iter().position(|b| b.contains(&xy[0])), acc.iter().position(|b| b.contains(&xy[1]))) {
(Some(xi), Some(yi)) => {
let ys = acc[yi].clone();
acc[xi].extend(ys);
acc.remove(yi);
},
(Some(xi), None) => acc[xi].push(xy[1]),
(None, Some(yi)) => acc[yi].push(xy[0]),
_ => acc.push(xy),
}
}
acc.iter_mut().for_each(|b| b.sort_by(|c, d| h.get(d).cmp(&h.get(c))));
acc.sort_by(|c, d| h.get(d[0]).cmp(&h.get(c[0])));
acc
}

215:デフォルトの名無しさん
24/02/02 23:58:11.98 Uk0I9chw.net
>>208
R
URLリンク(ideone.com)

216:デフォルトの名無しさん
24/02/03 02:58:35.44 bEsWZIv5.net
>>208
Java
URLリンク(paiza.io)

217:デフォルトの名無しさん
24/02/03 10:26:51.46 kmOXhk/V.net
>>208 >>215
Rでもっと短く書けた。
URLリンク(ideone.com)

218:9
24/02/04 16:39:59.23 jTY6zdRX.net
>>210 Perl5

use feature qw{:5.16 signatures};
no warnings qw(experimental::signatures);
@s = qw[a1=a2 b1=b2 b3=b2 c1=c2 e1=e2 a3=a4 c3=c4 e1=e3 a2=a4 c3=c1 b3=a4 c2=d1 a4=a5 d2=c1 b4=b3 d3=c3];
for (map{[sort /(\w+)=(\w+)/]} @s) {
 ($l, $r) = @$_;
 $g{$r} //= $g{$l} //= $g{$r} // $l;
 $h{$g{$r}} = $g{$l} if $g{$l} ne $g{$r};
}
$h{$k} = sub($e){$h{$e} ? __SUB__->($h{$e}) : $e}->($v) while ($k, $v) = each %h;
$g{$_} = $h{$g{$_}} // $g{$_} for keys %g;
push @{$r{$v}}, $k while ($k, $v) = each %g;
say "@$_" for values %r;

※見易くするためインデントを全角スペースに置換してあります


実行結果
$ perl 22_206_grouping.pl
b3 a3 a5 b4 a4 a1 b1 a2 b2
c1 d1 d3 c3 c2 d2 c4
e3 e1 e2


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch