X



プログラミングのお題スレ Part22
0001デフォルトの名無しさん
垢版 |
2023/08/03(木) 13:52:13.20ID:/xW45k0z
プログラミングのお題スレです。

【出題と回答例】
1 名前:デフォルトの名無しさん
 お題:お題本文

2 名前:デフォルトの名無しさん
 >>1 使用言語
 回答本文
 結果がある場合はそれも

【ソースコードが長くなったら】 (オンラインでコードを実行できる)
https://ideone.com/
http://codepad.org/
http://compileonline.com/
http://rextester.com/runcode
https://runnable.com/
https://code.hackerearth.com/
http://melpon.org/wandbox
https://paiza.io/

宿題は宿題スレがあるのでそちらへ。

※前スレ
プログラミングのお題スレ Part21
https://mevius.5ch.net/test/read.cgi/tech/1668333636/
0112デフォルトの名無しさん
垢版 |
2023/09/30(土) 18:00:29.42ID:oqu6hf3+
>>111 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
0114デフォルトの名無しさん
垢版 |
2023/09/30(土) 20:00:09.54ID:iuoy3pEW
>>111 ウェブブラウザのJavaScript
https://pastebin.com/YvymwTeN

ユーザースクリプトの体裁で書いたけどブラウザーのConsoleでも動かせる
Firefox: Ctrl+Shift+K
Chrome: Ctrl+Shift+J
https://mevius.5ch.net/test/read.cgi/tech/1691038333/111 を開いてそこで実行
結果はレスに直接追記

重複がないからXPathのtranslate()でいけるな思った、それだけ
011617
垢版 |
2023/10/02(月) 01:52:26.35ID:hWT/DRlk
>>104
1. qrencode というプログラムをインストールする。(例: RedHat系Linuxなら yum install qrencode)

2. qrencode で出力に ansi 等を指定して文字列で出力する。

例: qrencode -t ansi やっほー

3. 画面に出て来たQRコードをスマホで撮影する等して確認する。

