すべてのパンケーキをコーティング


35

プレートの上にパンケーキの山があり、その上にシロップの塊があり、厚すぎて側面を下ることができません。各パンケーキの両方の面が少なくともシロップに触れるまでは食べられませんが、今は一番上のパンケーキの片方の面だけが触れています。

シロップは1つのパンケーキにも染み込むことはありませんが、2つのパンケーキの間で直接接触することで無期限に転送できます。パンケーキの表面がシロップに触れると、シロップで永久にコーティングされたとみなされ、シロップでコーティングされた非シロップでコーティングされた面も同様にコーティングされます。シロップをプレートの上面との間で転送することもできます。

パンケーキの選別と同様に、1つ以上のパンケーキの下にヘラを挿入し、全体をひっくり返すことにより、すべてのパンケーキの表面をシロップでコーティングします。(残念ながら、このヘラはシロップ耐性があり、パンケーキの表面に触れることでシロップを配布するのに役立ちません。)悲しいことに、どのパンケーキの表面がシロップに触れたのかわからなくなりますが、あなたが作ったフリップを覚えています。

あなたの過去のフリップを考えると、あなたのパンケーキがすべてシロップでまだコーティングされているかどうかを判断できますか?

チャレンジ

パンケーキの数に正の整数Nを取り込み、これまでに行ったフリップの正の整数のリスト(すべて<= N)を取り込むプログラムを作成します。リスト内の各数字は、反転したパンケーキの数を表します。パンケーキがコーティングされている場合は真実の値を出力し、そうでない場合は偽の値を出力します。(真実/虚偽の定義

入力はstdinまたはコマンドラインから取得し、出力はstdout(または最も近い代替)に送信する必要があります。入力に少し余分な書式設定が必要な場合は問題ありません。たとえば、リストの[1, 1, 2, 2]代わりに1 1 2 2

N = 2と仮定すると、プレート上に2つのパンケーキのスタックがあり、上からシロップが始まります。

リストがの場合1 1 2 2、これは...

  • 上部のパンケーキを反転-下部のパンケーキの上面をコーティング
  • 再びトップを反転-トップパンケーキの元の底面をコーティング
  • 両方を裏返す-プレートをコーティングする
  • 両方を再び反転-ボトムパンケーキの元の底面をコーティング

すべての4つの面がコーティングされているので、出力は次のようなものになるだろうTrue1

リストがの場合1 2 2 1、これは...

  • 上部のパンケーキを反転-下部のパンケーキの上面をコーティング
  • 両方を反転-何もコーティングしない
  • 両方を再び反転-何もコーティングしない
  • 再びトップを反転-トップパンケーキの元の底面をコーティング

プレートに触れ顔がまだシロップフリーですので、出力は次のようなものになるだろうFalseか、と0

ノート

  • フリップリストは任意に大きく、空にすることができます。その場合、出力は偽になります。
  • プレートはシロップキャリアとして機能しますが、コーティングされているかどうかは関係ありません。(実際、フリップソリューションプレートをコーティングするのは、接触するパンケーキフェースをコーティングする必要があるためですが、それは関係ありません。)
  • プレートは反転できません。
  • これらのパンケーキは、側面がなく、向かい合った2つの面のみを持つ単位ディスクであると想定できます

得点

これはコードゴルフです。バイト単位の最短ソリューション勝ちです。


4
これは非常に素晴らしい挑戦です。;)
Soham Chowdhury 14

リストを取得してブール値を返す関数は大丈夫ですか?
誇りに思ってhaskeller 14

9
誰もがこの言語でそれを実装できるならば、ボーナスがあるはずです
grc 14

3
@grcちょうどそれのための賞金があります!
カルバンの趣味14年

2
パンケーキスタックでの私のソリューション:Put syrup on the pancakes!;)
rodolphito 14年

回答:


9

CJam、32 30 29バイト

q~2@#2b\{)/(W%)1$0=|@]s:~}/:&

オンラインでお試しください。

テストケース

$ cjam pancakes.cjam <<< '2 [1 1 2 2]'; echo
1
$ cjam pancakes.cjam <<< '2 [1 2 2 1]'; echo
0

使い方

q~                            " N, L := eval(input())                                     ";
  2@#2b                       " P := base(2 ** N, 2)                                      ";
       \{                }/   " for F in L:                                               ";
         )/                   "   P := split(P, F + 1)                                    ";
           (W%)               "   T, U, V := P[1:], reverse(P[0])[:-1], reverse(P[-1])[0] ";
               1$0=|          "   V |= U[0]                                               ";
                    @]s:~     "   P := map(eval, str([U, V, T]))                          ";
                           :& " print and(P)                                              ";

17
CJam?CRupに似ています。
インゴバーク14

12

ハスケル、92 90 86 84 114 110 99 98

完全なプログラムの要件は非常に面倒です。なぜこれが必要なのでしょうか。

m(n:s)=all(<1)$foldl(\r@(p:s)n->reverse(take n s)++(p*r!!n):drop n s)[0..n]s
main=readLn>>=print.m

