ブルガリアソリティア


9

ブルガリアソリティアは、マーティンガードナーScientific Americanの数学的コラムで人気を博したシングルプレイヤーゲームです。です。

あなたが持っている N同じカードを山に分けています。あなたは各山からカードを取り、取り除かれたカードで新しい山を形成します。すでに見た状態に到達するまでこのプロセスを繰り返し、続行するとループが繰り返されます。

たとえば、8カードが5あり、の山との山に分割されているとします3。杭のサイズを降順に記述します5 3。ここにゲームのトランスクリプトがあります:

5 3
4 2 2
3 3 1 1 
4 2 2

あなたは最初の山を残し、2つの山のそれぞれからカードを取り外す42、との新しく作成された杭2与えます4 2 2。次のステップでは、これらは減少3 1 1し、新しいの山が続き3ます。最後に、最後のステップでサイズの山が空になり、すでに表示されているものが1生成さ4 2 2れるため、停止します。

パイルサイズの合計は同じままであることに注意してください。

あなたの目標は、与えられた開始構成からゲームのそのようなトランスクリプトを印刷することです。これはコードゴルフなので、最も少ないバイトが勝ちます。

入力

初期の杭サイズを表す降順の正の数のリスト。STDINまたは関数入力を介して入力を取得します。リストのような任意の構造を使用できます。

N入力としてカードの総数を取得しません。

出力

ブルガリアソリティアのゲームが通過するパイルサイズのシーケンスを印刷します。返却ではなく、印刷が必要であることに注意してください。各ステップは独自の行である必要があります。

各行には、のない降順の正の数のシーケンスが必要0です。セパレータ、開始トークン、終了トークンを使用できます(たとえば、[3, 3, 1, 1])。数字は複数の桁を持っている可能性があるため、何らかの方法で分離する必要があります。

リピートに至るまで、見ているパイルサイズのスプリットを印刷します。したがって、最初の行は入力であり、最後の行は前の行の繰り返しでなければなりません。他の繰り返しはありません。

テストケース

>> [1]
1
1

>> [2]
2
1 1
2

>> [1, 1, 1, 1, 1, 1, 1]
1 1 1 1 1 1 1
7
6 1
5 2
4 2 1
3 3 1
3 2 2
3 2 1 1
4 2 1

>> [5, 3]
5 3
4 2 2
3 3 1 1
4 2 2

>> [3, 2, 1]
3 2 1
3 2 1

>> [4, 4, 3, 2, 1]
4 4 3 2 1
5 3 3 2 1
5 4 2 2 1
5 4 3 1 1
5 4 3 2
4 4 3 2 1

回答:


4

バース、40 25

QW!}QY~Y]Q=Q_S+fTmtdQ]lQQ

これは私のpython 2回答の翻訳にかなり近いです。

サンプルの実行:

入力:

[4,4,3,2,1]

出力:

[4, 4, 3, 2, 1]
[5, 3, 3, 2, 1]
[5, 4, 2, 2, 1]
[5, 4, 3, 1, 1]
[5, 4, 3, 2]
[4, 4, 3, 2, 1]

使い方:

Q                          Q = eval(input()) # automatic
 W!}QY                     while not Q in Y:
      ~Y]Q                     Y += [Q]
               fTmtdQ                     filter(lambda T: T, map(lambda d: d - 1, Q))
            _S+      ]lQ           sorted(                                             + [len(Q)])[::-1]
          =Q_S+fTmtdQ]lQ       Q = sorted(filter(lambda T: T, map(lambda d: d - 1, Q)) + [len(Q)])[::-1]
                        Q      print(Q)
QW!}QY~Y]Q=Q_S+fTmtdQ]lQQ

1.あなたは置き換えることができv$input()$Q。2.順にリストを保存する場合、必要のないNすべてで:W!}QYQ~Y]Q=Q_S+fTmtdQ]lQ;Q
デニス

@デニスありがとう、どうすればいいのかわからなかった。そうする方法があることを知っていました。
ジャスティン

1
これが私がやったことです、完全に独立しています:QW!}QY~Y]Q=Q_S+]lQfTmtdQQ。それは、可換性まで、まったく同じです。
isaacg 2014年


3

ルビー、98

f=->c{g={c=>1}
p *loop{c=(c.map(&:pred)<<c.size).sort.reverse-[0]
g[c]?(break g.keys<<c): g[c]=1}}