4. 終わり。
0118デフォルトの名無しさん
垢版 |
2023/10/06(金) 16:54:06.65ID:jg1c5xSH
[クライシスアクター」「豊島保養所」←画像検索&拡散!

他スレに丸ごとコピペよろしっく!!
ネットでできる反レプティリアン・反イルミ活動です!!!!!
動画サイトのコメ欄もねらい目だぞーーーー!!!!!!!
0119デフォルトの名無しさん
垢版 |
2023/10/06(金) 16:54:28.09ID:jg1c5xSH
[クライシスアクター」「豊島保養所」←画像検索&拡散!

他スレに丸ごとコピペよろしく!!
ネットでできる反レプティリアン・反イルミ活動です!!!!!
動画サイトのコメ欄もねらい目だぞ!!!!!!!
0120デフォルトの名無しさん
垢版 |
2023/10/08(日) 19:28:55.20ID:faQf3SiN
お題: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
01219
垢版 |
2023/10/08(日) 20:24:03.46ID:zYJ3wh+h
>>120
「もっとも効率がいいエレベーターの停止順序」とは?
1.停止回数がもっとも少ない
2.移動した階数の和が最も小さい
3.ほか
など、どのような指標?
0127デフォルトの名無しさん
垢版 |
2023/10/14(土) 00:00:08.85ID:sMwx6jpS
お題:角カッコの列が入力されるのでカッコの対応が取れていたら1,取れていなかったら0と表示せよ

< [[]]
> 1

< [[]
> 0
012817
垢版 |
2023/10/14(土) 02:22:24.53ID:BgrcFKKf
>>127
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
0130デフォルトの名無しさん
垢版 |
2023/10/14(土) 10:19:17.10ID:BRbCCPQd
>>127 Ruby
%W( [[]] [[] [[[[]][[]]] [[[[]][[]]]] ][ #{} ).each{|s|
w = s.dup
{} while w.sub!( /\[\]/, '' )
puts "#{(s != '' && w == '')? 1 : 0} #{s.inspect}"
}

# 1 "[[]]"
# 0 "[[]"
# 0 "[[[[]][[]]]"
# 1 "[[[[]][[]]]]"
# 0 "]["
# 0 ""
0132デフォルトの名無しさん
垢版 |
2023/10/16(月) 08:51:26.93ID:kgcCjrnK
1)
BY
RG

2)
RG
BY

3)
GR
YB

1-3を回転対称で同じとみなせるグループと線対称で同じとみなせるグループに分類せよ

4色を2x2の升にランダムに一つづつ配置して4x3x2通りのパターンを作成し
それぞれを上の基準でグループ分けせよ
0134デフォルトの名無しさん
垢版 |
2023/10/18(水) 20:40:59.79ID:4ifgnZXl
お題:Pythonのmath.ulp()と同機能の関数
引数が正規化数限定のサブセットでも可(その旨を明記)。
Pythonで実装する場合は(もちろん)math.ulp()を使ってはならない。
0135134
垢版 |
2023/10/18(水) 20:46:23.24ID:4ifgnZXl
簡単なお題:
>>133のサブセット(求めたulpも正規化数限定)
0136デフォルトの名無しさん
垢版 |
2023/10/18(水) 20:56:02.06ID:L3TY2GGf
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]
0137134
垢版 |
2023/10/18(水) 21:44:13.43ID:4ifgnZXl
>>135
間違えましたorz
0138134
垢版 |
2023/10/18(水) 21:52:04.82ID:4ifgnZXl
>>136
math.ulp()は符号を戻さないらしいです:
ulp(1) == ulp(-1)
0139デフォルトの名無しさん
垢版 |
2023/10/21(土) 04:08:56.28ID:TaroWUwV
お題:文字列「せんだ」「みつを」「ナハナハ」がランダムに100行入力される。せんだ、みつを、ナハナハが順番に入力されたときに1と一行出力せよ
0141デフォルトの名無しさん
垢版 |
2023/10/25(水) 07:23:48.08ID:gFkqcLnH
お題:
(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)の逆関数。
0142141
垢版 |
2023/10/25(水) 07:27:56.03ID:gFkqcLnH
補足:(1)(2)いずれも実用的な時間内で求める事(steps=1相当のnextafter()をループで回すのは不可)。
0143デフォルトの名無しさん
垢版 |
2023/10/25(水) 12:47:47.78ID:Bgy3SEXp
なんだnextafterって
0144141
垢版 |
2023/10/25(水) 23:22:03.23ID:gFkqcLnH
>>143
nextafter()は、浮動小数点数の、(数直線上での)「隣」を求めるやつですね(C99以降?)。
Python3.12のやつは、隣の隣の隣の…を求める事が出来る様に拡張されました。
014521-923
垢版 |
2023/10/26(木) 00:31:46.93ID:7aLp+Ojb
前スレの補足:
V8やLLVMは、自前でstrtod()的なものを実装してました。
tps://arxiv.org/abs/2101.11408
0146デフォルトの名無しさん
垢版 |
2023/10/28(土) 20:54:22.44ID:U0JINWpQ
>>101 octave
https://ideone.com/87WGBO
function s = f(s, i)
s(circshift(i, -1, 2)) = s(i);
end

>>127 ocaml
https://ideone.com/IY1dWU
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))
0147デフォルトの名無しさん
垢版 |
2023/10/31(火) 00:00:13.24ID:mywig6Xf
>>3 c
https://ideone.com/BnNzUC
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;
}
014917
垢版 |
2023/11/05(日) 02:55:01.08ID:w6RhJs5K
>>148
ChatGPT にそのままテキストを読ませたらこう答えた。
-------------------------------------------------------------------------------------------------
通学に自転車を使わない学生は34人、自転車を使うがバスを使わない学生は39人、バスを使うが自転車を使わない学生は18人です。

100人の学生全体からこれらの人数を引いた残りの学生がバスと自転車の両方を使っている学生の数です。

100人 - 34人 (自転車を使わない学生) - 39人 (バスを使わない学生) - 18人 (自転車を使わない学生) = 9人

