X



プログラミングのお題スレ Part11
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
垢版 |
2018/04/24(火) 20:45:14.49ID:ZY7R7Sru
プログラミングのお題スレです。

前スレ
プログラミングのお題スレ Part10
https://mevius.5ch.net/test/read.cgi/tech/1514772904/

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

宿題は宿題スレがあるのでそちらへ。
0750デフォルトの名無しさん
垢版 |
2018/08/18(土) 02:50:37.57ID:K3y6E3T8
鈴木貫太郎
灘中
https://youtu.be/BnS7vMsVV2s

6桁の整数、ABCDEF の一番上の位のAを、
一の位へ移動した数、BCDEFA が、元の数の3倍になるとき、
この条件を満たす、元の数をすべて(2つ)答えよ

ヒント。x = BCDEF とおいて考える

答え、142857, 285714
0752デフォルトの名無しさん
垢版 |
2018/08/18(土) 15:32:13.56ID:h7OdrOPI
>>744
Ruby 43 bytes
#!ruby -pa
$_='%.2f'%eval('1e4/'+$F*'**2*')

>>750
3 * ABCDEF = BCDEFA ∧ A != 0
<=> 42857 * A = BCDEF ∧ A != 0
<=> 42857 * A = BCDEF ∧ A = 1, 2
<=> ABCDEF = 142857, 285714
0754デフォルトの名無しさん
垢版 |
2018/08/19(日) 01:18:54.67ID:tX8wxXbT
お題:
1.BINGOカードを作る
2.BINGO抽選機を作る

ここで使われるビンゴカードは5x5のマス目に1から75までの数字が
ランダムに配置されており、数字が見つけやすいように左の列から
B列(1〜15), I列(16〜30), N列(31〜45), G列(46〜60), O列(61〜75)が
配置された一般的によく使われるタイプ。
5x5のマスの中央はFree(すでに開いた状態)。

出力例:https://ideone.com/R6eADP
(この形に従う必要はないです)

回答例(C言語):
 カード作成 https://ideone.com/aJBJ9v
 抽選機 https://ideone.com/NuIRYm
0755デフォルトの名無しさん
垢版 |
2018/08/19(日) 03:52:23.20ID:FQWxbBlW
>>750
Kotlin
https://paiza.io/projects/BFd9v2qeKaNcdssTQuj5Jw

これも力業だな。ただループして調べているだけ。
尚、最上位桁が0の場合も含めると0も該当する値になる。
0758UNIXプログラミング質問スレより
垢版 |
2018/08/21(火) 03:04:43.91ID:34Jmks75
お題:【構造のあるテキストの処理】各項目の内容をそれぞれソートして元のテキストに埋め込め。
====== 標準入力 ==========
* Fruit
apple
banana
orange
banana

* Animal
dog
cat
penguin

====== 標準出力 ==========
* Fruit
apple
banana
orange

* Animal
cat
dog
penguin

条件:ソートには外部コマンドを用いること。
0759758
垢版 |
2018/08/21(火) 03:11:53.68ID:34Jmks75
ソートに外部コマンドを使うのは、テキストの処理を取り替える拡張を想定しています。
例えば sort -u コマンドを tr '[a-z]' '[A-Z]' に置き換えて
* Fruit
APPLE
のようにできるようにしたい。

UNIXプログラミング質問スレにて、
このような処理はシェルスクリプトには荷が重く Powershell や Ruby が向いている、みたいなことを伺いました。
ぜひ回答を参考にしたいです。
0760デフォルトの名無しさん
垢版 |
2018/08/21(火) 14:35:58.26ID:2YpoFUMY
>>758 Ruby

ext_cmd = 'sort -u'

ary = $<.read.scan(/\*.*?\n(?:(?=\n)|\z)/m)
str = ary.map.with_index do |s, i|
  temp_fname = "temp#{i}"
  File.write(temp_fname, s[/\n\K.*/m])
  heading = s[/\A.*/]
  execed = `#{ext_cmd} #{temp_fname}`
  File.delete(temp_fname)
  [heading, execed] * $/
end

