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

■ このスレッドは過去ログ倉庫に格納されています
2020/11/30(月) 00:04:05.21ID:TF2Czp0y
プログラミングのお題スレです。

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

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

※前スレ
プログラミングのお題スレ Part18
https://mevius.5ch.net/test/read.cgi/tech/1594702426/
798デフォルトの名無しさん
垢版 |
2021/05/17(月) 21:53:58.96ID:GcVF7Ydc
>>797
変わって無いけどな
質疑に答えただけだ
そのついでに廊下の条件が緩くなってしまった
2021/05/17(月) 21:55:49.51ID:rt013aFx
>>798
条件が変われば別の問題だ
2021/05/17(月) 22:01:39.12ID:a/x20dO7
ぶっちゃけまだ題意を一意に解釈できていない
2021/05/17(月) 22:05:12.05ID:rt013aFx
出題者の題意をくみ取るのがお題じゃないんだから
まともに出題出来ないやつは出題するな

と思う
802デフォルトの名無しさん
垢版 |
2021/05/17(月) 22:11:18.99ID:GcVF7Ydc
>>800
>>801
すまん
要は建物内部の間取りを作れってだけの問題なんだ
難しく書いたつもりは無い
2021/05/17(月) 22:29:29.08ID:rt013aFx
難しいとか簡単とかじゃなくて「正しく書け」
804デフォルトの名無しさん
垢版 |
2021/05/17(月) 22:35:29.50ID:GcVF7Ydc
>>803
問題文は間違ってはいないだろ
補足が必要だっただけだ
2021/05/17(月) 22:43:35.04ID:rt013aFx
>>804
>>799
2021/05/17(月) 23:31:15.84ID:3M+J4Szq
>>785
え?
お題は>>773で出てる3つの場合だけ答えが出ればいいの?
そんなんプログラミングのお題にならんやろ?
プログラミングのお題と言うからには手計算ではできないような部屋数が30とかそうマス数が1000マスとかの入力でも対応できるプログラムって事になるでしょ?
>>773だったら手計算でもできるやん
807デフォルトの名無しさん
垢版 |
2021/05/17(月) 23:37:44.87ID:GcVF7Ydc
>>806
手計算なら意味無いよw
当然あらゆる入力に対応すべきだが、問題は3つだけ
808デフォルトの名無しさん
垢版 |
2021/05/17(月) 23:39:29.93ID:GcVF7Ydc
当然そのつもりで取り組んでるでしょ?
2021/05/17(月) 23:40:52.25ID:3M+J4Szq
まぁでも出題者の言いたい事はまぁわからないでもない
この手の話は計算量の勉強してると時々出てくる
有名なのが巡回セールスマン問題で、本当の巡回セールスマンでは「セールスマンが最も効率よく巡回できる最小経路を算出するアルゴリズムを出せ」でコレにはNP時間かかるアルゴリズムしか知られていない
しかし「最小でなくても最小値に“そこそこ近い”経路ならP時間で求められるアルゴリズム」はある
多分出題者もこの問題について「最小値じゃないだろうけどまぁまぁ小さい答えを出してくれるアルゴリズム」はもってるんだろう
しかしコレをお題として他の人に出題するなら、その“そこそこ”が数学的に“どのくらい”なら合格とするのかを明示しないとお題にならない
2021/05/17(月) 23:42:30.38ID:rt013aFx
>>806
そう解釈したから>>797

>>807
適切な回答は用意してあるんだよね?
811デフォルトの名無しさん
垢版 |
2021/05/17(月) 23:44:38.94ID:GcVF7Ydc
まあ簡単ではないとは思うが
問題文わかりづらかったかい?
2021/05/17(月) 23:45:24.54ID:rt013aFx
ちなみに部屋が6個以内ならわりと簡単
2021/05/17(月) 23:47:56.94ID:rt013aFx
>>811
ダメだこりゃ
814デフォルトの名無しさん
垢版 |
2021/05/17(月) 23:49:51.36ID:GcVF7Ydc
>>813
そんなに意味不明な問題だったか?w
マジかw
じゃあ明日にでも参考解答出すよ
2021/05/17(月) 23:52:44.00ID:3M+J4Szq
例えば>>777の設定で「総マス数が2N+Tまでは合格」とかその手の縛りにしないと“最小”という縛りでは問題にならない
2021/05/17(月) 23:59:37.40ID:rt013aFx
>>814
正しい出題が先

