Bulgarian Solitaire to gra dla jednego gracza, popularna przez Martina Gardnera w jego kolumnie matematycznej w Scientific American .
Masz N
identyczne karty, podzielone na stosy. Z każdego stosu bierzesz kartę i tworzysz nowy stos z usuniętymi kartami. Powtarzasz ten proces, dopóki nie osiągniesz stanu, który już widziałeś, więc kontynuowanie powtórzy pętlę.
Załóżmy na przykład, że masz 8
karty podzielone na stos 5
i stos 3
. Piszemy rozmiary stos w kolejności malejącej: 5 3
. Oto zapis gry:
5 3
4 2 2
3 3 1 1
4 2 2
Najpierw usuwasz kartę z każdego z dwóch stosów, pozostawiając stosy 4
i 2
oraz nowo utworzony stos 2
rozdawania 4 2 2
. W następnym kroku te zmniejszają się, 3 1 1
a wraz z nimi nowy stos 3
. Wreszcie ostatni krok opróżnia stosy wielkości 1
i produktów, 4 2 2
które już się pojawiły, więc przestajemy.
Pamiętaj, że suma rozmiarów stosów pozostaje taka sama.
Twoim celem jest wydrukowanie takiego zapisu gry z danej konfiguracji początkowej. To jest kod golfowy, więc wygrywa najmniej bajtów.
Wejście
Lista liczb dodatnich w porządku malejącym reprezentujących początkowe rozmiary stosów. Wprowadź dane przez STDIN lub funkcję. Możesz użyć dowolnej struktury podobnej do listy.
Nie dostajesz całkowitej liczby kart N
jako danych wejściowych.
Wynik
Wydrukuj sekwencję rozmiarów stosów, przez którą przechodzi gra Bułgarski pasjans. Pamiętaj, że drukowanie jest wymagane, a nie zwracane. Każdy krok powinien być własną linią.
Każda linia powinna mieć ciąg liczb dodatnich w porządku malejącym bez żadnych 0
. Możesz mieć separatory oraz tokeny początkowe i końcowe (na przykład [3, 3, 1, 1]
). Liczby mogą zawierać wiele cyfr, dlatego należy je jakoś rozdzielić.
Wydrukuj podziały wielkości stosu, które widzisz, aż do powtórzenia. Tak więc pierwszy wiersz powinien być wejściem, a ostatni wiersz powinien być powtórzeniem poprzedniego wiersza. Nie powinno być żadnych innych powtórzeń.
Przypadki testowe
>> [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
v$input()$
zQ
. 2. Jeśli przechowujesz listę w malejącej kolejności, wcale nie potrzebujeszN
:W!}QYQ~Y]Q=Q_S+fTmtdQ]lQ;Q
QW!}QY~Y]Q=Q_S+]lQfTmtdQQ
. Jest dokładnie taki sam, charakter dla postaci, aż do przemienności.CJam, 26 bajtów
Wypróbuj online.
Przykładowy przebieg
źródło
:p
pracował, mógłbym ...:p
Ruby, 98
Wyjaśnienie
Array
.Hash
g
.Array#map
aby zmniejszyć każdy element o 1, dodaj długość elementuArray
jako element, posortuj go w malejącej kolejności i usuń element0
.g
ma klucz do nowego stanu gry.źródło
sort_by
rzecz jest z pewnością sprytna, wsort.reverse
rzeczywistości jest o jedną postać krótsza ^^CJam,
35 3433 bajtów(Cholera, ta przerwa w zasilaniu, której nie byłem pierwszą osobą, która opublikowała w CJam)
Wejście:
Wynik:
Wypróbuj online tutaj
źródło
Python 2 - 103
Podobna do odpowiedzi Quincunx, ale zastępuje dołączanie dodatkiem i usuwa ostatnie dwa wiersze.
Przykładowe dane wyjściowe:
źródło
GolfScript,
5046Prawie na pewno można dalej grać w golfa. Wypróbuj tutaj.
źródło
Haskell, 99
źródło
CJam,
403634 bajtówSprawdź to tutaj. Wprowadź dane wejściowe jako tablicę w stylu CJam, na przykład
[5 3]
, w polu STDIN. Format wyjściowy jest podobny, więc nawiasy kwadratowe i spacje są ogranicznikami.Nawet jeśli będę grać w golfa dalej (co jest zdecydowanie możliwe), nie ma sposobu na pokonanie Pytha. Może czas nauczyć się J. Wyjaśnienia, które pojawią się później.
źródło
JavaScript (E6) 113
Najgorszy jak dotąd wpis :(
Przetestuj w konsoli FireFox / FireBug
Wynik
źródło
Python 2,
148130101To po prostu zapamiętuje wszystkie poprzednie iteracje i sprawdza, czy nowa jest na tej liście. Następnie drukuje to.
Przykładowy przebieg:
Wejście:
Wynik:
Edycja: Ponownie przeczytałem specyfikację gry w golfa, a także dużo gry w golfa.
źródło
[4,2,2]
. Jest jednak łatwa poprawka.Python 3: 89 znaków
Podobnie jak w przypadku już opublikowanych rozwiązań w języku Python, ale z rekurencyjnymi wywołaniami funkcji zamiast pętli. Lista
s
przechowuje już widoczne podziały i zwiera rekurencję w przypadku powtórzenia.Funkcja
print()
(to jest Python 3) musi być jakoś wywołana w każdej pętli. Trudne jest to, żelambda
pozwala tylko na jedno wyrażenie, więc nie możemy tego zrobićprint(l);...
. Ponadto generuje dane wyjścioweNone
, z którymi trudno jest pracować. Kończę stawianieprint(l)
jednej strony nierówności;==
nie działa z jakiegoś powodu, którego nie rozumiem.Alternatywne podejście do umieszczania go na liście używa równie wielu znaków.
Użycie
print(*l)
spowoduje sformatowanie danych wyjściowych jak4 2 2
zamiast[4,2,2]
.źródło