puts str * $/
0761デフォルトの名無しさん
垢版 |
2018/08/21(火) 14:40:47.02ID:2YpoFUMY
catを使うように修正
catのヒアドキュメントさえ使えれば一時ファイル作らなくて済むんだけど

ext_cmd = 'tr a-z A-Z'

ary = $<.read.scan(/\*.*?\n(?:(?=\n)|\z)/m)
str = ary.map.with_index do |s, i|
  temp_fname = "temp#{i}"
  File.write(temp_fname, s[/\n\K.*/m])
  heading = s[/\A.*/]
  execed = `cat #{temp_fname}|#{ext_cmd}`
  File.delete(temp_fname)
  [heading, execed] * $/
end

puts str * $/
0763デフォルトの名無しさん
垢版 |
2018/08/22(水) 01:56:27.69ID:PmiUKg2L
>>758 zsh
setopt rcquotes; sed -n '/^*/h; /^*/!{x;p;x;p;}' | paste - - \
| awk -F' ' -v OFS=' ' '$2 { print $1,$2 } ! $2 { printf "%c",0 }' \
| xargs -0 -n 1 -I@ -- zsh -c 'echo ''@'' | tee >(read -e | cut -f 1) | sed ''$d;'' | cut -f 2 | sort -u ;echo'

null区切りでチャンク分け。構造がもっと複雑になるとこの方針では対応できない。
0765デフォルトの名無しさん
垢版 |
2018/08/22(水) 04:46:03.18ID:h82tfzI1
単純に、別々のファイルに、分割すれば良いのでは?

* Fruit のファイル
* Animal のファイル

各ファイルを、sort, unique する
0766765
垢版 |
2018/08/22(水) 05:05:39.72ID:h82tfzI1
一旦、別々のファイルにしたなら、PowerShell で、

cat .\test.txt | sort | gu

gu は、Get-Unique のエイリアス。
漏れのPowerShell では、uniq のエイリアスは使えない
0769デフォルトの名無しさん
垢版 |
2018/08/22(水) 09:44:37.32ID:zudhoHB+
>>767
Linuxのディストリビューションでは最初からインストールされてるのがよくあってある程度有名で、sh互換でshしか知らなくても書けるからではないかな。
それとWebの実行環境があるというのも理由かも。こういう所で公開するのには都合が良い。
0770デフォルトの名無しさん
垢版 |
2018/08/22(水) 12:27:54.30ID:AfGRGNs6
>>769
そうなんですね!
みんなの回答見てると正規表現や少ないコードや難しい表現でコーディングできてて関心します‥
自分にはとても到達出来ない‥
0771デフォルトの名無しさん
垢版 |
2018/08/22(水) 15:46:06.44ID:PmiUKg2L
>>758 zsh
setopt rcquotes; sed -E -e 's:^(\* .*):{ echo ''\1''; sort -u; echo } << *:' -e 's:^$:*:' | zsh
xargsの区切り文字の辛さからは開放されたが、echo ''\1'' がイマイチだ。

なるほど、構造のあるデータはむしろファイル階層として表現したほうが自然か…
0772デフォルトの名無しさん
垢版 |
2018/08/22(水) 23:06:19.28ID:YlEU3d3x
>>758 Vim
$ cat odai-pt11-758.input | vim -es '+:g /\%(^\*.*\n\)\@<=/,/[ \t\n]*\%(\n\*.*\|\%$\)/ !sort | tr a-z A-Z | nl' '+%p' '+:q!' /dev/stdin
* Fruit
1 APPLE
2 BANANA
3 BANANA
4 ORANGE

* Animal
1 CAT
2 DOG
3 PENGUIN
$
0773デフォルトの名無しさん
垢版 |
2018/08/22(水) 23:55:42.77ID:h82tfzI1
64ビットWindows10 なら、WSL で、Ubuntu を入れると、
bash, vim, Python は最初から入っている

WindowsのExplorer では、BOMなしUTF-8 のファイルは検索できないから、
WSL でLinux側から、grep で検索している

シェルスクリプトの欠点は、パイプラインがテキスト渡しになる。
オブジェクトの型が無くなって、すべて文字列になる