条件は>>773から変更は無いか
3題だけ解ければいいのか
時間やリソースを無視すれば解けるコードならいいのか
どの程度の規模の問題まで現実的な時間、リソースで解けれなければならないのか
2021/05/18(火) 00:00:50.43ID:IEQY6Fk+
今のままでは>>797で正解だ
(面積を追加すれば)
818デフォルトの名無しさん
垢版 |
2021/05/18(火) 00:09:57.21ID:Wc7qNqFy
>>817
773の条件なら797で正解
773で抜け落ちたが、当初は廊下は一続きであるという趣旨なんだよ
だが無闇に難易度を上げるつもりも無いから797で良し
819デフォルトの名無しさん
垢版 |
2021/05/18(火) 00:14:17.28ID:Wc7qNqFy
廊下一続き縛りでも、そこまで計算時間かからんと思うよ
巨大な室数と面積でも無ければね
もちろん、宇宙ホテルでは無い
2021/05/18(火) 00:15:55.93ID:IEQY6Fk+
何を言われてるのか全く分かってないようだ
2021/05/18(火) 00:20:36.53ID:/GE6kPFW
なんで>>815は問題改変したがるんだろう?
総当たりだろうが最小を出すことは出来るだろ
Nがでかくなると実用的な時間では答えが出ないかもしれないけど
2021/05/18(火) 00:31:54.78ID:U8UuOe0M
お題:コイントス(数学板の問題の改変)

コインを3回連続で投げるとき
表表表,表表裏,表裏表,裏表表,表裏裏,裏表裏,裏裏表,裏裏裏の8通りが等確率で出る

2人で先手と後手を決めて、先手が上記の8通りの中から1つ選び、後手は残った7通りの中から1つ選ぶ
そして1枚のコインを連続して投げ続けて、先に選んだパターンが出た者の勝利とする

例えばAさんが 表表裏 を選び、Bさんが 表裏表 を選んだとして、
コインの結果が、裏裏裏表表裏 となったら 表表裏 が先に出たのでAさんの勝利
コインの結果が、裏裏裏表裏表 となったら 表裏表 が先に出たのでBさんの勝利

同様のルールで、コインn回(3≦n≦6)のパターンを2人で予想し合うとき、
先手の予想を表す文字列を入力として、後手の勝率が最大となる後手の予想を表す文字列を出力せよ
入力で与える文字列として、"表" "裏" の代わりに "0" "1" を使用して良い
※入力と出力の文字列は同じ長さとする

例1: 入力 = 0000 → 出力 = 1000
例2: 入力 = 111000 → 出力 = 111100
823デフォルトの名無しさん
垢版 |
2021/05/18(火) 00:32:11.62ID:IEQY6Fk+
>>818
廊下が連結が元の題意ならそう訂正すれば良い
>>752からあくまで「補足」だと言い張りたいなら
あとから追加した条件「・廊下の一端は外周に接する事」も消さないと

>>819
部屋数A〜Zの26部屋
各部屋のサイズ20くらいまで
が現実的な時間、リソースで解ける
と思って良いか?
2021/05/18(火) 00:35:55.95ID:Kzl4VF4s
>>821
いや、総当たりなら出せるけど、それでは「巡回セールスマン問題の最小解を求めるアルゴリズムを求めよ」と言ってるのと同じで事実上総当たりしかない
もちろん総当たりアルゴリズム実装するのは難しい話てはないけど面白くもなんともない
しかし「最小値ではないが最小値にかなり近い値でよい」なら工夫のしようもある
例えばこの問題なら廊下の最小値は[N/2]だけどコレをどこかに真っ直ぐ引いてその両脇からN個の部屋をニョロニョロ伸ばして綺麗に長方形に治るようにする解なら多項式時間程度で求まる
しかしその方法で解が見つからなかったとしても、“あらゆる場合”を検討したわけではないから探索を次のステップに進めることができない
あくまで最小値を求めるならここで総当たりしてるダメな事を確認しないといけなくなる
しかし制限が最小値でなくて例えば2N+T以下くらいに緩ければこの方法で解を求める事が(多分)できる
まぁわかってもらえないようだからいいよ
総当たりプログラムなんて面白くもないのでROMします
2021/05/18(火) 00:36:09.32ID:IEQY6Fk+
>>822
ほとんど数学の問題
それともモンテカルロで解く?
2021/05/18(火) 00:38:53.07ID:IEQY6Fk+
>>824
アルゴリズムの工夫で現実的な時間で解けるという可能性は?
NP問題だと証明できた?
2021/05/18(火) 00:41:20.76ID:/GE6kPFW
>>824
> 総当たりプログラムなんて面白くもないのでROMします
よろしくねw
2021/05/18(火) 00:45:44.65ID:Kzl4VF4s
>>826
そんなのできるわけないやん?
つまりこの問題かperfect NPか?と聞いてるのと同じで全く新しいPerfectNPを見つけた事になる
そんなの論文レベル
まぁ多項式時間では解けそうにないなぁってのはあくまで第1感で実際には解けるもしれない、しれないけど自分が無理くさいと思ってる問題でペイも発生しないお遊びにそこまで頭と時間使う気になれない
チャレンジして「やっぱダメじゃん」で終わった時虚しさしか残らん
2021/05/18(火) 00:46:00.51ID:IEQY6Fk+
>>822
おもしろそうなので考えてみます
数学板などのカンニングは無しで

