tło
Pracujesz dla jakiegoś producenta gier planszowych i musisz produkować drewniane płytki z cyframi od 0 do n wygrawerowanymi na nich w niektórych grach. Jednakże, bez dalszej zwłoki, niektóre płytki stałaby się nie do odróżnienia, na przykład, 6i 9. Aby tego uniknąć, musisz wyposażyć liczby, które można pomylić z innymi (i tylko tymi), w jednoznaczną kropkę, np. Masz płytki takie jak 9.lub 6089..
Niestety, musisz użyć do tego jakiegoś starego, ale programowalnego urządzenia do grawerowania drewna, którego interfejs jest tak zepsuty, że musisz ręcznie zakodować każdy znak programu w sposób nie do opisania żmudny. Na szczęście urządzenie rozpoznaje każdy istniejący język programowania. Dlatego szukasz najkrótszego programu, który drukuje takie kafelki.
Rzeczywiste zadanie
Napisz najkrótszy program, który:
- Pobiera na wejściu dodatnią liczbę całkowitą n . Sposób odczytu danych zależy od Ciebie.
- Drukuje każdą z liczb od 0 do n ( włącznie 0 i n ) dokładnie raz w wybranej przez Ciebie kolejności, oddzielone pojedynczym białym znakiem (w tym znakiem nowej linii). Liczby należy wydrukować bez zer wiodących.
- Dodaje kropkę (.) Do każdej liczby, która zmienia się w inną prawidłową liczbę po obróceniu o π (180 °), nawet jeśli liczba ta jest większa niż n. 0 i 8 kroju pisma są symetryczne obrotowo, a 9 to obrócony 6. 2 i 5 różnią się po obrocie; 1 nie jest obrotowo-symetryczny. Liczby z wiodącymi zerami są nieprawidłowe.
Przykłady
Każdy z poniższych numerów musi zostać wydrukowany dokładnie w ten sposób:
2
4
5
6.
8
9.
16
60
66.
68.
69
906
909.
8088.
9806.
9886
9889.
60
być60.
?8088.
w swoich przykładach liczbę niebezpieczną dla rotacji, która nie ma cyfry 6 lub 9.Odpowiedzi:
Pyth - 34
38Muszę podziękować @ Sp3000 za pomoc w usunięciu 4 bajtów. Początkowo miałem dodatkową kontrolę,
&@JK
która upewniła się, że w numerze jest 6 lub 9, ale po przeczytaniu odpowiedzi przed wysłaniem przeczytałem jego odpowiedź i zauważyłem, że moje identyczne tłumaczenie i odwrócenie już się tym zajęło.Również dzięki @isaacg za wskazanie, że ciągi są iterowalne i można na nich używać operacji set. Również do tworzenia bieżącego kodu;)
Wyjaśnienie:
źródło
K
iJ
- po prostu używaj ciągów. PrzełączenieK
na <backtick> 69 iJ
<backtick> N zapisuje kilka znaków, podobnie jak wstawianieK
w wynikowym programie. Najkrótszą metodąVhQJ``N+J*\.&nJX_J``69``96&eN!-J"0689
, jaką udało mi się uzyskać w ramach tej techniki, było 34 znaki. (Dwa backty są naprawdę jednym.)hell`o wo`rld
_
, przed`96
.CJam,
46444342 bajtówMyślę, że jest miejsce na ulepszenia.
Sprawdź to tutaj.
Wyjaśnienie
źródło
n
Input.CJam,
46 45 4342 bajtówMyślę, że można trochę bardziej zagrać w golfa.
Bierze
n
od STDIN.Wypróbuj online tutaj
źródło
APL 66
Wyjaśnienie:
Wypróbuj na tryapl.org
Zauważ, że w internetowym tłumaczu funkcja ⍎ nie działa, więc musiałem zastąpić ją 2⊃⎕VFI, która robi to samo w tym przypadku, wykonuje i zwraca liczbę, podając ciąg znaków.
źródło
⊃,/
lub,/
możesz użyć∊
z przodu.Perl 5, 53 bajtów
Demo online.
Korzysta z funkcji Perl 5.10+
say
, więc należy ją uruchomić zperl -M5.010
(lubperl -E
), aby ją włączyć. (Zobacz ten meta wątek. ) Czyta dane wejściowe ze standardowego wejścia, drukuje na standardowe wyjście.źródło
Python 2,
130116113 bajtówDefiniuje funkcję,
f
która drukuje liczby do STDOUT w porządku rosnącym.Tym razem pomyślałem, że wyjdę z książki @ feersum z
.translate
:)Rozszerzony:
Poprzednie rozwiązanie:
Dzięki @xnor za pokazanie mi
.replace
triku jakiś czas temu.źródło
(u''+S[::-1])
zamiastunicode(S[::-1])
. Ponadto, jeśli zamienisz połączenieprint
i połączenie rekurencyjne, numery będą pojawiać się w kolejności rosnącej.u""+
, że to naprawdę zadziałaC #,
343309 znakówSposób zbyt długo, ale i tak:
Jak to działa? Aby dodać kropkę do numeru, musi spełniać następujące wymagania:
0
,8
,6
i9
.6
si9
si, ic
= liczba ze wszystkimi6
s zastępuje się9
s,c
==c
,Liczby są oddzielone spacją.
Kod z wcięciem:
źródło
M (MUMPS) -
7270Większość wbudowanych poleceń i funkcji w M ma wersje skrócone. Użyłem pełnych nazw poniżej.
READ n
- Przeczytaj ciąg z klawiatury i zapisz gon
.FOR i=0:1:n
- Pętla od zera don
,i
za każdym razem zwiększana o 1. (Pozostała część linii stanowi treść pętli.)WRITE !,i
- Wydrukuj nowy wiersz, a następnie wartośći
.SET r=$TRANSLATE($REVERSE(i),69,96))
- Odwróći
, zamień dziewiątki na szóstki i szóstki na dziewiątki i zapisz to wr
.WRITE:r=+r*r'=i*'$TRANSLATE(i,0689) "."
:
- Oznacza wyrażenie warunkowe, więcWRITE
polecenie jest wykonywane tylko wtedy, gdy zostanier=+r*r'=i*'$TRANSLATE(i,0689)
ocenione na prawdziwą wartość.r=+r
- Sprawdź,r
czy nie ma wiodącego zera. Jednoargumentowy+
operator przekształca ciąg znaków na liczbę, która usuwa początkowe zera, jeśli takie istnieją.*
- Operator mnożenia. M nie ma kolejności operacji; wszystkie operatory binarne są oceniane w kolejności, w jakiej występują od lewej do prawej.r'=i
- Sprawdź, czyi
to nie to samo, co wersja odwróconar
.'$TRANSLATE(i,0689)
- Usuń wszystkie zera, szóstki, ósemki i dziewiątkii
i sprawdź, czy nic nie zostało. ('
jest logicznym operatorem negacji)."."
- Na koniec argumentWRITE
polecenia (ciąg dosłowny).Edycja: nieco krótszy, nadużywając operatora mnożenia. Poprzednia wersja:
źródło
APL, 53 znaki
∊{⍵,'. '↓⍨∨/(3≡⊃i)(5∊i),⍵≡'9608x'[i←⌽'6908'⍳⍵]}∘⍕¨0,⍳
źródło
C # 205
209C # nie musi być tak długie ...
mniej więcej, część mojej odpowiedzi JavaScript
Nie golfił
źródło
Ruby, 81
Dane wejściowe są pobierane z wiersza poleceń.
Generuje listę
String
s od0
don
. Pętle przechodzą przez nie i drukują je. Dołącza kropkę, jeśli wszystkie warunki są spełnione:6
s na9
s nie daje oryginału0
,6
,8
i9
0
źródło
JavaScript (ES6) 101
104 106 109Funkcja z argumentem n jako wyjście, wysyłana przez konsolę.log
Edytuj za pomocą% 10 do testowania na potrzeby reorganizacji na początku 0
Edytuj 2
for
, nie potrzebuję zrozumienia tablicy po tym, jak wszystkieEdytuj 3 zmodyfikowały (ponownie) sprawdzenie na początku 0
Bez golfa i łatwiejsze do przetestowania
Wydajność
źródło
[]
? Szukam dokumentacji, ponieważ do tej pory znałem ją tylko z Pythona.Bash + coreutils, 105
Test:
źródło
sed, 467
Dłuższy niż C # ...
Prawie skończyłem to, gdy @ edc65 wskazał, że odpowiedzi muszą przetwarzać liczby 0-n, a nie tylko n. Dodanie kodu sed do przyrostu 0-n dodaje DUŻO więcej kodu, ponieważ to zadanie jest nieodpowiednie dla sed pozbawionego arytmetyki.
Zgodnie z OP, kolejność nie ma znaczenia, więc pracujemy w dół od n do 0.
Wydajność:
źródło
AWK: 120
Odczytaj wartość n ze standardowego wejścia.
Test:
źródło
Rebol - 195
Niegolfowany + kilka adnotacji:
źródło
p.n.e. 158
Po zrobieniu tego czysto w sed przy użyciu wszystkich operacji na łańcuchach i wyrażeniach regularnych bez natywnej arytmetyki, byłem ciekawy, jak to wyglądałoby na odwrót, tj. Wszystkie operacje arytmetyczne i logiczne oraz brak łańcucha / wyrażenia regularnego:
Dane wyjściowe są sortowane w kolejności malejącej.
Wydajność:
źródło
Python - 152
źródło
"."if a[i]else"" -> "."*a[i]
,int(raw_input()) -> input()
(który jest naprawdę tylkoeval(raw_input())
)str(i)
z`i`
. (2) Używasza
tylko raz, więc po co przypisywać ją do zmiennej.str(i)
kilka razy. Który mogę wymienići
?i
, alei
z backtickami, co jest synonimemrepr(i)
. Możesz go używać zamiaststr(i)
wszędzie, chociaż jeśli masz gostr(i)
tak wiele razy, może być krótsze przypisanie go do zmiennej i użycie jej oprócz korzystania z backsicków. (tj.x=`i`; (do stuff with x)
)JavaScript -
168 129 119 113 111108Lub wersja do odczytu:
Nie jestem bardzo zadowolony z wyrażenia regularnego, jakieś pomysły?
Edit : Learned schludny sztuczkę z
~
ifor (... of ...)
od @ edc65Edit2 : zreorganizowana warunki
Edit3 : propozycje stosowane przez @ edc65
źródło
i=n+"";for(c of i)
=>for(c of i=n+"")
zapisz 2 bajtyc==6?A:B
=>c!=6=>B:A
=>c-6?B:A
for(c of i=n+"")
jest całkiem logiczny, kiedy go widzę, ale nie pomyślałbym o tym.c-6?B:A
Boże, zabraniaj, że kiedykolwiek wprowadzałem to do kodu produkcyjnego05AB1E ,
38373029 bajtówWypróbuj online.
Wyjaśnienie:
Dodatkowe wyjaśnienie niektórych części:
źródło
Perl - 84
źródło
PowerShell,
111102 bajtówWyjaśniony skrypt testowy:
Wydajność:
źródło
Stax , 27 bajtów
Uruchom i debuguj
Rozpakowane, niepolowane i skomentowane, wygląda to tak.
Uruchom ten
źródło