このソリューションは、隣接するパンケーキが同じ側面を共有している場合、側面のリストでパンケーキの山を表すことで機能します。すべての辺は数字であり、値がゼロの場合、辺はコーティングされます。

として実行:

*Main> main
[2,1,1,2,2]
True

1
Python 2を使用していない場合の+1;)
カルビンの趣味14

@ Calvin'sHobbies lol
誇りに思っているhaskeller 14

完全なプログラムが必要なのではないかと思う
ジョンドヴォルザーク

1
@JanDvorak私はそれを見ませんでした...私はちょうど質問のコメントで機能が大丈夫かどうか尋ねました。そうでない場合は、変更します
誇りに思ってhaskeller 14

@proudhaskeller今、あなたはOPから明示的に言われました...私はすぐに変化を期待しています。
ジョンドヴォルザーク14

10

Python、92バイト

私はこれがうまくいくと思う:

s=[1]+[0,0]*input()
for f in input():x=f*2;s[0]=s[x]=s[0]|s[x];s[:x]=s[x-1::-1]
print all(s)

シロップでコーティングされたものを覚えておくために、パンケーキの表面のリスト(プレートが含まれています)を使用します。リストの一部を反転することでパンケーキが反転しますが、シロップは最初に上面と新しく表示された面の間で転送されます。

使用法:

$ python pancakes.py
2
1, 1, 2, 2
True

それは本当に逆に本当に賢い方法です。+1
Soham Chowdhury 14

「is all syrupy」チェックからプレートを除外しているようです。する必要がありますか?すべてのパンケーキ面がコーティングされると、プレートはシロップ状のパンケーキ面に接触するため、プレートもシロップ状になります。
user2357112は、Monicaを14

@ user2357112はい、そうです。ありがとう!
GRC

8

Python 2:75

grcとfeersumのソリューションの簡略化。

n,b=input()
s=[1]+[0]*n
for x in b:s[:x+1]=s[x::-1];s[x]|=s[0]
print all(s)

2*n+1接触するエッジは常に同じであるため、パンケーキエッジのシロップ状態を保存することは冗長です。代わりに、これは各n+1パンケーキジャンクションの状態を記憶します。これにより、シロップの転送が自動的に考慮されます。

必要な更新はx、フリップで切り取ったときにジャンクションでシロップを保持することだけです。これはでポストフリップシロップをINGのか、によって行われる0x

2回入力しても、文字数には影響しません。

s=[1]+[0]*input()
for x in input():s[:x+1]=s[x::-1];s[x]|=s[0]
print all(s)

5

Python 2、93バイト

最初は自分の答えを投稿するつもりでしたが、その後grcは1分前に​​非常に似たものをすでに投稿していました。だから私はいくつかの改善を考え出そうとしました。私が見つけることができる唯一のものは、辞書式リストの比較を使用することですall()

編集:文字数を変更しないさまざまな入力方法を試してみて失敗したことによって生じるミスを修正しました。

n,F=input()
L=[1]+2*n*[0]
for f in F:f*=2;L[0]=L[f]=L[0]|L[f];L[:f]=L[~-f::-1]
print[1]*2*n<L

サンプル入出力:

2, [1, 1, 2]

 

False



2

ハスケル、129 125

t(m:l)=all(any(<1).(\i->foldr(\n->foldr($)[].map(n%))[i]l))[0..m]
n%i|i>n=(i:)|i<n=(n-i:)|1>0=(n:).(0:)
main=readLn>>=print.t

おそらくまだ完全にはゴルフされていませんが、コーティングされた面のリストを操作しなくても機能します。代わりに、特定のパンケーキの特定の面が最初に上面であったものと接触したことがあるかどうかを把握するために、逆方向に働きます。 foldrフリップのリストを効果的に逆方向にトラバースするため、reverse

アルゴリズムは次のとおりです:関連するすべてのサイド([0..m])をマップし、各ステップでシロップを継承するサイドのリストを作成します。最初からリストはただ[i]ですが、nパンケーキのフリップで、各エントリになり[n-i]ますi<n[n,0]もしi==n、及び[i]場合i>n。問題の面は、すべてのフリップの後の結果リストに0any (<1))が含まれる場合にのみコーティングされています。 all残りを行い、そしてmain実行し、これらすべてを実行可能なプログラムに変換します。

プログラムはから入力を取るstdinの形式で[n_pancakes, flip1, flip2, flip3, ...]改行で終了し、。


興味深いアプローチ。
誇りに思ってhaskeller 14年

関数を使用して継承リストをコーディングしてリストを使用するn%i|i>n=[i]|i<n=[n-i]|0<1=[n,0]代わりに、つまり、foldr($)[].map(n%)haveの代わりに(=<<).(%)、すべての継承をマップしてそれらを結合します。
誇りに思ってhaskeller 14年

[0..]ゼロからパンケーキをコーティングする代わりに、コーティングされたパンケーキを0として表すことができることに気付きました。ありがとう!
誇りに思ってhaskeller 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.