プログラミングのお題スレ Part18

■ このスレッドは過去ログ倉庫に格納されています
2020/07/14(火) 13:53:46.47ID:jW5p6F/e
プログラミングのお題スレです。

【出題と回答例】
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/

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

※前スレ
プログラミングのお題スレ Part17
https://mevius.5ch.net/test/read.cgi/tech/1584031367/
394デフォルトの名無しさん
垢版 |
2020/08/30(日) 01:33:41.99ID:xjthqQ7x
お題
配列をソートする関数を受け取って安定ソートか否かを判定する
プログラムを作成してください
2020/08/30(日) 06:49:46.06ID:a0VCHWdX
お題: splitを実装せよ(ただし組み込みやライブラリのsplitは使ってはならない)

例:
>> split('abc:def:ghi', ':')
>> ['abc', 'def', 'ghi']
396デフォルトの名無しさん
垢版 |
2020/08/30(日) 08:02:58.80ID:Ui9A3dkW
>>393 J
f =: #~ @: >: @ i.
2020/08/30(日) 09:40:37.84ID:rD3R6mry
>>393 Ruby

(0..3).each{|n| p (1..n).reduce([]){|s, a| s + [a] * a}}

# =>
[]
[1]
[1, 2, 2]
[1, 2, 2, 3, 3, 3]


>>395 Ruby

p 'abc:def:ghi'.scan(/[^:]+/) # => ["abc", "def", "ghi"]
2020/08/30(日) 09:41:22.98ID:ka/TVb/i
>>393 octave
https://ideone.com/wQ0EMk
f = @(n) repelem(1:n, 1:n);
f(3)
2020/08/30(日) 09:43:25.32ID:pWMgwPJi
>>395
JS

let minSplit = (string, separator) => {
let array = [];
let splitter = (st, sp) => {
let pos = st.indexOf(sp);
if (pos == -1) {return [st,void(0)]} else {return [st.slice(0,pos),st.slice(pos+1)]}
}
while (true) {
if (string.length == 0) {array.push(string); break}
let temp = splitter(string, separator)
if (temp[1] == void(0)) {array.push(temp[0]); break}
else {array.push(temp[0]); string = temp[1]}
}
return array
}

let minSplit2 = (string, separator) => {
let reg = new RegExp(`[^(${separator})]+${separator}?`, "g");
return `${string} `.match(reg).map(x=>x.slice(0,-1))
}
2020/08/30(日) 17:51:57.01ID:9TpSDH8X
>>395 octave
f = @(s, d) arrayfun(@(b, e) {s(b:e)}, [1 find(s == d) + 1], [find(s == d) - 1 numel(s)]);
f('abc:def:ghi', ':')
401400
垢版 |
2020/08/30(日) 18:29:58.33ID:9TpSDH8X
一応url
https://ideone.com/Ni9DPI
402デフォルトの名無しさん
垢版 |
2020/08/30(日) 18:55:27.84ID:uG01djUi
>>395 js
const replaceAll = (s, from, to) => s.replace(new RegExp(from, "g"), to)
const split = (str, sep) => JSON.parse(`["${replaceAll(str, sep, '","')}"]`)