したがって、通学にバスと自転車の両方を使う学生は9人です。
-------------------------------------------------------------------------------------------------

ここで徒歩については考慮しないのかとツッコミを入れたらこう答えた。

-------------------------------------------------------------------------------------------------
申し訳ありません、徒歩の学生についての情報が提供されていなかったため、上記の計算では徒歩を選択した学生については考慮されていませんでした。徒歩を選択した学生の数についての情報がなければ、バスと自転車の両方を使う学生の正確な数を計算することはできません。
-------------------------------------------------------------------------------------------------
015017
垢版 |
2023/11/05(日) 02:58:00.24ID:w6RhJs5K
そして更にこういうツッコミを入れる。

最初の34人は自転車を使っていないだけで密かにバスを使っているかも知れないのだが、そのことは考慮しないのか?

ChatGPT
申し訳ありません、私の以前の回答は不完全でした。確かに、最初の34人のうち自転車を使っていないという情報だけでは、彼らがバスを使っているかどうかを確定することはできません。そのため、正確な答えを得るためには追加の情報が必要です。

もし最初の34人のうち何人かが実際にはバスを利用している場合、それを考慮する必要があります。与えられた情報だけからは、バスと自転車の両方を使う学生の正確な数を特定することはできません。必要な情報が揃わない限り、正確な答えを提供することはできません。
0153デフォルトの名無しさん
垢版 |
2023/11/11(土) 20:39:33.71ID:iU/7lT3J
>>85
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 ) }

次へ続く
0154153
垢版 |
2023/11/11(土) 20:41:20.19ID:iU/7lT3J
# 変更後のファイル名の配列
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
0156デフォルトの名無しさん
垢版 |
2023/11/25(土) 20:07:06.40ID:zpqT0hBE
お題:ランダムに1から9999までの整数を得た時、何回で全種類出揃うか確認せよ
擬似乱数列生成法については指定しないものとする

ruby
https://ideone.com/rucuHk
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
0158デフォルトの名無しさん
垢版 |
2023/11/26(日) 10:44:04.74ID:dd78ITN+
プログラミングの依頼はここでいいでしょうか。
ココナラで依頼したのですが見送りになってしまいました。
お金は出すので製品版を作って欲しいです。
できないなら何が定義できていないのか教えて下さい。

AIによる詩作成

まずAIが詩を作成するための学習ツールを作ります
AIがリンゴの形相を分解するには辞書が必要となる
リンゴを検索し辞書を比較し関連性の高いワード
リンゴ⊇(赤い、丸い、果物…)を拾うのだ
これが学習ツールであり
一致したワードからさらに形相に分解する
リンゴ⊇(赤い、丸い、果物、酸っぱい…)
その中の果物を形相分解するには
果物⊇(リンゴ、サクランボ、なし…)
その中のなしを様相分解すると
なし⊇(果物、丸い、黄緑…)
ここから詩を作るには『黄緑のリンゴ』などになる
形相分解すると客観的な『深さ』(今回は三段階)を持った詩になる
0159デフォルトの名無しさん
垢版 |
2023/11/26(日) 10:50:43.54ID:d/KzVdDP
>>156
設定があいまいなんだが
shuffleとかselectとかchoice系なら
高々9999回で必ず全部出る
0161158
垢版 |
2023/11/26(日) 12:29:54.58ID:dd78ITN+
製品版なら10万円出します
AIでなくても詩作成ツールでいいです
0163デフォルトの名無しさん
垢版 |
2023/11/26(日) 21:12:35.28ID:SfQeb61a
>>157
これだと150001回以上となる場合が本来よりも起こりにくくなってしまい駄目だった。
活かしながら書き換えると https://ideone.com/qv7bL9
016417
垢版 |
2023/11/27(月) 10:19:46.26ID:VB+FhCy9
>>158
ここは誰かがお題を出して答えたい人が答えるスレなので、どんなお題を書いても構わないが、誰も答えないことはよくある。
また、バグがあっても気づかずにそのままになる事もある。多分大半のプログラムは作った本人以外は検証しないので。
ごく稀に他人がバグを発見することはあるが、発見されてもわざわざ指摘するとは限らないし修正もされないかも知れない。
0166デフォルトの名無しさん
垢版 |
2023/11/27(月) 12:57:15.00ID:lzpjbGZv
>>156 Ruby
>>156 の例が個別の出現回数をカウントしていたのでそれに合わせた