一方、PowerShell ではオブジェクト渡しだから、オブジェクトの構造・型が維持できる

>>758-759
外部コマンドを切り替えるという抽象的な処理を、処理間にはさむのは難しい。
すべての処理の冒頭か最後で、一括でフィルターする方がバグらない
0774デフォルトの名無しさん
垢版 |
2018/08/23(木) 00:19:08.54ID:FMBOl46f
>>773
なるほど…
Powershellでの完全な回答例を見せていただけませんか?
標準入力からファイルに落として出力に吐くまで。オブジェクト渡しの雰囲気を感じたいです。
0775765
垢版 |
2018/08/23(木) 09:28:38.07ID:qUZ5eK5Q
Set-PSDebug -Strict # 変数宣言を強制する

$file = ( cat in.txt ) # 入力ファイル
$dat_basenames = @() # 拡張子なしのファイル名の配列

foreach ( $line in $file ) { # 各行
if( $line.Length -eq 0 ){ continue } # 空行は処理しない

if ( $line.Substring( 0, 1 ) -eq '*' ) { # 1文字目が、* なら
$fname = $line.Substring( 2 )
$dat_basenames += $fname # 追加
$fname += '.dat' # 拡張子つき
} else {
Add-Content $fname $line # 追記
}
}

foreach ( $dbname in $dat_basenames ) { # 各 .dat ファイル
$fname = $dbname + '.dat' # 拡張子つき
$str = "* ${dbname}`r`n"
$tmp = cat $fname | sort | gu # sort, unique
$str += ( $tmp -join "`r`n" ) # 改行区切り
echo $str
}

PowerShell で作った。
cd で、作業フォルダへ移動してから実行して

入力ファイル、in.txt から、各ファイルへ分割する。
分割後のファイル名を、Fruit.dat, Animal.dat として、各ファイルを処理した
0776デフォルトの名無しさん
垢版 |
2018/08/24(金) 05:00:24.02ID:QxK4Y8yu
点が10個一直線に並んでおり、各点が他の点との右方向の距離をいくつか知っている時、最も左にある点を求めよ

最も左にある点が求められない時はあと何の情報があれば求められるのかを最低個数で列挙すること

例1
a,b,cの点がある。
a点はb点が30右にあることを知っている。
b点は何も知らない。
c点はb点が-40右にあることをしっている。
結果
最も左にある点はa点

例2
a,b,c,dの点がある。
a点はb点が30右にあることを知っている。
b点は何も知らない
c点はd点が20右にあることを知っている。
d点は何も知らない。
結果
求められない。必要な情報は
a点からc点までの距離
0778デフォルトの名無しさん
垢版 |
2018/08/24(金) 08:02:12.41ID:ZkSPfVdV
「知っている」の主語が点に見えるけど
そうじゃないよね?

なんでそういう文にしたの?
0779デフォルトの名無しさん
垢版 |
2018/08/24(金) 10:33:50.94ID:phPhGhWW
連結リストを使って、出来上がったグラフが連結なら求められる
つまり、出来上がったグラフが二つ三つそれ以上に分かれている非連結グラフになってると、距離は分からない

……直感的には多分こうだが、何かしらの証明は必要
「連結グラフだが距離が分からない」反例があればいい
0780デフォルトの名無しさん
垢版 |
2018/08/24(金) 11:28:11.41ID:qtSNV1ih
>>776
点が10個あるなら例1,2両方とも判断不能。どっちもあと最低7個必要
しかも直線がRなのかR∪∞∪-∞なのかで解が変わるから提示しろ
あと出力はともかくデータの与えられ方くらい提示しろ
0781765
垢版 |
2018/08/24(金) 12:34:38.87ID:ZgK6e0Tb
text = File.read 'in.txt' # 入力ファイル

header = ""
str_hash = { }
result = [ ]

def sort_string ( head, hash, res )
res.push head
Hash[ hash.sort ].each_key { |key| res.push key } # sort
hash.clear # 空にする
end