split('abc:def:ghi', ':')
// [ 'abc', 'def', 'ghi' ]
ずるいしダブルクォート対応できてないけど思いつき
2020/08/30(日) 19:52:13.41ID:KMqOjvFr
>>395 Ruby
# セパレーターの仕様が文字か文字列か分からなかったので文字列にした
def split( str, sep )
res = []
(str + sep).scan( /(.*?)#{Regexp.escape(sep)}/ ){ res << $1 }
res
end

split('abc:def:ghi', ':') #=> ["abc", "def", "ghi"]
404デフォルトの名無しさん
垢版 |
2020/08/30(日) 19:55:11.73ID:OKCM85cL
>> 393 C++
https://ideone.com/ztBnmn

>> 394 C++
https://ideone.com/8YhzWh
合ってるか分からない
(とりあえずバブルソートが安定だからそれと比較した)

>> 395 C++
https://ideone.com/lmYLkx
2020/08/30(日) 23:05:46.03ID:HaB2mhSL
>>393 C++
https://wandbox.org/permlink/LxzMc7UHa1lbhcX1

コンパイル時にできる
406デフォルトの名無しさん
垢版 |
2020/08/30(日) 23:23:11.11ID:OKCM85cL
operator[]がconstexprなのはC++17以降らしいね
407デフォルトの名無しさん
垢版 |
2020/08/31(月) 00:36:58.36ID:Sr2UUXBk
宇宙創生から現在まで【宇宙の歴史@(過去編)】
https://www.youtube.com/watch?v=1qUrdcRkRLc
期待値が無限大な賭け(サンクトペテルブルクのパラドックス)
https://www.youtube.com/watch?v=B__gzT-rQjw
もしも生徒が全員予備校講師だったら
https://www.youtube.com/watch?v=Lk
eが超越数であることの証明
https://www.youtube.com/watch?v=_DJfeP0cmI8
【受験生へ】勉強のモチベーションをあげる3つの方法
https://www.youtube.com/watch?v=4MAPBivBEhM
線を描くだけ!万能視覚的かけ算【インド式計算】
https://www.youtube.com/watch?v=Sj6Y43D76GA
全受験生が理解するべき!偏差値とは何か
https://www.youtube.com/watch?v=Xt7VN0xCbt8
楽しいことを増やそう!科学の眼鏡をかけた1日とは【ヨビノリたくみ特別公演】
https://www.youtube.com/watch?v=u5al7kwy64k
数学の魅力とは?中田敦彦と人気教育系YouTuberヨビノリたくみ先生が初コラボ
https://www.youtube.com/watch?v=qxiAyyotAM0
408デフォルトの名無しさん
垢版 |
2020/08/31(月) 08:12:50.04ID:o+KAewBM
>>393 Ruby
def f(n)
(1..n).map{|v| [v]*v}.flatten
end
2020/08/31(月) 09:50:22.54ID:3l02ZOhc
>>396
何やってんのか分かんねぇ…
2020/08/31(月) 12:53:04.32ID:DeTlQxvW
f#(@:m:@ )顔文字にしか見えん
411デフォルトの名無しさん
垢版 |
2020/08/31(月) 13:15:43.55ID:0jcGZySh
\(._. \)
2020/08/31(月) 13:37:09.03ID:tSOV4fJk
お題: 覆面算パズルをランダムに自動生成せよ。

単語は大文字のアルファベットのみとする。
各単語は自然数を表している。
単語の各文字は数字を表している。
各単語の先頭はゼロではない。
同じ文字は同じ数字が入る。文字が違えば、数字も違う。
各単語は、3文字以上6文字以下とする。
答えは一つでなければいけない。
今回は、簡単な足し算のみとする。

例)
SEND+MORE=MONEY.
BASE+BALL=GAMES.

単語リスト:https://gist.github.com/deekayen/4148741
2020/08/31(月) 13:41:36.35ID:tSOV4fJk
お題:覆面算パズルを解くプログラム。

例)
SEND+MORE=MONEY
→9567+1085=10652.

BASE+BALL=GAMES
→7483+7455=14938.
2020/08/31(月) 14:49:18.65ID:7ZWcUsrI
>>393
Elixir

# 再帰で、蓄積リスト・ary に、連結していく

defmodule MyList do
def add( num ), do: _add( num, [ ] )

defp _add( 0, ary ) do
ary
end

defp _add( num, ary ) when num > 0 do
_add( num - 1, List.duplicate( num, num ) ++ ary )
end
end

ary = MyList.add 3
IO.inspect ary #=> [1, 2, 2, 3, 3, 3]
2020/08/31(月) 16:10:16.99ID:lWn/zYPT
>>413, >>412の順に解いてね。