説明

  • 入力はラムダの引数として使用されます。それは期待していArrayます。
  • 以前のゲームの状態はに保存されますHash g
  • 新しいゲームの状態を作成するには、を使用Array#mapしてすべての要素を1つ減らし、の長さをArray要素として追加し、それを降順に並べ替え、要素を削除します0
  • ゲームの状態が以前に確認されたかどうかgを確認するには、新しいゲームの状態のキーがあるかどうかを確認するだけで十分です。

+1ここで本当にすっきりとしたルビーゴルフを!ただし、sort_by確かに賢いですsort.reverseが、実際には1文字短くなっています^^
daniero 2014年

ああ、それは残念です。ありがとう。
britishtea 2014年


1

Python 2〜103

p=input()
m=[]
print p
while p not in m:m+=[p];p=sorted([x-1 for x in p if x>1]+[len(p)])[::-1];print p

Quincunxの回答に似ていますが、appendsを加算に置き換え、最後の2行を削除します。

出力例:

[4, 4, 3, 2, 1]
[5, 3, 3, 2, 1]
[5, 4, 2, 2, 1]
[5, 4, 3, 1, 1]
[5, 4, 3, 2]
[4, 4, 3, 2, 1]

うーん、似てる?これは同じです。完全に明白なゴルフのステップを踏んだだけです。私が私のものに戻ったとき、私はそれをゴルフして、そしてこれが今私の私の重複した答えであることを発見しました(またはあなたがそれを見たいけれどもその逆)
Justin

私の投稿後に初めて私はあなたの答えを発見しました。お互いの重複を考慮しても問題ありません。
Nathan Merrill



1

CJam、40 36 34バイト

]l~{a+_W=_p:(_,+$W%{},1$1$a#0<}gp;

ここでテストしてください。次のように入力をCJamスタイルの配列として入力します[5 3]STDINフィールドにます。出力形式は類似しているため、角括弧とスペースを区切り文字として使用します。

私がこれをさらに下にゴルフしても(それは間違いなく可能です)、これでPythを倒す方法はありません。多分それはJ.の説明を後で学ぶ時です。


Jが役立つと確信していない、私は38の下に私のAPLを取得することはできません
TwiNight

1

JavaScript(E6)113

これまでの最悪のエントリ:(

F=l=>{
  for(k=[];console.log(l),!k[l];)
    k[l]=l=[...l.map(n=>(p+=n>1,n-1),p=1),l.length].sort((a,b)=>b-a).slice(0,p)
}

FireFox / FireBugコンソールでテストする

F([4,4,3,2,1])

出力

[4, 4, 3, 2, 1]
[5, 3, 3, 2, 1]
[5, 4, 2, 2, 1]
[5, 4, 3, 1, 1]
[5, 4, 3, 2]
[4, 4, 3, 2, 1]

1

パイソン2、148 130 101

l=input()
s=[]
print l
while l not in s:s+=l,;l=sorted([i-1for i in l if 1<i]+[len(l)])[::-1];print l

これは単に、以前のすべての反復を記憶し、新しいものがそのリストにあるかどうかを確認するだけです。その後、印刷します。

サンプルの実行:

入力:

[4,4,3,2,1]

出力:

[4, 4, 3, 2, 1]
[5, 3, 3, 2, 1]
[5, 4, 2, 2, 1]
[5, 4, 3, 1, 1]
[5, 4, 3, 2]
[4, 4, 3, 2, 1]

編集:私はゴルフにスペックを再読し、さらに多くのゴルフを適用した。


リストをリストとして印刷するだけでかまいません。
xnor 2014年

@xnor Oohありがとう、完全に見逃しました。
ジャスティン

これは[5,3]では機能しません
Nathan Merrill

これにより、の出力が正しくなくなります[4,2,2]。しかし、簡単な修正があります。
XNOR

0

Python 3:89文字

g=lambda l,s=[]:print(l)!=l in s or g(sorted([x-1for x in l if~-x]+[len(l)])[::-1],s+[l])

すでに投稿されているPythonソリューションとよく似ていますが、ループではなく再帰的な関数呼び出しを使用します。リストsはすでに見た分割を保存し、繰り返しの場合は再帰を短絡します。

関数print()(これはPython 3です)は、各ループで何らかの方法で呼び出す必要があります。トリッキーなことは、はlambda単一の式しか許可しないため、実行できないことですprint(l);...。また、を出力しますがNone、これは扱いにくいものです。print(l)不平等の片側に置くと、==なんらかの理由で動作しません。

リストに貼り付ける別のアプローチでは、同じ数の文字を使用します。

g=lambda l,s=[]:l in s+[print(l)]or g(sorted([x-1for x in l if~-x]+[len(l)])[::-1],s+[l])

を使用print(*l)すると、4 2 2ではなくのように出力がフォーマットされます[4,2,2]

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.