text.each_line do |line| # 各行
line.chomp! # 末尾の改行を削除する
next if line.empty? # 空文字は処理しない

if line.start_with? '*' # 先頭文字が、* なら
sort_string( header, str_hash, result ) unless str_hash.empty? # 空でなければ
header = line
else
str_hash[ line ] = true
end
end

sort_string( header, str_hash, result )
puts result

Ruby で作った。
PowerShell よりは断然、作りやすい。
ただ、sort_string( ) を2か所で呼ぶのが、ダサイ
0782デフォルトの名無しさん
垢版 |
2018/08/25(土) 17:43:06.40ID:nE7N9dPk
お題
将棋の初期状態の駒40枚を
利き筋に他の駒がないように配置する
0785デフォルトの名無しさん
垢版 |
2018/08/25(土) 20:55:52.54ID:N/q1MSK+
お題を出す前に出題者は自分の解答を(解くことが可能かの確認も兼ね)作っておくのもルールだ
適切な入出力例や問題文にあるべき条件が抜けてるっていうのはそれをやってない証拠
0787デフォルトの名無しさん
垢版 |
2018/08/26(日) 08:39:25.15ID:8NHhsyIb
トランプの配置についてのアルゴリズムを考えてます。
トランプの横幅をX
トランプの高さをYとし
並べるトランプは偶数枚
全てのトランプを配置した時の全体を、トランプ配置と呼ぶとして
トランプ配置の横幅と縦幅の割合を、おおよそX:Yとしたい

この場合、アルゴリズムはどう考えたらいいでしょうか?
0788デフォルトの名無しさん
垢版 |
2018/08/26(日) 09:35:40.65ID:/JFPzkHn
ゴリ押しの総当たり

並べる枚数横にx縦にyが無尽蔵に大きくなれば比率に近づく
並べるトランプの上限が決まって無くて偶数枚だけが条件なら延々と並べる枚数を増やせばいい
一兆枚くらい並べれば比率はX/Yに近づく
1000000000億兆枚くらいのトランプを使えば横幅X高さYなんて充分に蟲出来るから全体の割合を調整するのは枚数が多ければ多いほどラク
10那由多ほど並べれば、本当にカードは点くらいなもので、縦横比率はx、yの枚数だけで決まる
0790デフォルトの名無しさん
垢版 |
2018/08/26(日) 09:59:10.89ID:O9adGcKd
>>788
バカなの?
> 並べるトランプの上限が決まって無くて偶数枚だけが条件
なら、縦横2枚ずつ(計4枚)並べればいいだけ
0791デフォルトの名無しさん
垢版 |
2018/08/26(日) 11:08:57.34ID:MXsSoN4T
n枚をnX nYの長方形の対角線上に斜めにならべれば
X:Yになるけど

問題あってる?
0792デフォルトの名無しさん
垢版 |
2018/08/26(日) 13:16:22.70ID:HHP/3bjy
>>787
┌─┐
│ ?│
└─┘
これを偶数枚並べて縦横比同じにするなら
こうだよね

┌─┬─┐
│ ?│ ?│
├─┼─┤
│ ?│ ?│
└─┴─┘
アルゴリズムもクソもないように思うのだが?
問題の書き方間違ってない?
0794デフォルトの名無しさん
垢版 |
2018/08/26(日) 16:57:45.44ID:2xrJOS4Z
枚数nに対して p * q = n を満たす正の整数 p, q の内 |p - q| / |p^2 + q^2| が最小になる組み合わせを求めるだけでしょ?
0795 ◆QZaw55cn4c
垢版 |
2018/08/26(日) 23:44:29.53ID:TLwXHnMN
https://mevius.5ch.net/test/read.cgi/tech/1480579110/981
に引き続いて、現に困ってしまった問題を出題

windows コマンドラインの xcopy コマンドを実装せよ
コマンドラインから「xcopy パス1 パス2」 と入力すると
パス1 以下にあるファイルをすべてパス2以下にコピーするようにせよ
ディレクトリについては、再帰的にコピーせよ