答えを書くのしばらく待って!
830デフォルトの名無しさん
垢版 |
2021/05/18(火) 00:46:12.96ID:Wc7qNqFy
>>823
廊下の一端は外周に接する、この条件は生き
部屋数は26まで、各面積は20坪までとする
(そこまで想定して無かったがw)

現実的な時間で解けない問題も過去には出てたからなあ
それでも猛者は取り組んでたよ
回転寿司の皿の問題とか
2021/05/18(火) 00:50:11.64ID:IEQY6Fk+
>>828
興味が無いならROMしててくださいな

以前みんなが指数関数オーダー以上でしか出来なかった問題を
線形オーダーで解いたことがあったのを思い出した
2021/05/18(火) 00:51:20.27ID:IEQY6Fk+
>>830
それ
回転寿司問題
私が線形オーダーに縮めたやつ
833デフォルトの名無しさん
垢版 |
2021/05/18(火) 00:52:23.06ID:Wc7qNqFy
>>832
おお、あの天才か!
凄かったね
2021/05/18(火) 00:53:17.18ID:IEQY6Fk+
ありがと!
2021/05/18(火) 00:58:38.60ID:Kzl4VF4s
>>829
その問題数学板では答えしか出てない
計算式とかアルゴリズムは出てないので見に行っても大丈夫
いわゆる受験で出てくる“確率漸化式”の話(Homogeneous Morkov Chainと言います)の話が理解できてれば行列計算のルーチン実装すればできます
HMCの話知らなくても受験数学レベルでギリギリできなくもない
2021/05/18(火) 01:35:07.81ID:IEQY6Fk+
>>835
わざわざ「カンニングは無しで」って書いたのに
わざわざヒント書くかねえ
しばらくこのスレ見ないことにする

>>830
とりあえず>>830の範囲で考えてみる
このスレにはしばらく来ないけど

寿司問題、ずいぶん前だよね
ずいぶん前からこのスレにいるなら
最初から出題は正しく曖昧性なく書こうよ
2021/05/18(火) 01:44:00.93ID:ZvUkaH8s
回転寿司問題って何?
2021/05/18(火) 01:57:24.03ID:Kzl4VF4s
>>836
ヒントになんかなってないよ
大丈夫
この単語ググっても答えになんか辿り着かないから
数学板にも答え出てません
まぁコレ以上なんかいうとホントに答えになるのでやめときます
頑張ってください
2021/05/18(火) 02:43:15.99ID:9nwYg6rU
>>837
これかな?18レス付いてた

お題:
回転寿司にやってきた私は、コンベア上のすべての寿司を食べて帰ることにしている
コンベアは1秒に1皿分の速度で流れ、目の前の皿を取るか取らないかを選ぶことができる
私は皿取ると同時に食べ始めるが、食べている間は次の皿を取ることができない
コンベア上の皿は、私が取る以外で勝手に追加されたり無くなったりしない

最初のコンベアの状態が次のような文字列で与えられる
"31_2"
数字(1文字)はその皿を食べ終えるのにかかる秒数を表し、_は皿がないことを表す
1文字目が私の目の前であり、1秒毎に左へ回転する
例えば、最初の皿を食べたとすると食べ終わった時の状態は以下である
"2_1_"