ヒント要る?
2020/08/31(月) 16:12:08.02ID:lWn/zYPT
ヒント: 各文字を変数とした連立方程式。
2020/08/31(月) 16:24:48.19ID:lWn/zYPT
文字の数が少ないんだから、ブルートフォースでも解けるか。。。
2020/08/31(月) 18:26:24.52ID:qQr3mFGF
間違えてなければO(10!)のはずだから充分多いのでは
2020/08/31(月) 18:26:56.47ID:qQr3mFGF
ごめん10!はめちゃくちゃ小さかった
2020/08/31(月) 18:43:24.02ID:hr5jjNmH
この手の問題は総当りしたほうが速いことすらある
2020/08/31(月) 19:18:49.49ID:J48xi6fS
しかもとっさにcombination用意できなければ(vimなどで)for文10個書いたほうが早いまである
422デフォルトの名無しさん
垢版 |
2020/08/31(月) 19:23:55.64ID:fdwPQ6pV
覆面算を制約論理プログラム iZ-Cを使って解きます。の記事があります。
https://sunasunax.hatenablog.com
423デフォルトの名無しさん
垢版 |
2020/08/31(月) 21:02:28.99ID:Sr2UUXBk
デキる人ほどフリーランス化する?★働き方改革
https://www.youtube.com/watch?v=ALflcwYOJtQ
年収890万円以下は社会のお荷物★騙される労働者
https://www.youtube.com/watch?v=CAp-ZrJpF54
騙されたくなかったら勉強しろ★他人のルールは損をする
https://www.youtube.com/watch?v=s176O6qKuPw
底辺の99%は一生底辺★10年後が見えない同僚たち
https://www.youtube.com/watch?v=4Mfiwn2sPD8
稼ぎたければ働くな★4千万円ぽっちも稼げないのはなぜ?
https://www.youtube.com/watch?v=Fi7bILN4wes
サラリーマン思考では儲からない理由
https://www.youtube.com/watch?v=iW6oAo0q0ZI
で、無職は稼いでるの?★YouTube収益はアホにも分かりやすい
https://www.youtube.com/watch?v=md0WPAsfarY
「で、年収は?」と聞くバカとは合わない社長業
https://www.youtube.com/watch?v=nEELEUhBLDk
424253
垢版 |
2020/08/31(月) 21:47:00.41ID:Mm8nXRhv
>>393 Perl5

use feature qw{signatures};
sub f($n) {
 $n ? (f($n-1), ($n) x $n) : ()
}
@a = f(3);
print "@a\n";


実行結果
~ $ perl 18_393_inc_ary.pl
The signatures feature is experimental at 18_393_inc_ary.pl line 2.
1 2 2 3 3 3
425253
垢版 |
2020/08/31(月) 21:54:06.64ID:pmRcaHIk
>>393 Perl5、単にmapで値個数要素のリストに展開

$n = 3;
@a = map{($_) x $_} 1..$n;
print "@a\n";


j実行結果
~ $ perl 18_393_inc_ary_map.pl
1 2 2 3 3 3
2020/08/31(月) 23:33:38.47ID:0jcGZySh
>>393
Kotlin
https://paiza.io/projects/A_eQfaut9aEoIRjfwbkN8Q
2020/09/01(火) 00:01:02.40ID:1mY8ta+4
>>393
C
https://paiza.io/projects/wwsivStn5Eq4vN7-XA5ShQ
2020/09/01(火) 00:18:24.24ID:vTrOzHSW
>>393
python
lambda x: [int(i) for i in "".join(f"{y}"*y for y in range(1,x+1))]
429デフォルトの名無しさん
垢版 |
2020/09/01(火) 14:16:37.60ID:3qKfeSqF
全く知らない構文の言語でカンでいじっても構文エラーも止められずに
動かない機械ガチャガチャしてるだけ感すごいよな
2020/09/01(火) 18:47:08.83ID:4meeAMMW
お題: テキストファイル「input.txt」の中の" dot "を"."に置換し、さらに" at "を"@"に置換したときに、RFCに従ったメールアドレスになる部分文字列を抽出し、そのメールアドレスのリストを改行区切りで出力せよ。
431デフォルトの名無しさん
垢版 |
2020/09/01(火) 18:47:54.44ID:Y09tsFBY
>>393 Ruby
def f(n)
(1..n*(n+1)/2).map{|x| ((x*2)**0.5+0.5).to_i}
end
432デフォルトの名無しさん
垢版 |
2020/09/01(火) 18:48:39.88ID:PZXbhIm5
>>430
テスト用のinput.txtちょーだい!
2020/09/01(火) 18:54:57.84ID:4meeAMMW
>>432
「これはテキトーなテキストデータである。
例えば
user at example dot com
とか
user at example dot co dot jp
とか
katayama dot hirofumi dot mz at example dot net
とかあるでしょ。
詐欺メールに引っ掛からないためには、URLのドメインを確認することが一番。
google.com
google.co.jp
まあ、いろいろあるっしょ。」
434デフォルトの名無しさん
垢版 |
2020/09/01(火) 18:57:45.00ID:PZXbhIm5
>>433
あざーす!
2020/09/01(火) 19:10:04.73ID:y/wdSyKD
>>430
Mail::RFC822::Address: regexp-based address validatio
http://www.ex-parrot.com/~pdw/Mail-RFC822-Address.html
2020/09/01(火) 20:18:24.49ID:4meeAMMW
ヒント: 文字列置換と正規表現
437デフォルトの名無しさん
垢版 |
2020/09/01(火) 22:43:25.27ID:PZXbhIm5
>>430
Java
https://paiza.io/projects/50iQ0JnPk_R404qr8Db80w
438デフォルトの名無しさん
垢版 |
2020/09/01(火) 22:55:31.34ID:PZXbhIm5
>>393
Java
https://paiza.io/projects/qDtcIJeOUdsMkEIxaXEf9w
439253
垢版 |
2020/09/02(水) 00:54:35.54ID:GpxOT2yi
>>393 Python3