c = [0] * 9999
9999.times {
redo unless ( c[ rand(9999) ] += 1 ) == 1
}
p c.sum
016717
垢版 |
2023/11/27(月) 13:09:30.74ID:VB+FhCy9
>>156
また Kotlin
https://paiza.io/projects/yYQ9bdMb0_d91607skNw4Q

今度は add ではなく remove でやるようにした。
これでその Ruby の例に近くはなるがカウントする方法は前と同じで個別にはやってない。
0168デフォルトの名無しさん
垢版 |
2023/11/27(月) 18:30:50.07ID:O6HTjvgJ
>>156
Perl
perl -E 'for ($r = 9999; $n < $r; $_++) { $h{int(rand($r)) + 1} ||= ++$n }; say'
79596
0169156
垢版 |
2023/11/27(月) 20:35:49.92ID:VuTnBSK2
>>156 c
https://ideone.com/K1fD78
・lispのひとの(>>162)をパク…参考にしました
・乱数生成部分は https://c-faq.com/lib/randrange.html からコピペしました
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;
}
017017
垢版 |
2023/11/28(火) 15:35:44.30ID:cIauX08C
>>156
今度はC言語
https://paiza.io/projects/c6ALnYb4rksMFGZT03mcCw

1~9999ではなく実際には0~9998でやっているが、表示する必要もないし一々1足したり後で引いたりも馬鹿らしいのでそのままにした。
0171デフォルトの名無しさん
垢版 |
2023/11/30(木) 06:46:26.20ID:/rzYr39l
お題:英字の羅列された文字列が与えられる。この文字列を分析して数字列を出力せよ。数字の表記ルールは、その文字の両隣の文字がASCIIコードにおける奇数だったら1、そうでなければ0.
0172デフォルトの名無しさん
垢版 |
2023/11/30(木) 09:19:30.52ID:AZ5oWFgm
前提としてエラー入力はなくて
出力は両隣がある時のみでいいのかな

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");
}
017517
垢版 |
2023/12/02(土) 14:30:47.66ID:FLL1Kaqa
>>171
Kotlin
https://paiza.io/projects/xZXVc46Ys3qUlGX4DAIxzw

両隣が存在する文字のみを対象に処理をするようにした。なので3文字未満はエラーになる。3文字の場合は2文字目だけを対象にして一つ結果を出す。
0176デフォルトの名無しさん
垢版 |
2023/12/04(月) 20:26:07.07ID:LtCaDuZa
>>171 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' ) #=> ""
0179デフォルトの名無しさん
垢版 |
2023/12/13(水) 09:27:48.18ID:NbIWTS6w
お題
ビールの空きビンをN本集めると新品のビール1本と交換してもらえる

あなたが新品のビールをP本持っている

そのとき、あなたが飲めるビールはR本である

N, Pを引数としてRを返す関数を定義してください
018017
垢版 |
2023/12/13(水) 15:17:15.28ID:WwinWAeQ
>>179
Kotlin または Kotlin script

fun beer(n: Int, p: Int) = p + p / n
018117
垢版 |
2023/12/13(水) 15:19:45.81ID:WwinWAeQ
ごめん。これだと1回分しか計算してないね。ということで >>180 はボツ。
018217
垢版 |
2023/12/13(水) 15:47:32.26ID:WwinWAeQ
>>179
Kotlin
https://paiza.io/projects/1gGtpt6dxb6-vzoATj_Qkg

作り直した。
もっと簡略化できそうな感じもしたがやってない。何か画期的な計算方法やアルゴリズムに気付いたらまた作る。
0185デフォルトの名無しさん
垢版 |
2023/12/14(木) 00:03:09.36ID:uNhVrYF2
>>179
R