すべての寿司を食べ終わるまで最短何秒か求めよ

"12_3" > 6秒
"313__" > 8秒
"4_35_1264_23_434" > 60秒
"123456789123456789" > ?
2021/05/18(火) 16:27:57.97ID:JXk1qQ+R
部屋の問題はダンジョンや迷路生成のアルゴリズムに似た物じゃない
パラメタが違うだけ
起点(玄関兼廊下)から幹道(廊下)があって支道(部屋)を生成し全体を枠内に収める
841デフォルトの名無しさん
垢版 |
2021/05/18(火) 18:14:36.87ID:Tj0Ma2DE
対称性があるかどうかも分からない

巨大合成数を生成するのは掛け算するだけでかんたんだけど
それを二つに分けるのはちょっとばかし面倒でしょ
842デフォルトの名無しさん
垢版 |
2021/05/18(火) 22:17:06.70ID:Tj0Ma2DE
>>814で言ってた参考回答ってのはどれ?
843デフォルトの名無しさん
垢版 |
2021/05/18(火) 22:24:03.25ID:Wc7qNqFy
>>842
まだ大きい数字のチェックが終わってないが、出しましょうか
844デフォルトの名無しさん
垢版 |
2021/05/18(火) 22:38:28.26ID:Wc7qNqFy
>>842
これになります
大きい数字で条件違反が出るので、もうふた工夫要りますが
https://ideone.com/Rnq0SJ
845デフォルトの名無しさん
垢版 |
2021/05/18(火) 22:47:15.20ID:Wc7qNqFy
今気づいたけど、問題1のBが1個多いねw
846デフォルトの名無しさん
垢版 |
2021/05/18(火) 23:03:46.69ID:Tj0Ma2DE
500x500くらいになる手頃な大きさの例とか無いの?
2021/05/19(水) 02:11:25.87ID:x3QVnoKT
>>822 Ruby
https://ideone.com/dei4OY
2021/05/19(水) 08:35:28.49ID:l+JWTKLH
>>844
最小面積じゃないので不正解
849847
垢版 |
2021/05/19(水) 08:45:51.69ID:x3QVnoKT
>>822 Ruby
https://ideone.com/uiPy1x
最大深さnまでの負け以外の集計から勝率の集計に変更
850デフォルトの名無しさん
垢版 |
2021/05/19(水) 10:50:08.45ID:4kVeu0Qb
>>776
電話番号の最初が 010 や + ならば国際電話でそれ以外は全て国内電話だと思うが、本当にそれだけの判別で良いのか?
851デフォルトの名無しさん
垢版 |
2021/05/19(水) 11:00:46.78ID:4kVeu0Qb
>>776
携帯の電話番号というのを見落としていた。で、何が携帯番号かの資料は何処にあるのか?
2021/05/19(水) 14:13:04.56ID:9tgpiYrE
>>851
総務省の資料:
https://www.soumu.go.jp/main_sosiki/joho_tsusin/top/tel_number/q_and_a.html
853Mb
垢版 |
2021/05/19(水) 20:17:53.26ID:gE1os4Gp
>>678
> 仮名を清音に変換してから比較する
うん、発想はいいが、いまひとつ。
清音のキーと「長音」「濁音」「拗音」とかのキーをそれぞれ生成して、
それをどうにかして整列キーを生成して文字列順の整列ルーチンに
喰わせる、ということを考えたら完璧。
2021/05/19(水) 20:18:23.09ID:J+haubFC
>>852
ウザい
消えろ
腋臭
855Mb
垢版 |
2021/05/19(水) 20:24:02.49ID:gE1os4Gp
>>801
激しく同意する
2021/05/19(水) 21:05:39.99ID:gAtlXGbl
お題: 複数ある改行を1つの改行にまとめる関数join_newlinesを作成せよ

s = 'abc\ndef\n\nghi\n\n\n'
s = join_newlines(s)
print(s)
# 'abc\ndef\nghi\n'
2021/05/19(水) 21:20:54.19ID:nXtJTB3X
>>856 Ruby