(n, a) = (3, [])
for i in range(1, n+1):
  a.extend([i] * i)
print(a)


実行結果
~ $ python 18_393_incary.py
[1, 2, 2, 3, 3, 3]
440デフォルトの名無しさん
垢版 |
2020/09/02(水) 23:08:34.85ID:KTyhBksd
>>394
Java
https://paiza.io/projects/PGljCEpf6PlEcYw0xzNBVQ
441デフォルトの名無しさん
垢版 |
2020/09/02(水) 23:31:10.43ID:KTyhBksd
>>395
Java
https://paiza.io/projects/nGioH2f50H9y8EHZkISTOg
442デフォルトの名無しさん
垢版 |
2020/09/03(木) 16:10:13.26ID:dE9fk8zR
>>395 Ruby

def f(s,d)
eval("['"+s.gsub(d,"','")+"']")
end
p f("1 2 3 4"," ")

実行結果
["1", "2", "3", "4"]
2020/09/03(木) 19:41:51.27ID:0EoV326K
お題: バイナリファイルを読み込んで各バイトの各ビットについて、上位ビットから順に、ゼロをシフトJISの半角カナの「タ」に、いち(1)を同じくの「ヒ」に変換する変換器。
2020/09/03(木) 19:46:20.91ID:0EoV326K
>>443
追記。逆変換器も作って動作することを確認せよ。
2020/09/03(木) 21:11:58.06ID:97aiR77+
>>443 Ruby
Fpath = 'test.bin'
File.open( Fpath, 'wb' ){|fh| fh.write "Hello word\n" }

Tbl10 = "\xC0\xCB".force_encoding(Encoding::BINARY)
tb = (0..255).to_a.map{|x| ('%08b' % x).tr( '10', Tbl10 ) }
buff = File.open( Fpath, 'rb' ).each_byte.map{|x| tb[x] }
puts buff.join().encode( Encoding::UTF_8, Encoding::CP932 )

print buff.map{|x| x.tr( Tbl10, '10' ).to_i(2).chr }.join

#=> ヒタヒヒタヒヒヒヒタタヒヒタヒタヒタタヒタタヒヒヒタタヒタタヒヒヒタタヒタタタタヒヒタヒヒヒヒヒヒタタタヒタタタヒタタヒタタタタヒタタタヒヒタヒヒタタヒヒタヒヒヒヒヒヒタヒタヒ
#=> Hello word
2020/09/03(木) 23:01:51.02ID:ZdR77D/Z
>>442