R <- function(N, P) ((P - 1) * N) %/% (N - 1) + 1
0187デフォルトの名無しさん
垢版 |
2024/01/16(火) 00:33:05.98ID:n8j0XaXx
お題:時刻の文字列が与えられる。その時刻から1秒後の時刻を出力せよ。


入力:00:00:00
出力:00:00:01
入力:23:59:59
出力:00:00:00
01889
垢版 |
2024/01/16(火) 02:37:52.68ID:SfyAs2IF
>>187 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
01899
垢版 |
2024/01/16(火) 02:38:47.78ID:SfyAs2IF
>>188

use Time::Seconds;
これ要らなかった…orz
0191デフォルトの名無しさん
垢版 |
2024/01/16(火) 20:54:27.73ID:OiJoE8pV
>>187 PowerShell
"00:00:00", "23:59:59" |% {[String]([DateTime]$_).AddSeconds(1).TimeOfDay}
0193デフォルトの名無しさん
垢版 |
2024/01/16(火) 23:32:13.09ID:+Emu7d1R
>>187 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
0194デフォルトの名無しさん
垢版 |
2024/01/17(水) 00:04:27.61ID:g7dwo5vO
>>187 ocaml
https://ideone.com/aEsvl6
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
0195デフォルトの名無しさん
垢版 |
2024/01/17(水) 01:45:50.10ID:xvgJymQe
>>187
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");
}
019717
垢版 |
2024/01/19(金) 19:43:44.34ID:hxZRcaHh
>>187
Kotlin

今度は Java のライブラリは使わずに時分秒を保持するクラスを自分で作ってそこで秒に足すとか文字列にするとかやるようにした。

https://paiza.io/projects/7YcPDBTxVFt9EVczvBJ8gQ
0198デフォルトの名無しさん
垢版 |
2024/01/20(土) 23:08:19.98ID:PCaU0wMN
>>187 dart 2.3.0
https://ideone.com/khq9gr
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'));
}
0200デフォルトの名無しさん
垢版 |
2024/01/21(日) 21:15:52.66ID:BWkvMixc
>>187 c
https://ideone.com/wRIYl2
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);
}

>>187 c
https://ideone.com/3gj90n
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);
}
0204デフォルトの名無しさん
垢版 |
2024/01/23(火) 23:54:34.15ID:39Fs96AV
>>187を時間ライブラリ無しで作成できている言語は現時点で
193のJavaScript
194のOCaml
195のRust
197のKotlin
198のDart
199のC++
200のC
201のLisp
以上
020517
垢版 |
2024/01/24(水) 00:08:17.22ID:n4ooUyFj
>>187
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
$
0206デフォルトの名無しさん
垢版 |
2024/02/02(金) 06:41:15.23ID:CC6U77IS
お題
入力データをグループ分けして出力せよ

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

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 を自作してみた。
下はユニットテストです

https://paiza.io/projects/e6nk1EOu3utyWpV3iuWAFQ?language=ruby
https://paiza.io/projects/kjeVtTKeDwEnWVrBU5_nbg?language=ruby
0207デフォルトの名無しさん
垢版 |
2024/02/02(金) 10:50:23.49ID:fEMhv+T7
>>206
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()
}
0208デフォルトの名無しさん
垢版 |
2024/02/02(金) 10:53:02.58ID:fEMhv+T7
>>207の動作確認用追加分

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);
}
0209デフォルトの名無しさん
垢版 |
2024/02/02(金) 22:48:33.27ID:UezRkqGy
>>206 ruby
https://ideone.com/eF5lww
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]]}
}
0210デフォルトの名無しさん
垢版 |
2024/02/02(金) 22:51:42.74ID:UezRkqGy
>>206 rust
https://ideone.com/MEZMPO
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
}
0211デフォルトの名無しさん
垢版 |
2024/02/02(金) 23:24:19.60ID:UezRkqGy
>>206 ruby
https://ideone.com/daI0QL
・若干の修正
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]]}
}
レスを投稿する


ニューススポーツなんでも実況