Deadfish to żart „język programowania” z czterema poleceniami. Ponieważ strona Esolang jest nieco sprzeczna, a tłumacze na tej stronie nie działają dokładnie tak samo, należy wprowadzić następującą odmianę:
Specyfikacja
- Jest akumulator, który ma co najmniej 16 bitów, więcej jest dozwolone, ale mniej nie. Liczby ujemne nie muszą być obsługiwane. Akumulator jest w
0
momencie uruchomienia programu. - Istnieją następujące dwa zestawy czterech poleceń, a twój program musi obsługiwać oba jednocześnie.
Standard Deadfish │ Wariant XKCD │ Znaczenie ─────────────────────┼──────────────────┼───────── ─────────────────────────── i │ x │ Akumulator przyrostowy d │ d │ Akumulator zmniejszający się s │ k │ Kwadrat (acc = acc * acc) o │ c │ Akumulator wyjściowy, jako liczba
- Jeśli po wykonaniu polecenia akumulator jest ustawiony na albo,
-1
albo256
akumulator musi zostać zresetowany do zera. Pamiętaj, że nie jest to normalne zawijanie. Jeśli powiedzmy, że akumulator jest20
, as
polecenie zostanie wykonane, akumulator powinien być400
później. Podobnie, jeśli akumulator jest257
id
polecenie jest uruchomione, akumulator powinien się stać0
. - Wszelkie dane wejściowe, które nie są jednym z tych poleceń, należy zignorować.
Programy testowe
xiskso
powinien wyjść0
xiskisc
powinien wyjść289
I / O
Twój program powinien wyświetlić się monit: >>
. Monit musi znajdować się na początku nowej linii. Następnie powinien odczytać wiersz wprowadzony przez użytkownika i uruchomić podane polecenia od lewej do prawej. Podczas wyprowadzania liczb należy je rozdzielić. Tj. 12 34
Jest w porządku, 12,34
jest w porządku,
12
34
jest OK, ale 1234
nie jest.
Twój program powinien robić to w pętli, przynajmniej dopóki nie EOF
zostanie osiągnięty.
Przykładowa sesja:
>> xiskso
0
>> xiskisc
289
>> ddddo ddddo
285
281
>> ddddo ddddo
277
273
>> dddddddo
266
>> dddddddddo
257
>> do
0
>> do
0
>> io
1
>>
code-golf
interpreter
deadfish
marinus
źródło
źródło
#{STDIN.gets}
zadziała, ale tak naprawdę nie działa.Odpowiedzi:
K, 77 bajtów
Zauważ, że to K4 . Rozwiązanie K6 jest nieco dłuższe, ponieważ czasowniki IO są dłuższe, nawet jeśli wszystko inne jest lepsze:
""0:
wypisuje i zwraca swój argument. Uwaga w K4 mamy po prostu zastosowanie do 1 .0 f/ args
wykazuje zmniejszenie o wartości początkowej, tjf[f[0;first arg];second arg]…
{x*2=-1 256?x…
klasyfikuje x do 0 (dla -1), 1 (dla 256) i 2 dla wszystkich innych wartości.2=
oznacza, że otrzymujemy1
niesklasyfikowane wartości, a w0
przeciwnym razie pomnożenie przezx
jest krótsze niż warunkowe. W K6 możemy zrobić trochę lepiej, ponieważ{x*^-1 256?x:y@x}
opiera się na fakcie, że-1 256?x
zwraca0N
(null) i^
wykrywa null."xkcdiso"
zamiast sugerowanej kolejności, ponieważ7#
obejmie cztery argumenty, tj.7#"abcd"
Zwroty,"abcdabc"
dzięki czemu nasza tabela będzie mniejsza"x"
i"i"
wyświetla rzut,1+
który jest równoważny funkcji,{1+x}
ale krótszy."d"
się na rzut,-1+
który jest równoważny funkcji,{-1+x}
ale krótszy."k"
i"s"
do funkcji{x*x}
"c"
i"o"
do funkcji wyjściowej,{-1@$x;x}
która ponownie w K6 jest nieco dłuższa:{""0:,$x;x}
ale oba wypisują swoje dane wyjściowe, po których następuje nowa linia, a następnie zwraca argument.o`
która jest krótsza.źródło
Perl 5 , 90 bajtów
Wypróbuj online!
Dzięki @xfix za pomoc w tej sprawie wcześniej! Zaoszczędź 4 bajty dzięki @Xcali !
źródło
1
gdy nastąpi przelanie akumulatora. Możesz także skrócić swój program o pięć znaków, zmieniając$a
na$?
(który jest inicjowany0
i nie zmieni się, dopóki nie uruchomisz zewnętrznego programu z Perla).issso
jako jedno polecenie, a nie jeśli wykonujesz każde z osobna ... Zajmę się tym później i na pewno skorzystam$?
. Dziękuję Ci!''
zamiast tego""
, gdy użyty zperl -e '...'
mapą skończy się wynikiems///
. Dzięki jeszcze raz!PowerShell,
131126121114113for($x=0){...}
- ustaw akumulator na 0 i zapętlaj na zawszeread-host '>>'
- uzyskaj informacje od użytkownika z pytaniem>>
[char[]](...)
- przekonwertować dane wejściowe użytkownika na tablicę znaków|%{...}
- wykonaj to, co jest w środku{}
dla każdej postaciswitch -r($_)
- przełącznik regex dla każdej postaci"i|x"{$x++}
- dopasuji
lubx
- zwiększ akumulator"d"{$x-=!!$x}
- dopasujd
- pomniejsz$x
o!!$x
, co będzie,0
jeśli$x
będzie0
, i1
inaczej. Dzięki temu akumulator nigdy nie osiągnie-1
."s|k"{$x*=$x}
- dopasowanies
lubk
- kwadrat"o|c"{$x}
- dopasujo
lubc
- wyjmij akumulator$x*=$x-ne256
- pomnożyć akumulator przez,0
czy jest,256
czy przez1
inny sposóbPrzykładowe dane wyjściowe
read-host
Wydaje mi się, że implementacja jest specyficzna dla hosta, więc ten host Powershell (ConsoleHost) dołącza:
się do określonego monitu.źródło
!!$x
, szkoda, że nie mogę tego wykorzystać ...Rebol 3,
178169161159Ładniejsza wersja:
źródło
Haskell, 202
źródło
e
iv
do operatorów. Próbowałem również przepisaćv
ig
żeby parametrx
pozostał w IO,print
itd. Został podniesiony. Nie udało mi się go uruchomić, ale myślę, że może to być dobre miejsce dla kogoś, kto zna ich haskell.IO
to, że albo drukują zbyt często (dlatego użyłemr n
zamiastx
), albo za mało, ponieważ o wartość nigdy nie prosi się… Jak więc zmienić sięe
iv
zostać operatorem?'i'%x=x+1;'d'%x=x-1
... I po prostu wywołaj to w vdo n<-x;r$w$o%n
. Powodem, dla którego operatorzy oszczędzają miejsce, jest to, że nie wymagają odstępów wokół nich.Ruby,
140138Przykładowa sesja (taka sama jak Twoja):
źródło
K, 121
.
źródło
Ada
Oto implementacja Ada dla kilku osób zainteresowanych tym językiem. Zajęło mi sporo czasu, aby zastosować niektóre z najlepszych praktyk Ady (np. Użycie Indefinite_Holders zamiast dostępu), a także w pełni zrozumieć, jak Deadfish musi działać.
A wynik:
Byłbym wdzięczny, gdyby niektóre osoby eksperymentujące w Adzie dały mi wskazówki dotyczące optymalizacji.
źródło
C, 159 znaków
Próbowałem innego podejścia opartego na ustawianiu tabeli przeglądowej do dekodowania instrukcji, ale niestety skończyło się to dłużej ( 169 ). Włączyłem to, ponieważ ktoś może wymyślić sprytną modyfikację, aby zmniejszyć rozmiar. (Musi być uruchamiany bez żadnych argumentów)
źródło
C, 163
źródło
Python 3,
181175171162Daje to nowy wiersz poNigdy więcej!>>
, ale OP nie powiedział, że to niedozwolone.Dzięki
GlitchMr
,minitech
igolfer9338
!źródło
lambda
zamiastdef
funkcji, która natychmiast zwraca.x in(-1,256)
zapisuje dwie postacie. Alternatywnie,s=lambda x:"a=%d"%(x!=-1and x!=256and x)
może zaoszczędzić trochę.print(">>")
i użyćfor i in input(">>")
;input()
pozwala określić monit. Wtedy nie będzie już nowego wiersza>>
i zapisujesz postacie.R,
161,148, 138Wersja bez golfa:
Przykładowa sesja (w trybie interaktywnym):
źródło
Python 3, 141
Wiem, że się spóźniłem, ale chciałem skorzystać z okazji, aby opublikować krótszą wersję Pythona (i moją pierwszą próbę CodeGolf). :)
Instrukcja print była do tego dość trudna. Jeśli monit musi kończyć się spacją, dodaj jeden znak do liczby. :)
Wyjaśnienie
v
jest akumulator.m
sprawdza, czy podana wartość to-1
lub256
. Jeśli tak,0
zostanie zwrócona, w przeciwnym razie wartość.W kolejnych wierszach operacje są przypisane do odpowiednich zmiennych (ponieważ niektóre mają to samo znaczenie (jak
i
ix
), jest to krótsze niż tworzenie nowego słownika). Są one następnie używaneexec
poniżej.while 1:
jest główną pętląTeraz zaczyna się zabawa. Podobnie jak rozwiązanie @jazzpi , iteruje się po każdym znaku wejściowym.
locals()
jest słownikiem wszystkich bieżących (widocznych) zmiennych. Z.get(n,'')
odpowiednim kluczem zostanie wstawiony do ciągu wykonawczego (pusty ciąg, jeśli klucz (= inne dane wejściowe) nie został znaleziony). To wtedy zostanie wykonane, połączonev
i przekazanem
. Zwracana wartość zostanie ponownie zapisanav
.Powtarzaj to, aż się nudzisz. :)
źródło
y*(-1!=y!=256)
-3 bajtyPython 2, 139
Jest to schludne, ale także dość proste. Oto dłuższa, fajniejsza wersja:
Ważący 190 znaków, być może nie jest to najbardziej konkurencyjna odpowiedź. Z drugiej strony, coroutines są dość rad i zawsze szukam pretekstu do ich używania (i dzielenia się)
źródło
TI-BASIC,
104 10710210098Do kalkulatorów serii TI-83 + / 84 +.
Nazwij to
prgmD
; ostatecznie przepełnia stos, wywołując siebie. Zastąp rekurencjęWhile 1
kosztem dwóch bajtów, aby to naprawić.Y jest domyślnie 0, więc albo uruchom to za pomocą świeżo wyczyszczonego kalkulatora, albo zapisz 0 do Y ręcznie przed uruchomieniem tego.
Szkoda, że małe litery (w literałach łańcuchowych) mają po dwa bajty; inaczej byłoby to krótsze niż odpowiedź Dom Hastings.
EDYCJA: Naprawiono błąd dzielenia przez zero (0 ^ 0) kosztem trzech bajtów.
107 -> 102: Użyłem sztucznej potęgi wykładniczej, aby zapisać cztery bajty (w tym 1 z nawiasów i -1 z wydłużenia łańcucha wyszukiwania) i użyłem Y zamiast X, który zajmuje jeden bajt mniej do inicjalizacji.
źródło
Postscript 272
Nie golfowany:
źródło
C (
224212 znaków)To prawdopodobnie zły wybór języka, ale no cóż. To nie jest tak, że język taki jak C radzi sobie lepiej niż jakiś dynamiczny język programowania. W Clang musisz podać wartość dla
return
(nie jest to konieczne w przypadku gcc).źródło
define q
i użycieprintf
?q
jest używany 3 razy, więcdefine q
zapisuje ~ 2 znaki.Lua,
230228Nie najgorsze, nie najlepsze.
UWAGA: jak informuje @mniip,
256or
może nie działać w twoim tłumaczu . Więcej informacji w komentarzach.(mniej więcej) Wersja do odczytu:
Wydajność:
Edycja: dzięki @mniip za optymalizację 2 znaków :
until nil
->until _
źródło
repeat until x
(x jest zerowy, jak nie został zdefiniowany) jest o 2 znaki krótszy iwhile 1 do end
ma dokładnie taką samą długość, poza tym, co to jest wersja lua?256or
jest niepoprawna składnia w moimrepeat until x
. Używam najnowszy Windows binarny z tutaj . Jak widaća=a+1 elseif
masz miejsce. To dlatego, żee
jest cyfrą szesnastkową, podczas gdyo
w256or
nie jest, więc mój interpreter przyjmujeor
jako inną instrukcję / blok / howYouCallIt.256or
, także0repeat
i1then
; Używam oficjalnej lua z lua.org, twój kod nie kompiluje się ani w wersji 5.1, 5.2, ani 5.3Haskell ,
186178 bajtówTo musi być prowadzony z
runhaskell
(lub wewnątrzghci
) ponieważ oba ustawićBufferMode
abyNoBuffering
domyślnie który sejfy sporo bajtów:Wypróbuj online!
Wyjaśnienie
To definiuje nowy operator
state # source
(deklaracja stałość pozwala nam spadać nawiasy podczas używania go w połączeniu z innymi operatorami(+)
,(-)
,(^)
,(:)
i(>>)
):-1
i256
r#_
), odczytuje nowe i zaczyna od nowa, zachowując stary stanAby rozpocząć proces, inicjalizujemy stan
0
i odczytujemy nową linię źródłową, tj. zacznij od pustego źródła:źródło
Pakiet Windows,
204256Pomyślnie ignoruje inne polecenia. Naprawdę obrzęknął bez konieczności
or
pracy z ...Edytować:
źródło
Skrypt poleceń systemu Windows - 154
Wykorzystaj nieznane funkcje do maksimum.
źródło
> <> , 258 bajtów
Uczyniłem inną odpowiedź> <>, ponieważ nie mogłem przetestować faz i użyłem poleceń w stosie zamiast emulować powłokę.
Można z pewnością być grałem w dół, ale nie jestem pewien, że mam potrzebne
insanityodwagę!Przetestowałem to z oficjalnym tłumaczem działającym pod Pythonem 3.5 pod cygwin pod Windows 7 i mogłem odtworzyć przebieg testowy:
Jeśli nie możesz uruchomić go na swoim komputerze (wprowadzanie danych wydaje się trudne) lub po prostu chcesz go wypróbować bez żadnego innego oprogramowania, możesz użyć następującej wersji na tłumaczu online .
Oczywiście ignoruje \ n i EOF, ponieważ nie można wprowadzić ich do interpretera online, ale zachowuje się tak, jakby po każdym poleceniu wyjścia naciśnięto klawisz Enter.
źródło
C (gcc) , 139 bajtów
Kompiluj z
-Dk="_nZZiaeY"
(uwzględnione w liczbie bajtów). -2 bajty, jeśli monit>>\n
jest dozwolony.Wypróbuj online!
Degolf
źródło
Keg , 68 B.
źródło
Haskell, 230
Gdybym tylko mógł pozbyć się tego nieznośnego
hFlush stdout
wezwania! Bez niego monit nie będzie wyświetlany, dopóki nieo
zostanie wykonana operacja. Jakakolwiek rada?źródło
hFlush
, używającrunhaskell
zamiast kompilacji (patrz moja odpowiedź ), ale jeśli chodzi o to rozwiązanie, nie jest poprawne i nie ma błędów.PHP + HTML 345
dane wyjściowe są trochę szkicowe (historia / sesja jest wyświetlana w obszarze tekstowym, a przy włączonym raportowaniu błędów drukowanych jest wiele ostrzeżeń), ale wszystko działa
źródło
> <>, 239
Początkowy stos jest wejściem. Możesz spróbować online tutaj .
źródło
Golf-Basic 84, 88 znaków
Monituje jedno polecenie na raz, tak jak w co najmniej 3 innych rozwiązaniach. Oto uruchomienie testowe dla
xiskisc
:Również
xiskso
zwraca 0, tak jak powinno.źródło
JavaScript (Node.js), 204 bajtów
To może być prawdopodobnie gra w golfa. Node.js ponownie udowadnia, że to dziwna ukryta gadatliwość. Kod wyjaśniony:
źródło
C #, 311 bajtów
miałby 283 bajty, gdyby można było pominąć zastosowania i deklarację klasy itp. poprzez podanie definicji funkcji
źródło