불가리아 솔리테어


9

Bulgarian Solitaire 는 Martin Gardner Scientific American의 수학 칼럼에서 인기를 얻은 싱글 플레이어 게임 입니다.

당신은 N같은 카드를 더미로 나눕니다. 당신은 각 더미에서 카드를 가져 와서 제거 된 카드로 새로운 더미를 형성합니다. 이미 본 상태에 도달 할 때까지이 프로세스를 반복하므로 계속 반복하면 루프가 반복됩니다.

예를 들어, 8카드가 있고 더미 5와 더미로 분리되어 있다고 가정합니다 3. 파일 크기는 내림차순으로 작성합니다 5 3. 게임의 대본은 다음과 같습니다.

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

먼저 더미를 떠나, 두 더미의 각에서 카드를 제거 4하고 2, 그리고 새로 만든 더미 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

이것은 내 파이썬 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
Dennis

@Dennis 감사합니다. 어떻게해야하는지 알 수 없었습니다. 그렇게 할 방법이 있다는 것을 알았습니다.
Justin

1
완전히 독립적으로 수행 한 작업은 다음과 같습니다 QW!}QY~Y]Q=Q_S+]lQfTmtdQQ.. 그것은 정확히 같은 특성을 지니고 있습니다.
isaacg


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실제로 한 문자가 짧습니다 ^^
daniero

아, 너무 나쁘다. 감사.
britishtea


1

파이썬 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의 답변과 비슷하지만 추가를 추가로 대체하고 마지막 두 줄을 제거합니다.

샘플 출력 :

[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]

음? 이것은 동일합니다. 당신은 단순히 완전히 명백한 골프 단계를 밟았습니다. 난 내에 돌아 왔을 때, 나는 (그러나 당신은 그것을보고 싶은, 반대 또는 그)를 golfed,이 광산의 중복 대답은 지금 발견
저스틴

내 게시물을 게시 한 후에 만 ​​답을 찾았습니다. 나는 그것들이 서로 중복되는 것을 고려하여 괜찮습니다.
Nathan Merrill



1

CJam, 40 36 34 바이트

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

여기에서 테스트하십시오. [5 3]STDIN 필드에 입력을 CJam 스타일 배열로 입력하십시오 . 출력 형식은 비슷하므로 대괄호와 공백은 구분 기호로 사용됩니다.

내가 이것을 더 아래로 골프를 쳤다해도 (확실히 가능하다), 이것으로 Pyth를 이길 방법은 없습니다. 아마 J.를 배울 때가되었습니다.


J가 도움이 될지 잘 모르겠습니다. APL이 38 미만일 수 없습니다.
TwiNight

1

자바 스크립트 (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

@ xnor Ooh 고맙습니다.
Justin

[5,3]에서는 작동하지 않습니다
Nathan Merrill

이것은에 대한 잘못된 출력을 제공합니다 [4,2,2]. 그래도 쉽게 고칠 수 있습니다.
xnor

0

파이썬 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])

이미 파이썬 솔루션이 게시되었지만 루프가 아닌 재귀 함수 호출이 있습니다. 리스트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.