p "abc\ndef\n\nghi\n\n\n?".split.join$/ # => "abc\ndef\nghi\n"
858デフォルトの名無しさん
垢版 |
2021/05/19(水) 21:27:22.52ID:Y3hdHfLU
>>856 sh
https://ideone.com/N0sB0l
2021/05/19(水) 21:27:45.26ID:Re+YCmzE
>>854
小学生の頃、かくれんぼしてたの覚えてるか? 今でも覚えてるからな。
2021/05/19(水) 21:47:06.50ID:hbAMoNi+
>>856
js
s.replace(/\n(\n)+/g,"\n")
2021/05/19(水) 22:05:24.67ID:l28FZW1e
>>856
haskell

import Data.List

joinNewLines = id
. concat
. map (\x -> if ( head x == '\n' ) then "\n" else x )
. group
2021/05/20(木) 01:40:59.75ID:Qzbw4Py0
>>856
Java
https://paiza.io/projects/HOfwpQaaNxuqRevODg2JWA
2021/05/20(木) 01:54:03.52ID:Qzbw4Py0
>>656
Java
https://paiza.io/projects/JJAgTMZxeJPmO4nFMZhE0g?language=java
2021/05/20(木) 02:25:44.46ID:z4YPx3Ex
>>847 Wrong Answer 0000→0001
>>849 Wrong Answer 0010→1100
2021/05/20(木) 02:28:35.27ID:z4YPx3Ex
>>864 訂正・補足
>>847 右のケースでWA 入力0001→出力0000
>>849 右のケースでWA 入力0010→出力1100
866デフォルトの名無しさん
垢版 |
2021/05/22(土) 16:23:03.67ID:dLrgkRLZ
>>856
Kotlin

https://paiza.io/projects/USNasdPKuJr9Q3PkcmDddA

Kotlinらしくスッキリ書けないかと少し考えた結果こうなった。
867デフォルトの名無しさん
垢版 |
2021/05/23(日) 06:54:55.26ID:g5kAwhGI
>>856 Python
def join_newlines(x): return "\n".join(x.split())
868デフォルトの名無しさん
垢版 |
2021/05/23(日) 13:13:24.19ID:PEJa2qxX
>>867
これで文字列の最初に空行があったり、文字列の最後に空行が続いたというような場合の復元ができるものですか?
869デフォルトの名無しさん
垢版 |
2021/05/23(日) 13:46:27.14ID:P4UGjjTl
まーた後だしジャンケンか
シビれるなぁ
2021/05/23(日) 20:08:36.95ID:jpQ65Iq9
後出しではないが、回答者もわかって書いてそう
871デフォルトの名無しさん
垢版 |
2021/05/23(日) 20:53:25.70ID:g5kAwhGI
>>868
確かにおかしいですね
一応直してみましたがあんまりすっきりとはいきませんでした
>>856 Python

def join_newlines(x): return "\n".join(("@"+x+"@").split())[1:-1]
2021/06/01(火) 23:19:09.17ID:FFj30Ig5
数学板より

お題 ヘビサイド関数で近似

問題は長いのでリンク先

分からない問題はここに書いてね 467
https://rio2016.5ch.net/test/read.cgi/math/1619884204/439-440

出力して欲しい3つの数値の例
上のリンクの下の440の方

【具体例1】
N = 3
l r s w
1 3 6 1
0 8 4 1
5 7 2 1

a=4, b1=6, b2=2 としたとき、F(a,b1,b2)=0 になり、これが最小値です。
a=3, b1=6, b2=2 としたとき、F(a,b1,b2)=4 になり、最小値ではありません。
a=4, b1=5, b2=3 としたとき、F(a,b1,b2)=4 になり、これも最小値ではありません。

【具体例2】
N = 4
l r s w
0 2 4 3
1 5 6 9
4 10 1 2
8 9 7 10

a=0.8, b1=1, b2=6 としたとき、F(a,b1,b2)=70 になります。
2021/06/02(水) 01:03:39.85ID:yNlOa9BD
>>872
ここは数学板じゃないので、
「この問題を解くと、どういう用途に役立つのか」
ということを聞いておきたいと思います。
2021/06/02(水) 02:49:47.48ID:idDWv9F6
>>873
残念ながらこの質問した人このレスを最後に消えてしまいました
なんの役に立つのやら
2021/06/02(水) 04:58:10.59ID:yNlOa9BD
そっか
残念
2021/06/02(水) 19:47:29.02ID:vod/9V8Y
そんな打算で問題解いてるわけじゃあるまいし
2021/06/04(金) 03:49:13.95ID:xd2yEhgg
お題:teshimatta関数関数を作れ
入力は1文字以上を保証される