・現実の xcopy コマンドには色々なオプションがあるが、それは実装しなくてもよい
・読み込み対象のファイルの属性については考慮しなくてよい、読み込めるファイルのみ所定のパスにコピーできればそれでよい
・その他、コピーに問題のある状態が発生したときには、標準エラー出力にエラー内容を表示すればそれでいい

Windows Update の度にPCが激遅になるのに堪えかねて、C ドライブを SSD に換えることにしました。OS は再度インストールしなおすつもりです。
現在の C ドライブの内容は別途コピーしておいて、困ったときには参照できるようにしたいと思いました。
ところが、「xcopy c: x:/tmp」とすると、「メモリーが足りなくなった」といって途中で止まるのです…困りました…
0796 ◆QZaw55cn4c
垢版 |
2018/08/26(日) 23:57:13.93ID:TLwXHnMN
>>795
条件を追加します
ハードリンクやシンボリックリンクは考えなくともよい
xcopy パス1 パス2
のパス2 がパス1 の下にある場合、実装がまずいと永遠にコピーし続ける困ったことになるが、それも考慮しなくてもよい
(今回やりたいことは、「xcopy c: x:/tmp」であるので、これが問題なく動けばそれでよい…)
0800デフォルトの名無しさん
垢版 |
2018/08/27(月) 10:42:11.16ID:ywsjsNTA
>>795
Windowsならエクスプローラ使ってただコピーするのでは何か不都合があるのか?

まあ、お題としてそういうのなしで作れというのはアリだが、なんとなくWindowsの場合はエクスプローラが使っているのと同じライブラリ関数を一回呼び出すだけで終わってしまいそうな気がしてならない。
0805デフォルトの名無しさん
垢版 |
2018/08/27(月) 21:37:25.51ID:l2rfNjjd
>>802
トランプの横幅がYで高さがXでしょ?
で、偶数枚並べてX:Yにするんでしょ?
4枚でなるじゃん。およそどころかぴったりX:Yに。
0806デフォルトの名無しさん
垢版 |
2018/08/27(月) 21:41:44.66ID:l2rfNjjd
ごめん。逆か。まあしかしわかるよね。
0807 ◆QZaw55cn4c
垢版 |
2018/08/28(火) 00:09:17.09ID:mZeP8xuo
>>795-796
https://mevius.5ch.net/test/read.cgi/tech/1434079972/52

>>799
有用な情報ありがとうございます
なるほど、256バイト以上のパスは受け付けない、ですか…
MSDN https://msdn.microsoft.com/ja-jp/library/cc429198.aspx
なんかをみると、「この関数の Unicode 版を呼び出し、パスの前に "\\?\" という接頭辞を追加してください。」と書いてありますね
でも、C++ でユニコードバージョンに対応させるってどうするのだろう?#define UNICODE だけではダメみたいだし…
0810 ◆QZaw55cn4c
垢版 |
2018/08/28(火) 00:29:32.20ID:mZeP8xuo
>>809
>適切なスレ
って、あなたはどこを想定しているのですか?
0813デフォルトの名無しさん
垢版 |
2018/08/28(火) 16:31:53.27ID:C1AWmFJx
>>812
与えられると何処に書いてある?
0817デフォルトの名無しさん
垢版 |
2018/08/28(火) 23:00:50.43ID:QGrjhPlD
>>816
ぱっと見て
カードの数nとカードの縦と横の長さx, yが与えられたときに
総てのカードを並べて作った矩形の縦と横の長さをX, Yとして
|X/Y - x/y|が最小になるような(X, Y)を求める問題かと思ったんだけど
というか>>787は言葉足らず過ぎるしアスペ云々は言い過ぎだったわすまん
0818デフォルトの名無しさん
垢版 |
2018/08/28(火) 23:15:02.28ID:Gymzh0gE
n枚を矩形になるように並べる
なんてことは書いてないけど

