Twoim celem jest pokazanie sztuki ASCII formacji w kręgle z 10 pinami, gdzie pozostały tylko niektóre z pinów. Wygrywa najmniej bajtów.
Kołki dziesiątek mają trójkątny kształt:
O O O O
O O O
O O
O
Kołki są oznaczone od 1 do 10 jako:
7 8 9 10
4 5 6
2 3
1
Rysowanie szpilek jako O
i brakujących szpilek jako .
, formacja 1 3 5 6 9 10
jest:
. . O O
. O O
. O
O
Wejście:
Ciąg oddzielony spacjami, który wyświetla niepusty podzbiór liczb od 1 do 10 w kolejności.
Wynik:
Wydrukuj odpowiednią formację lub wyślij ją jako ciąg znaków z łamaniem linii.
Formacja powinna znajdować się na lewo od ekranu. Wszelkie białe znaki są poprawne, o ile widoczny obraz jest poprawny. Puste wiersze przed i po są również w porządku.
Przypadki testowe:
>> 1 2 3 4 5 6 7 8 9 10
O O O O
O O O
O O
O
>> 7 10
O . . O
. . .
. .
.
>> 3 5 7 9 10
O . O O
. O .
. O
.
>> 1
. . . .
. . .
. .
O
Odpowiedzi:
brainfuck -
617616604 bajtówZajęło mi to większą część dwóch dni. Myślę, że było warto. Prawdopodobnie są części, które można golfować bardziej, zmieniając komórkę, w której coś jest przechowywane, czy cokolwiek innego, ale teraz jestem szczęśliwy, że to działa.
Ten program musiałby być zupełnie inny, gdyby pytanie nie określało, że dane wejściowe zostaną posortowane. Działa to poprzez zbudowanie listy 10 pinów wokół tych, które są wprowadzane. To trochę mylące, ale może to lepiej to wyjaśni:
Robiąc to, pamięta, które z pinów umieścił tam użytkownik, a które tam. Ta strategia byłaby bardzo trudna w użyciu, gdyby dane wejściowe nie były posortowane.
Kolejną rzeczą, która ułatwia sortowanie, jest wykrycie liczby 10. Ponieważ pieprzenie mózgu zajmuje się pojedynczymi bajtami, a nie „liczbami” jako takimi, mógł to być problem w dupie, ale posortowane dane wejściowe znacznie ułatwiły mi radzenie sobie z. Powodem tego jest sposób przechowywania danych w programie. Pobieram jeden znak naraz i odejmuję 32 od wyniku. Jeśli po tym komórka nie jest zerowa, przesuwam do przodu 4 komórki. przed powtórzeniem. Oznacza to, że co 4 komórki otrzymuję bajt niebędący spacją i skutecznie przechowuję piny jako ich liczbę + 16. Jednak 10 zajmuje dwa bajty na pisanie, więc musiałem to zrobić w specjalnym przypadku. Jeśli dane wejściowe nie zostały posortowane, musiałbym przejrzeć piny, ale ponieważ są posortowane, zawsze będzie to ostatni pin, jeśli się pojawi. Sprawdzam, czy (ostatni bajt wejścia + 1) == (drugi ostatni bajt danych wejściowych), a jeśli tak, to musi być 10. Pozbywam się ostatniego bajtu i ustawiam drugi ostatni na to, co mój system rozumie jako „10”. Postacie
'1'
i'0'
nie mieszczą się w jednym bajcie, ale liczba 26 na pewno tak!Wymyślanie sztuczek tylko po to, żeby coś w ogóle działało, jest moją ulubioną częścią używania tego języka. :)
Jeśli jesteś zainteresowany bardziej szczegółowym działaniem tego programu, możesz zobaczyć program z komentarzami, których użyłem podczas pisania, aby upewnić się, że pamiętam, co wszystko zrobiłem. Nawet pisanie komentarzy w przeróbce mózgu jest trudne, ponieważ nie ma składni komentarzy. Zamiast tego, każda postać oprócz tych w
<[+.,-]>
nie ma operacji. Łatwo jest wprowadzić błędy, przypadkowo włączając.
lub,
w komentarzach! Właśnie dlatego gramatyka jest tak dziwna, a średniki są wszędzie.EDYCJA: Jako przykład tego, jak łatwo to zepsuć: użyłem „spacji” w jednym z komentarzy! Kiedy usunąłem wszystkie znaki inne niż bf ze źródła, program, który kiedyś to robiłem, zachował się w
-
. Na szczęście nic nie zepsuło, ale teraz usunąłem go, aby zaoszczędzić bajt. :)EDYCJA II: Minęło trochę czasu, odkąd go dotknąłem, haha. W innej odpowiedzi na temat pieprzenia mózgu na tej stronie zauważyłem, że przypadkowo użyłem przecinka w skomentowanej wersji. Ponieważ dane wejściowe zostały już wyczerpane, ustawiono bieżącą komórkę na 0 (jest to zależne od implementacji, ale z mojego doświadczenia wynika, że jest to najczęstsze zachowanie). Naprawiłem błąd, ale przyszło mi to do głowy. Idiomatyczny sposób ustawienia komórki na 0 to
[-]
(z grubszawhile (*p) { *p--; }
), który jest o dwa bajty dłuższy. Za każdym razem, gdy wszystkie dane wejściowe zostały odczytane, mogę,
zamiast tego użyć . To zaoszczędziło mi 2 bajty w tej odpowiedzi i 12 w tym!źródło
Python 2, 108 bajtów
Zadzwoń z
f("3 5 7 9 10")
.i
jest numerem wiersza, przy czym 4 oznacza pierwszy rząd, a 1 ostatni.z
jest n-tym pinem w tym rzędzie, z 0 oznacza, że jest to pierwszy pin w rzędzie ii-1
oznacza, że jest to ostatni pin w rzędzie.Główny hack to
i*~-i/2-~z
konwersja(i, z) -> pin number
. Na przykład,(4, 0) -> 7
ponieważ pin 7 jest pierwszym pinem w rzędzie 4 (pierwszy rząd). Wyprowadzenie wygląda następująco:Chcemy, aby funkcja przeniosła
i
się do pierwszego pinu w rzędziei
, tj4 -> 7, 3 -> 4, 2 -> 2, 1 -> 1
. Jest to spełnione przez(i**2-i)/2 + 1
, a tym samym(i**2-i)/2 + 1 + z
daje prawidłowy numer pin dla wejścia(i, z)
Następnie uprość:
Pyth , 33 bajty
Wypróbuj online.
Program z grubsza przekłada się na:
(Dzięki isaacg za wskazówki)
źródło
V4
jest równoważnyFNU4
irz7
równoważnymvkcz\
.Pyth , 31
Wypróbuj tutaj .
V4
ustawia pętlę for, przy czym N jest zmienną powyżej [0,1,2,3].*dN
zapewnia początkowe spacje, ponieważd
jest spacją.Aby znaleźć lokalizacje pinów, używa
+7+dZ
- 7 + d + Z.d
jest:podczas gdy
Z
jest 0 w pierwszym wierszu, -4 w drugim, -7 w trzecim i -9 w czwartym. Dzieje się tak, ponieważZ
zaczyna się od 0 i~Z-N4
zmniejszaZ
o 4, potem 3, a następnie 2.Następnie sprawdza, czy lokalizacja pinu znajduje się na wejściu, za pomocą
}+7+dZrz7
.rz7
jest pożądanymi pinami w formie listy-int.Następnie tworzy,
O
jeśli był obecny, i.
inaczej. Jest to oddzielone spacją, zjd
nadrukiem niejawnym.źródło
Perl 5: 51 (50 + 1 za
-p
)Użycie
r
flagi, dlas///
której jest jednym z ostatnich 5 dodatków perla.źródło
CJam,
4841 bajtówWow, to stało się strasznie długo
Sprawdź to tutaj.
Wyjaśnienie
Najpierw generujemy układ:
To daje
A teraz zamieniamy cyfry zgodnie z wprowadzonymi danymi:
źródło
"789A456S23SS1":~S*7/N*[l~]'OerB,'.er
jest nieco krótszy.er
tamtym czasie dokonywało się autocasting do tablicy."789A456S23SS1":~S*7/N*[l~]"O"erB,"."er
działa dobrze w 0.6.2.Python 2,
9794Wykorzystuje to funkcję translacji, która pozwala na zamianę znaku na znak w ciągu. Jak tr w perlu, tyle że o wiele dłużej pisać. Otrzymuję listę cyfr dziesiętnych, tworząc ciąg od 9 do 99 potęgi.
źródło
JavaScript, 155
Pierwszy golf może być prawdopodobnie krótszy.
Zadzwoń z
EDYTOWAĆ
Wersja ES6, 130
EDYTOWAĆ
Wersja ES6, 79nie działaWersja ES6,
7277, brak alertu, po prostu wracaźródło
.match
). To najbardziej elegancki ze wszystkich.Ruby, 91
Po prostu zastępuje argumenty wiersza poleceń
.
s i0
si wypisuje je za pomocą pętli 4 cykli.Wersja do odczytu
źródło
GNU sed, 75
Wynik obejmuje 1 dodatkowy dla
-r
opcji:Wejście przez STDIN:
Wypróbuj online .
źródło
l
s .0
się10
na linii 2,1/
aby1 /
na linii 5, a[0-9]
na[0-9]+
liniach 7 i 9 można upuścić pierwszą linię do 4 bajtów.CJam,
4039 bajtówWiem, że istnieje krótsza droga, nie mam teraz czasu, aby ją rozgryźć.
Jak to działa:
Wypróbuj online tutaj
źródło
APL (35)
Test:
Wyjaśnienie:
17110357⊤⍨28/2
: 28-bitowa reprezentacja17110357
:\⍨
: Dla każdego0
daj spację, a dla każdego1
weź przedmiot ze sznurka po lewej.⎕∊⍨⍳10
: Przeczytaj wiersz z klawiatury i oceń go (⎕
), a następnie sprawdź każdą liczbę od 1 do 10 (⍳10
), czy jest zawarta w input (∊⍨
).'.O'[1+
...]
: Dodaj 1 do każdej wartości (dając 1s i 2s zamiast 0 i 1s), a następnie zamieniaj co 1 o.
i co 2 oO
.4 7⍴
: zamień wygenerowany ciąg na matrycę 4 na 7⊖
: odwróć go w poziomieźródło
PowerShell: 109
Dane wejściowe są w $ i
To było zabawne. Nauczyłem się również wielu rzeczy o tym, jak działa potok.
źródło
Haskell:
163160 bajtówTo akceptuje linię liczb oddzielonych spacją
stdin
.Nie golfowany:
I bonus:
C: 250 bajtów
Ta wersja oczekuje, że argumentami wiersza poleceń będzie lista liczb.
źródło
Perl, 73
I głupie podejście premiowe, które się nie udało, 90 znaków:
źródło
Mathematica, 109 bajtów
Funkcjonować:
Nazwany przez:
Jeśli dozwolone są funkcje anonimowe, można to skrócić do 105 bajtów :
Jeśli dane wejściowe nie muszą być ciągiem rozdzielanym spacjami, ale mogą być tablicą liczb w formie
{3,5,7,9,10}
, można to dodatkowo skrócić do 79 bajtów :źródło
Pure Bash (bez coreutils), 85
Prosta zamiana wzoru:
Lista jest wprowadzana za pomocą argumentów wiersza poleceń.
źródło
Rebol - 117
Nie golfowany:
źródło
Brainfuck, 179 bajtów
Sformatowany:
Oczekuje wprowadzania bez końcowego znaku nowej linii.
Wypróbuj online.
Taśma jest inicjowana za pomocą dziesięciu węzłów, z których każdy zawiera jeden, po którym następuje zero. Jeden jest początkową wartością pinezki, a zero ułatwia nawigację i działa jako symbol zastępczy znaku spacji. Dla każdej liczby na wejściu ten pin jest zwiększany o 3; zwróć uwagę, że
ord('O') - ord('.') = 33
podczas fazy drukowania wartość pinu zostanie pomnożona przez 11. (To zwielokrotnienie służy również do wygenerowania znaku spacji.) Kolejność pinów od lewej do prawej na taśmie jest po prostu1
do10
. Jeśli dane wejściowe kończą się na a10
, dokonywana jest korekta, ponieważ10
początkowo traktowane jest jako1
.Po przetworzeniu danych wejściowych po każdym wierszu umieszcza się wartość ujemną. Następnie wiersze są drukowane w pętli, a liczba wiodących spacji zależy od liczby wcześniej przetworzonych wierszy.
źródło
Clojure, 216 znaków (ugh)
Jestem pewien, że można dalej grać w golfa.
Użyj w ten sposób:
źródło
AWK: 96 bajtów
Uwaga:
źródło
C # - 192 bajty
Ponieważ C #!
Zacząłem od zbudowania danych wyjściowych za pomocą matematyki, ale prosta metoda zastępowania tokenów w łańcuchach wydaje się najlepsza dla języków wyższego poziomu. Zależność Linq jest długa, ale wciąż krótsza niż utrzymywanie licznika i sprawdzanie zasięgu.
EDYCJA: zwraca uniksową linię (-3 bajty)
źródło
Scala,
150148Akceptuje rozdzielony spacjami zestaw ciągów znaków
źródło
JavaScript ES6, 78 bajtów
Aby przetestować, użyj następującego fragmentu kodu. Wykorzystuje podpowiedzi i alerty oraz regularną notację funkcji dla ułatwienia testowania.
źródło
VB / Basic-229
Moim celem było pokonanie java ^^
edytuj vbCr zamiast chr (13)
r = r + spacja (3 - (e - b))
skrót, jeśli
użycie funkcji zamiast sub
sub MAIN () -> sub m ()
źródło
Java - 223 znaki
Kiedyś lubiłem ten sposób, ale potem zdałem sobie sprawę, że potrzebuję niewielkiego włamania, nadal trochę podobnego do mojego rozwiązania.
źródło
K, 57 bajtów
Jeszcze niezbyt konkurencyjny, ale to początek:
Przykład użycia:
Zaczynam od oceny ciągu wejściowego za pomocą
.
- na szczęście liczby oddzielone spacjami są poprawnym literałem listy w K. Przygotowując pustą listę do wyniku eval, mogę zapewnić, że jest to lista nawet w przypadku pojedynczego pinu. Następnie tworzę wektor boolowski reprezentujący pozycje pinów:Następnie indeksuję listę ciągów znaków, aby uzyskać znaki z odstępami dla każdej pozycji pinezki.
Kroję tę sekwencję na wiersze (
_
), odwracam je (|
) i łączę każdy fragment (,/'
):Teraz zaczyna wyglądać tak, jak chcemy. Pozostało tylko przyczepić się do niektórych wiodących spacji do każdego wiersza (
((!4)#\:" "),'
) i wydrukować wiersze do stdout (0:
).źródło
Pascal (FPC) , 165 bajtów
Wypróbuj online!
Pobiera liczby ze standardowego wejścia, drukuje formację na standardowe wyjście.
Pascal (FPC) , 175 bajtów
Wypróbuj online!
Funkcja, która robi to samo, biorąc tablicę pozycji pinów i zwracając sformatowany ciąg.
źródło
PowerShell, 84 bajty
Skrypt testowy:
Wynik:
źródło
Java -
371316294 znakówPo raz pierwszy robię to, jestem prawie pewien, że to gówno, ale jestem nowicjuszem. Działa również, gdy numery nie są uporządkowane. Numeracja jest nieprawidłowa, ale nie mam czasu, aby dowiedzieć się, jak to naprawić ...
dane wejściowe są podawane
java B 1 2 3 5 10
na przykład przez. Dane wyjściowe będą wówczas:źródło
Japt
-Rx
,29191817 bajtówSpróbuj
Wyjaśnienie
źródło