teshimatta("起きた")
> "起きてしまった"

teshimatta("やった")
> "やってしまった"

teshimatta("あ")
> "ってしまっあ"

teshimatta("古畑任三郎")
> "古畑任三ってしまっ郎"
2021/06/04(金) 03:51:58.13ID:xd2yEhgg
>>877 修整
teshimatta("あ")
> "てしまっあ"

teshimatta("古畑任三郎")
> "古畑任三てしまっ郎"
2021/06/04(金) 07:01:44.23ID:2K7b+Cg2
>>877 Ruby

def teshimatta(str) = str.insert(-2, 'てしまっ')
2021/06/04(金) 18:25:22.58ID:gPAHqk4F
>>877

haskell

teshimatta = reverse . concat . zipWith ( flip ( : ) ) ( "っまして" : repeat "" ) . reverse
881デフォルトの名無しさん
垢版 |
2021/06/05(土) 03:23:53.65ID:lg0pCfQ9
>>877
Kotlin 及び Kotlin script

以下は kotlinc コマンドで REPL で動かした時のコピペ。
>>> はプロンプト。1行目が関数定義。2行目から使用している。

>>> fun teshimatta(s: CharSequence): CharSequence = if (s.isNotEmpty()) StringBuilder(s).insert(s.lastIndex, "てしまっ") else s
>>> teshimatta("起きた")
res1: kotlin.CharSequence = 起きてしまった
>>> teshimatta("やった")
res2: kotlin.CharSequence = やってしまった
>>> teshimatta("あ")
res3: kotlin.CharSequence = てしまっあ
>>> teshimatta("古畑任三郎")
res4: kotlin.CharSequence = 古畑任三てしまっ郎
>>>
882デフォルトの名無しさん
垢版 |
2021/06/05(土) 04:51:26.61ID:oLy6snUx
>>877 Python
def teshimatta(s): return s[:-1] + "てしまっ" + s[-1]
2021/06/06(日) 01:58:33.61ID:9Hxa2Z/w
お題:一筆書き
0:床、1:穴、2:スタート地点
からなる数字列が与えられる。スタート地点から縦または横に1マスずつ移動し、すべての床を通過することとする。
穴や外周は通過できない。床は一度通過すると穴となり二度目は通過できない。
すべての床を通過できれば「OK」、できなければ「NG」と表示せよ。

【例1】OK
0000
0210
0000
0100

【例2】NG
0000
0200
0010
0000

【例3】OK
000000
210000
000100
000001
000000

【例4】NG
000000
210000
000100
000000
000001
884デフォルトの名無しさん
垢版 |
2021/06/06(日) 10:18:31.19ID:W7O34OA1
>>883
まさかこれ頂点の次数を数えるだけで終わるのか?
2021/06/06(日) 10:29:23.85ID:bpZDov45
この場合の一筆書きってそういう意味じゃないと思う
886デフォルトの名無しさん
垢版 |
2021/06/06(日) 11:03:23.03ID:9mmqAG88
3次元使えばウルトラC
2021/06/06(日) 14:50:36.40ID:FtjWvhxj
オイラーグラフじゃなくてハミルトン路?
2021/06/06(日) 15:33:11.95ID:xo01P796
>>883
C++
テキトーに全探索
https://ideone.com/okNYSl
2021/06/07(月) 01:47:29.10ID:25jhXmhQ
>>883 C
>>888の真似
https://ideone.com/1427CY
2021/06/07(月) 15:19:10.72ID:kUu6kkFg
ハミルトン閉路問題とかいうやつか
2021/06/09(水) 09:58:07.70ID:yucbsR+t
NP完全らしいから事実上考えても無駄で総当たりで検索するしかなさそうやね
892デフォルトの名無しさん
垢版 |
2021/06/09(水) 11:44:53.31ID:7ehWzkTR
>>883 Prolog

'お題:一筆書き
0:床、1:穴、2:スタート地点
からなる数字列が与えられる。スタート地点から縦または横に1マスずつ移動し、すべての床を通過することと
する。
穴や外周は通過できない。床は一度通過すると穴となり二度目は通過できない。
すべての床を通過できれば「OK」、できなければ「NG」と表示せよ。'(_行,_列,L) :- nth1(_スタート,_数字列,2), 選択(_行,_列,_スタート,_数字列).