あと
『|X/Y - x/y| が最小』
は数学的センスが無い
x,yを入れ替えても値が変わらない誤差の定義にしたい
0819デフォルトの名無しさん
垢版 |
2018/08/29(水) 00:49:59.45ID:e0sa1Xvi
>>818
矩形じゃないと縦幅と横幅が定義できないからそこはいいんでない?
>『|X/Y - x/y| が最小』は数学的センスが無い
はその通りだね
m := min{x, y}, M := max{x, y}, λ_x = X, λ_y = Y として
として |m/M - λ_m/λ_M|の最小値を求めるべきだね
0821デフォルトの名無しさん
垢版 |
2018/08/29(水) 08:06:49.08ID:e0sa1Xvi
>>820
『どんな形に並べても縦と横の方向が決まっていれば縦幅と横幅はある』
これは偽
少しは検討してから書き込んだらどうなんだ

後半が理解できないなら「テンソル」で調べてね
0822デフォルトの名無しさん
垢版 |
2018/08/29(水) 08:18:18.70ID:cDvJjkNL
横方向をx軸、縦方向をy軸としたx, y平面上に
トランプを並べるとする
有限サイズ(>0)のトランプを有限枚(>0)並べるので
トランプは有界で非空

xの上限 - xの下限 = 横幅
yの上限 - yの下限 = 縦幅
0827デフォルトの名無しさん
垢版 |
2018/08/29(水) 17:30:59.79ID:e0sa1Xvi
はいはい。頭いいね坊や
今度からは算数をきちんと勉強してからレスしてね
0828デフォルトの名無しさん
垢版 |
2018/08/29(水) 19:00:11.58ID:bZ2D0xRL
>>815
お前は勝手に汲み過ぎ
0830デフォルトの名無しさん
垢版 |
2018/08/29(水) 19:10:03.95ID:bZ2D0xRL
>>829
君が元の問題を書いた人か?
0831デフォルトの名無しさん
垢版 |
2018/08/29(水) 19:24:13.92ID:5cagDv75
お題:標準入力から(で始まり)で終わる顔文字が与えられる。この顔文字を太らせて標準出力に出力しなさい。
0832デフォルトの名無しさん
垢版 |
2018/08/29(水) 19:40:07.15ID:e0sa1Xvi
>>830
ちげーよ、出題者ならまともな条件追加してるわw
自分では何も提示しないのに難癖つけてくるアホがうざったいだけ
0834デフォルトの名無しさん
垢版 |
2018/08/29(水) 19:53:04.28ID:5CKWgBXh
トランプを並べる問題で
非ユークリッド空間を前提にしちゃう
頭がおかしい人
0836デフォルトの名無しさん
垢版 |
2018/08/29(水) 20:11:16.34ID:V4Xw96gq
>>787

並べるのが矩形に限らないのであれば
>>791のとおり任意の枚数で可能

矩形に並べるとして
枚数が与えられないなら>>792のとおり4枚で可能

与えられるなら>>794のとおり
与えられた自然数を最も僅差の2つの自然数の積で表す問題と同値
ただこの場合、問題文の不備を不問にしても
>並べるトランプは偶数枚
って条件がなぜ必要になるのか疑問が残るが…

いずれにしても問題としては終わってるので
これ以上長引かせるのは不毛
0839デフォルトの名無しさん
垢版 |
2018/08/29(水) 22:47:22.89ID:AXEWk4o3
書かれていない条件は勝手に解釈すればいい
その条件の問題を解くのが楽しいと感じるならその条件で回答すればいいだけ
グダグダと問題自体を統一する必要は無い
0847デフォルトの名無しさん
垢版 |
2018/08/31(金) 21:01:15.01ID:QC9x0InA
>>846
変数宣言を増やせばいくらでも行けるけどこれが限界かも
リフレクションはやっぱりクソだな
0848デフォルトの名無しさん
垢版 |
2018/08/31(金) 21:58:19.14ID:UbfaileO
>>247 Squeak Smalltalk, インスタンス変数で254個まで

| obj n limit |
obj := Object new assureUniClass.
n := 0.
[[obj addInstanceVarNamed: 'i', (n := n + 1) asString withValue: n] repeat] ifError: [].
limit := obj class instSize. "=> 254 "
obj instanceVariableValues asArray = (1 to: limit) asArray "=> true "
■ このスレッドは過去ログ倉庫に格納されています

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