f("'", ?,)
# =>SyntaxError: (eval):1: unterminated string meets end of file
[''']
   ^
(eval):1: syntax error, unexpected end-of-input, expecting ']'
447253
垢版 |
2020/09/04(金) 00:01:38.15ID:7q8p4uRD
>>443 Perl5

print map{qw(ヒ タ)[$_]} map{split '', sprintf '%08b', ord} split'','Hello word';

実行結果
~ $ perl 18_443_タヒ.pl
ヒタヒヒタヒヒヒヒタタヒヒタヒタヒタタヒタタヒヒヒタタヒタタヒヒヒタタヒタタタタヒヒタヒヒヒヒヒヒタタタヒタタタヒタタヒタタタタヒタタタヒヒタヒヒタタヒヒタヒヒ
448デフォルトの名無しさん
垢版 |
2020/09/04(金) 00:03:39.28ID:0wfgbo8M
>>444
Java
https://paiza.io/projects/w8Q5NbodI6iRfjcBWA1Nqg
449253
垢版 |
2020/09/04(金) 00:04:27.06ID:gbrpP/bR
>>447
>>444 逆変換機もか…忘れてた
まいいや
2020/09/04(金) 14:52:11.79ID:Wl7qFIBb
>>443
Elixir。CP932 が無いので、途中までしか出来ません!

# 8桁・2進数・0埋め

_ = 'abc'
|> Enum.map( fn char -> :io.format( "~8.2.0B", [ char ] ) end )

# 01100001_01100010_01100011
451デフォルトの名無しさん
垢版 |
2020/09/04(金) 23:27:10.30ID:1jfeDIRi
>>443
POSIX sh

変換 (https://paiza.io/projects/Yk6wcUtik7BZZ0AHspdZFw?language=bash)
for _b in $(od -v -A n -t d1); do
printf '%b' \
"\\$(( $_b & 128 ? 300 : 313 ))" \
"\\$(( $_b & 64 ? 300 : 313 ))" \
"\\$(( $_b & 32 ? 300 : 313 ))" \
"\\$(( $_b & 16 ? 300 : 313 ))" \
"\\$(( $_b & 8 ? 300 : 313 ))" \
"\\$(( $_b & 4 ? 300 : 313 ))" \
"\\$(( $_b & 2 ? 300 : 313 ))" \
"\\$(( $_b & 1 ? 300 : 313 ))"
done

逆変換 (https://paiza.io/projects/AN6vfPgtdJODnYL9jW8MDQ?language=bash)
od -v -A n -t o1 |
fold -b -w 32 |
while read _b8 _b7 _b6 _b5 _b4 _b3 _b2 _b1; do
printf '%b' "\\$((
($_b8 == 300 ? 200 : 0) +
($_b7 == 300 ? 100 : 0) +
($_b6 == 300 ? 40 : 0) +
($_b5 == 300 ? 20 : 0) +
($_b4 == 300 ? 10 : 0) +
($_b3 == 300 ? 4 : 0) +
($_b2 == 300 ? 2 : 0) +
($_b1 == 300 ? 1 : 0) ))"
done
452253
垢版 |
2020/09/04(金) 23:39:14.02ID:tinAGSqp
>>443>>444 Perl5、バイナリコード(ln)を含むデータをファイルから読み込み、変換》逆変換

undef $/; # slurp
$s = <>;

@b = map{qw(ヒ タ)[$_]} split'', unpack 'B*', $s;
print @b, "\n";

%h = qw(ヒ 0 タ 1);
$t = pack 'B*', join '', map{$h{$_}} @b;
print $t;



実行結果

$ od -xc Hello_world_ln.txt
0000000 6548 6c6c 206f 6f77 6c72 0a64
H e l l o w o r l d \n

$ cat Hello_world_ln.txt
Hello world

$ perl 18_443_444_ヒタ.pl < Hello_world_ln.txt
ヒタヒヒタヒヒヒヒタタヒヒタヒタヒタタヒタタヒヒヒタタヒタタヒヒヒタタヒタタタタヒヒタヒヒヒヒヒヒタタタヒタタタヒタタヒタタタタヒタタタヒヒタヒヒタタヒタタヒヒヒタタヒヒタヒヒヒヒヒヒタヒタヒ
Hello world
453デフォルトの名無しさん
垢版 |
2020/09/05(土) 15:41:23.97ID:dAk5cbFF
お題

UTF-8 は以下のように、先頭ニブル・4ビットで、1〜4バイト文字を判別しています。
この法則を使って、この文字列のバイト数を求めよ

あaθ💀xΩ死🄫

1バイト文字: 0000〜0111: 0〜7

多バイト文字の2バイト目以降
1000〜1011: 8〜11(8〜B)

2バイト文字: 1100〜1101: 12〜13(C〜D)
3バイト文字: 1110: 14(E)
4バイト文字: 1111: 15(F)

Unicode
https://seiai.ed.jp/sys/text/csd/cf14/c14a070.html
2020/09/05(土) 15:42:06.74ID:gCThzAly
お題:
左から右へ、1から10までの番号が付いたマスが順番に隙間なく並んでいます。
今日、訪問者N人があなたに会いにやってきます。各訪問者i(1≦i≦N)は時刻TiにマスPiを訪れます。
ここで、あなたが時刻TiにマスPiに居たのならば「訪問者iは満足した」とします。
最大で何人の訪問者を満足させられるか求めてください。
制約:
最初、時刻は0とする。
あなたは最初、マス1にいる。
あなたは隣り合うマスへの移動手段しか持たない。
1マス移動した場合にも、移動せずに現在マスに留まった場合にも時間1を消費する。
Ti == Tj で Pi == Pj ならば i == j
1≦N ≦10^5
1≦Ti≦10^5
1≦Pi≦10
入力:
N
T1 P1
T2 P2
...
TN PN
出力:
(最大で何人を満足させられるか)
例1:
入力:
5
5 4
2 3
3 2
3 4
4 4
出力:
4
2020/09/05(土) 15:55:10.03ID:gCThzAly
前回のお題はC++の方からしか回答を頂けなかったので、他の言語の方も考えていただけると嬉しいです
2020/09/05(土) 17:01:13.99ID:4vfoT7Xn
Tが10^5のそれぞれのマスにいたときの点数を求める(客がいた場合1、いなかったら0)
Tが10^5-1のときのマスの点数を求める(そこに客がいたなら1、いなかったら0
更にそこから次の時間に移動可能なマスの最大の点数のものを加える)
Tが1までくり返す
これで良さそうな気がするけど書くのがめんどくさい
2020/09/05(土) 17:35:24.39ID:s0GYNWbk
>>453
「この文字列の文字数を求める」んじゃないの?
バイト数だったらUTF-8だろうがSJISだろうが関係なく,
バイトの個数を数えればいいだけになってしまうが……。
458デフォルトの名無しさん
垢版 |
2020/09/05(土) 18:43:21.60ID:EHHCviTW
文字コードまわりの難しさにぶつかったことないから何が何やら
2020/09/05(土) 19:37:20.09ID:PsWvtVS4
>>453 Ruby
文字数とバイト数を適当に出力
require "cgi"
require "cgi"
str = CGI.unescapeHTML( "あaθ💀xΩ死🄫" )
sbs = str.bytes
i = n = 0
while i < sbs.size
case sbs[i] >> 4
when 0..7; i += 1
when 8..11; warn "Error"
when 12,13; i += 2
when 14; i += 3
when 15
case sbs[i] & 0xF
when 0..7; i += 4
when 8..11; i += 5
when 12,13; i += 6
else warn "Error"
end
end
n += 1
end
puts "#{n} chars\n#{str.size} chars"
puts "#{str.force_encoding( Encoding::BINARY ).size} bytes\n#{sbs.size} bytes"
puts str.bytes.map{|x| '%02X' % x }.join(' ')
#=>
8 chars
8 chars
20 bytes
20 bytes
E3 81 82 61 CE B8 F0 9F 92 80 78 CE A9 E6 AD BB F0 9F 84 AB
460デフォルトの名無しさん
垢版 |
2020/09/05(土) 19:47:45.16ID:EHHCviTW
普通に処理系がchar配列にしたときサイズを入れてくれるからそれでわかっちゃうw
461453
垢版 |
2020/09/05(土) 21:41:42.84ID:dAk5cbFF
書いてある条件だけで、求めて下さい!

他の方法では、簡単すぎるので
2020/09/05(土) 21:46:41.80ID:qef5ttAc
それだったら宿題スレで頼みなよ
2020/09/05(土) 22:24:40.63ID:s0GYNWbk
>>461
もう一度訊くけど,
ほんとに「バイト数」を求めたいの?

だったら
$ echo ' あaθ💀xΩ死🄫 ' | wc -c
これで一瞬だけど。

文字数なら,UTF-8を扱える言語で数えるか,
POSIX shでやるなら……面倒だな……。
https://gist.github.com/cmplstofB/0b0ce2bf052b3bb64d091fc83504fc32#file-u8dec-sh
こういうの使えばいいかな。
なお,wc -mはPOSIXでは必ずしも
UTF-8文字列を扱えるとは既定されていないので今回の目的には適さない。
2020/09/05(土) 22:25:44.48ID:s0GYNWbk
>>454
これ結構難しい。
まず普通に算法を考える段階で行き詰まってるw
頭悪いな〜
2020/09/05(土) 22:49:41.81ID:BjVkDMA6
>>454 C
https://ideone.com/X5mYh3
466253
垢版 |
2020/09/06(日) 00:11:00.10ID:Lo+HJN6n
>>380 Perl5

($H, $W) = split' ',<DATA>; @a = map{[split/\s*/]} <DATA>;
for $h (0..$H-1) { for $w (0..$W-1) {
 $c = $a[$h][$w];
 $S = "$h,$w" if $c eq 'S'; $G = "$h,$w" if $c eq 'G';
 if ($c ne '#') {
  $e{($h-1).",$w $h,$w"}++ if $h and $a[$h-1][$w] =~ /[.SG]/;
  $e{"$h,".($w-1)." $h,$w"}++ if $w and $a[$h][$w-1] =~ /[.SG]/;
 }}}
use feature qw{current_sub say}; no warnings 'experimental';
sub {
 my $p = @_[-1];
 for my $q (map{s/ *$p *//; $_} grep{/$p/} keys %e) {
  if ($q eq $G) { $h{"@{[@_, $q]}"}++ }
  else { __SUB__->(@_, $q) unless grep{/$q/} @_ }
 }
}->($S);
say scalar keys %h;
__DATA__
5 5
S....
##.#.
...#.
...#.
....G


実行結果
~ $ perl 18_380_maze_paths.pl
12
467253
垢版 |
2020/09/06(日) 00:30:27.55ID:WEZ/j7UH
>>466
今思うとエッジの表現は無向ではなく二重の有効グラフにしたほうが簡潔なコードになったかもしれない
まぁいいや…二度書く気は起きない…
468デフォルトの名無しさん
垢版 |
2020/09/06(日) 00:34:53.48ID:T9SJW9BR
>>395
Kotlin
https://paiza.io/projects/N9X2CVAQj3NJ0RXPrk7i0g

区切りは文字列で指定出来るとか、大文字小文字無視とか、最大分割数を決められるだとか、色々と機能を追加してしまった。
469デフォルトの名無しさん
垢版 |
2020/09/06(日) 03:34:19.13ID:0eLnTbkJ
お題
4999の逆数を小数点 以下48桁まで求める。
2020/09/06(日) 07:27:16.04ID:+WaXk/Ri
>>469 例外だけどbcコマンド
scale=48
1/4999
.000200040008001600320064012802560512102420484096
2020/09/06(日) 08:14:24.88ID:CxoRMtYI
>>469 Ruby

puts ('%0.49f' % (1r/4999)).chop

# => 0.000200040008001600320064012802560512102420484096
472デフォルトの名無しさん
垢版 |
2020/09/06(日) 09:37:57.61ID:yqdZF37w
>>453 C++
https://ideone.com/uulTGM
2020/09/06(日) 10:17:30.08ID:uXWEOXeO
>>454 C++
https://wandbox.org/permlink/TMrsTWgUWvzHktjh
2020/09/06(日) 10:30:03.37ID:r+7yP+3C
>>465
>>466
これって二つとも総当たりで解いてる?
そうすると最悪3^(10^5)くらいの回数廻さないといけなくない?
475デフォルトの名無しさん
垢版 |
2020/09/06(日) 10:58:30.52ID:5MBR0P77
1京くらいのループで解けるなら実用性はかろうじてある
競技性は無い
2020/09/06(日) 11:04:38.70ID:OF7UMaiS
最悪でも2^n組みしかなくね
2020/09/06(日) 11:07:12.07ID:uXWEOXeO
>>465 はlast_time(10^5)回のループの中でCOL(10)回ループ入れてるし、10^6では?
2020/09/06(日) 11:29:22.40ID:r+7yP+3C
>>476
いや,総当たりなら,3^(10^5)。
時刻が1--10^5までの間に,
「留まる」「右/左に移動する」の計3通りを
互いに独立に(以前の行動に影響されずに)
行うから。

書いていて思ったけど,端に居るときは
行動可能性が2通りに減るけど,
それでも2^N通りでは済まない。
479253
垢版 |
2020/09/06(日) 12:24:42.87ID:cAaPNRIA
>>474

>>466>>380への回答なので
その計算量の推定議論には該当しません
2020/09/06(日) 12:31:12.27ID:OF7UMaiS
>>478
1人が満足することで1点得るとする
点数の最大値は入力されたnの数しかないからn点で
それぞれについて1点得るか得ないかの2^nしかない
あとはそれを実現できるか移動があるかどうかが焦点になる
なので全移動経路を総当りする必要性はない
2020/09/06(日) 13:12:26.24ID:GcXxHJb3
>>469 C++
#include <iostream>
int main(){
const int d = 4999;
int n = 1;
std::cout << "0b0.";
for( int i = 1; i <= 48; ++ i ){
n <<= 1;
if( n >= d ){
n -= d;
std::cout << '1';
} else {
std::cout << '0';
}
}
std::cout << std::endl;
return 0;
}
// STDOUT
0b0.000000000000110100011100000111010100101011010001
2020/09/06(日) 13:48:19.34ID:r+7yP+3C
>>480
I see! Thanks.
2020/09/06(日) 15:12:48.21ID:JPL9qi8o
>>480
2^nも必要ないよ
それぞれの時刻でホストが取れる状態はどのマスにいるかということだけ
だから時刻xマスの数が全状態数
2020/09/06(日) 15:20:10.24ID:JPL9qi8o
でその状態数の方が全経路数より圧倒的に少ないので
経路に沿ってではなくて状態について解いていく
485デフォルトの名無しさん
垢版 |
2020/09/06(日) 16:31:54.76ID:SNogxihD
>>469
Java
https://paiza.io/projects/h9FWf0PGwBt60EOR_U48YA
2020/09/06(日) 16:34:17.02ID:r+7yP+3C
>>483
ん?
ホストは隣合うマスにしか移動できないから,
単純にその場面での状態を考えるだけでは駄目なんでは?
2020/09/06(日) 16:57:26.53ID:JPL9qi8o
だから遡って計算していくときは隣り合うマスの結果しか参照しないよ
488デフォルトの名無しさん
垢版 |
2020/09/06(日) 17:01:50.06ID:SNogxihD
>>453
Java
https://paiza.io/projects/IpbujQ_C5ZYHEAYAbnRtzQ
2020/09/06(日) 17:02:55.61ID:JPL9qi8o
>>465のコードは多分バグがある気がする

51行目と57行目を
a = score[j-1] + bit_test(timeline + i, j);
a = score[j+1] + bit_test(timeline + i, j);
こう変えて
43行目を
for(i = last_time-1; i >= 0; i--){
こうするのが正しいと思う
490253
垢版 |
2020/09/06(日) 18:02:02.21ID:EhLQImvS
>>454 Perl5、人の訪問を待ち受け得るすべての場合を愚直に総当りで最大満足数を探す

$T = <DATA>;
use feature qw{signatures say}; no warnings 'experimental';
chomp $T;
push @{$p{$$_[0]}}, $$_[1] for map{[split' ']}<DATA>;
use List::Util 'max';
sub f($t, $p, $s) {
 if ($t++ < $T) {
  if (0 < $p and $p < 11) {
   $s++ if grep/$p/, @{$p{$t}};
   $s += max(f($t, $p-1, $s), f($t, $p, $s), f($t, $p+1, $s))
  }
  return $s
 }
0
}
say f(0, 1, 0);
__DATA__
5
5 4
2 3
3 2
3 4
4 4

~ $ perl 18_454_N_vztr.pl
4
2020/09/06(日) 18:12:25.67ID:OF7UMaiS
>>454
python
https://ideone.com/5qz7G8
満足させる人数の多い順から実現可能か探索する
既に不可能だと分かっている移動が含まれる場合は直ちに打ち切る
2020/09/06(日) 18:13:41.84ID:65q5IvB9
>>490
perl読めないから間違ってたらごめんだが、
11
3 2
2 3
3 4
4 4
5 4
4 7
5 7
6 7
7 7
8 7
7 10
の入力で20を返してくる。(答えは5)
493253
垢版 |
2020/09/06(日) 18:20:26.24ID:EhLQImvS
>>492
はい、バグってました。投稿してから気がついた
時間あったら直します
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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