選択(_行,_列,_n,_数字列) :- \+(member(0,_数字列)), write('OK\n'),!.
選択(_行,_列,_n,_数字列) :- 隣接(_行,_列,_n,_n_2), nth1(_n_2,_数字列,0), '_n番目を1に変える'(1,_n_2,_数字列,_数字列_2), 選択(_行,_列,_n_2,_数字列_2).
選択(_,_,_,_) :- write('NG\n').

'_n番目を1に変える'(_n,_n,[_|R],[1|R]) :- !.
'_n番目を1に変える'(M,_n,[_現在位置|R1],[_現在位置|R2]) :- succ(M,N), '_n番目を1に変える'(N,_n,R1,R2).

隣接(_行,_列,_現在位置,_隣接) :- _隣接 is _現在位置 - 1, \+(0 is _隣接 mod _列).
隣接(_行,_列,_現在位置,_隣接) :- _隣接 is _現在位置 + 1, \+(1 is _隣接 mod _列).
隣接(_行,_列,_現在位置,_隣接) :- _隣接 is _現在位置 - _列, _隣接 > 0.
隣接(_行,_列,_現在位置,_隣接) :- _隣接 is _現在位置 + _列, _隣接 =< _行 * _列.
893デフォルトの名無しさん
垢版 |
2021/06/09(水) 11:48:43.27ID:7ehWzkTR
>>884 すみません。一箇所間違えました。

Prolog

'お題:一筆書き
0:床、1:穴、2:スタート地点
からなる数字列が与えられる。スタート地点から縦または横に1マスずつ移動し、すべての床を通過することと
する。
穴や外周は通過できない。床は一度通過すると穴となり二度目は通過できない。
すべての床を通過できれば「OK」、できなければ「NG」と表示せよ。'(_行,_列,_数字列) :- nth1(_スタート,_数字列,2), 選択(_行,_列,_スタート,_数字列).

選択(_行,_列,_n,_数字列) :- \+(member(0,_数字列)), write('OK\n'),!.
選択(_行,_列,_n,_数字列) :- 隣接(_行,_列,_n,_n_2), nth1(_n_2,_数字列,0), '_n番目を1に変える'(1,_n_2,_数字列,_数字列_2), 選択(_行,_列,_n_2,_数字列_2).
選択(_,_,_,_) :- write('NG\n').

'_n番目を1に変える'(_n,_n,[_|R],[1|R]) :- !.
'_n番目を1に変える'(M,_n,[_現在位置|R1],[_現在位置|R2]) :- succ(M,N), '_n番目を1に変える'(N,_n,R1,R2).

隣接(_行,_列,_現在位置,_隣接) :- _隣接 is _現在位置 - 1, \+(0 is _隣接 mod _列).
隣接(_行,_列,_現在位置,_隣接) :- _隣接 is _現在位置 + 1, \+(1 is _隣接 mod _列).
隣接(_行,_列,_現在位置,_隣接) :- _隣接 is _現在位置 - _列, _隣接 > 0.
隣接(_行,_列,_現在位置,_隣接) :- _隣接 is _現在位置 + _列, _隣接 =< _行 * _列.
2021/06/09(水) 14:15:52.13ID:10Zj2z/H
>>891
総当たりでやる前に市松判定ではじく処理くらいは入れてもいいと思う
2021/06/09(水) 18:59:44.38ID:5vxiK06u
お題:今日は第何曜日か計算して現在の日時を以下のように出力する
2021/06/09/第2水曜日/19:21/

ヒント
今日の日にちを7で割る 例:9 / 7
少数点以下は切り捨て
1を足す
カレンダーを見ながら計算すると分かりやすい
2021/06/09(水) 19:53:11.25ID:xvC+FdYf
>>895 Ruby

puts Time.now.then{|t| t.strftime('%Y/%m/%d/第%%d%%s曜日/%R') % [(t.day + 6) / 7, %w[日 月 火 水 木 金 土][t.wday]]}

# => 2021/06/09/第2水曜日/19:52
2021/06/09(水) 21:01:27.30ID:jvfDlPRh
>>895のヒント通りだと7の倍数の日付で不具合が発生するが宿題か?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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