W tym wyzwaniu napiszesz tłumacza prostego języka, który wymyśliłem. Język oparty jest na pojedynczym akumulatorze A, który ma dokładnie jeden bajt długości. Na początku programu A = 0. Oto instrukcje dotyczące języków:
!
: Inwersja
Ta instrukcja po prostu odwraca każdy kawałek akumulatora. Każde zero staje się jednością, a każdy staje się zerem. Prosty!
>
: Shift Right
Ta instrukcja przesuwa się co chwilę w jednym miejscu w prawo. Najbardziej lewy bit staje się zerem, a skrajny prawy bit jest odrzucany.
<
: Przesuń w lewo
Ta instrukcja przesuwa się co chwilę w jednym miejscu w lewo. Najbardziej wysunięty w prawo bit staje się zerem, a najbardziej wysunięty w lewo bit jest odrzucany.
@
: Zamień Nybbles
Ta instrukcja zamienia cztery górne bity A na cztery dolne bity. Na przykład, jeśli A jest 01101010
i wykonasz @
, A będzie 10100110
:
____________________
| |
0110 1010 1010 0110
|_______|
To wszystkie instrukcje! Proste, prawda?
Zasady
- Twój program musi zaakceptować wejście raz na początku. To będzie linia kodu. To nie jest interaktywny tłumacz! Możesz zaakceptować dane wejściowe tylko raz i nie musisz zapętlać z powrotem do początku po wykonaniu tej linii.
- Twój program musi ocenić wspomniane dane wejściowe. Każda postać, która nie jest wymieniona powyżej, jest ignorowana.
- Twój program powinien następnie wydrukować ostateczną wartość akumulatora w systemie dziesiętnym.
- Obowiązują zwykłe zasady dotyczące prawidłowych języków programowania.
- Standardowe luki są niedozwolone.
- To jest golf golfowy , wygrywa najmniejsza liczba bajtów.
Oto kilka małych programów do testowania swoich zgłoszeń. Przed strzałką jest kod, po nim oczekiwany wynik:
!
->255
!>>
->63
!<@
->239
!nop!&6*!
->255
Cieszyć się!
źródło
! -> 255
, że wykorzystamy tutaj 8 bitów na bajt? Pytanie nie jest jednoznaczne.Odpowiedzi:
Pyth,
3635 bajtówUprząż testowa
Wewnętrzna reprezentacja akumulatora jest liczbą całkowitą. Ta liczba całkowita jest modyfikowana przez 256 przy każdej iteracji, zgodnie z potrzebami. Operacje wykonane są
-G-1
,G/2
,G*2
iG
przekształca się w podstawie 16, odwróconej i przekształcany z powrotem do podstawy 10, gdyG
jest w akumulatorze.Przegapiłem zdanie o ignorowaniu wszystkiego innego. Zostało to naprawione. Dzięki, @Dennis.
źródło
-G-1
jest krótszy niż~G
w Pyth? Wątpię w to.t_G
, o którym mowa, jest w rzeczywistości , gdzie_
jest negacja it
jest-1
. W Pyth~
oznacza coś zupełnie innego.~
(bitowe NIE)C, 96
Zakładając wejście ASCII (lub zgodne):
Tidier:
Zasadniczo jest to tylko kolekcja zagnieżdżonych wyrażeń trójskładnikowych. Zwiększam wartość uzyskaną z,
getchar()
aby EOF (-1) dawał wartość zero i program kończy działanie.(link ideone)
źródło
!<>
powinno skutkować127
i nie255
). Zdefiniuj swojąa
jakochar
lub użyj liniia&=255
(i użyj%u
), aby uzyskać właściwy efekt. Ponadto można skrócić swoją negacjęa^255
do~a
.a>>4&15
jest również krótszy niż twój(a&240)/16
.%u
zamiast%hhu
a/16|a*16
zamiasta/16|(a&15)*16
. Kilka bitów na górze jest usuwanych przez&255
.a*257/16
jest o jeden bajt krótsze niża/16|a*16
.Python 3, 133 bajty
Używa słownika, aby uzupełnić brak składni z przełączaniem wielkości liter w Pythonie. Zobacz więcej tutaj .
Akumulator to ciąg, który na końcu jest przekształcany w podstawową liczbę 10.
Przykład I / O:
źródło
for i in sys.stdin:
:)JavaScript (ES6),
809190 bajtówPrawie tak krótko, jak to możliwe. Definiuje anonimową funkcję, która przyjmuje program jako dane wejściowe.
!
bierzex XOR 255
, jak JS na~
uznałbyx
liczbę 32-bitową.<
, mnoży sięx
przez 2 i wykorzystuje wynik mod 256.>
naprawdę przesuwa bityx
1-bitowe w prawo.@
, podłogix/16
i dodaje tox%16*16
.Dzięki @vihan za sugestię użycia
reduce
do zapisania bajtu.źródło
<
aby zaoszczędzić około 4 bajtów. Użycie funkcji zmniejszania może również zaoszczędzić niektóre bajty<
zamiast==
? Jeśli tak, to nie zadziałałoby, ponieważ postacie no-op nieprawidłowo wykonałyby operację. Użyłem tego w moim poprzednim 80-bajtowym rozwiązaniu.CJam, 37 bajtów
Wypróbuj online w interpretatorze CJam .
Jak to działa
źródło
Java (8),
514483411366359239224229198194187186184182181180177 znakówWow, to było dużo gry w golfa! Dziękujemy wszystkim, którzy dali mi sugestie! Bardzo to doceniam!
Grał w golfa 31 (!) Bajtów, optymalizując zamianę skórek za pomocą operacji bitowych w przeciwieństwie do długich
Integer.???
metod.Grał w golfa 72 znaki (!!!!), usuwając niepotrzebny ciąg znaków utworzony w celu zamiany skubków. Znacznie lepiej niż wcześniej !?
Zagrano 45 znaków (!!) w golfa, usuwając użycie
java.util.Scanner
i czytanieSystem.in
bezpośrednio. Zauważ, że teraz, gdy minęło wyrażenie lambda, Java 8 nie jest już wymagana! Wystarczy Java 1!Grał w golfa 7 znaków, tworząc klasę
(default)
(usuniętepublic
słowo kluczowe), dzięki @bmarksGrał w golfa 120 znaków (!!!!!!!), odwracając wszystkie te długie
Integer
operacje klasowe255 - a
. Teraz jest o wiele krótszy!Gra w golfa 15 (!) Znaków, konwertując zmiany na mnożenie i dzielenie, usuwając nawiasy klamrowe z instrukcji while i
a
ustawiając lokalnie w ramachmain
metody.Ungolfed 9 = (znaki z powodu problemu z przesunięciem w lewo, który nie odrzuca najbardziej wysuniętego w lewo bajtu. Dlatego robię to
mod (256)
. Prawe przesunięcie sprawi, że wynikowa liczba będzie nieco krótsza niż wcześniej, więc nie ma potrzeby używaniamod
na prawym przesunięciu. Moja zamiana skubania zamieni ostatnie 4 bity i skrobanie drugiego do ostatniego, aand (&)
obcina wszystkie inne bity. Mój program inwersji nie powoduje żadnych problemów, jeśli pierwotna liczba jest mniejsza niż 256.Grał w golfa
3135 znaków dzięki @Geobits poprzez konwersjęswitch
instrukcji na wiele instrukcji trójkowych , a także konwersję znaków na int, skracając literały.Grał w golfa 7 znaków, usuwając niepotrzebne
&240
w zamianie skórek ((a&240)>>4
doa>>4
i konwertując(a&15)<<4
naa<<4&240
. Ostatnia zmiana zagrała tylko jedną postać.Golfed 1 char przez wyeliminowanie
=
ina /= 2
, ponieważa = a /= 2
jest równoważnaa = a / 2
.Zagrał w golfa 2 znaki, zwracając się
println
doprint
.Golfed 2 znaków poprzez usunięcie Postępowanie w przypadku
a=
wa=255-a
(a=a=255-a
odpowiadaa=255-a
)Grał w golfa 1 char, zmieniając się
a<<4&240
wa%16<<4
.Zagrał w golfa 1 znak, dodając nawiasy na zewnątrz instrukcji trójkowej i wykonując
%256
. W ten sposób%16
zbędne jest w części zamiany skubków z przesunięciem w lewo. Nawiasy dodają 2 znaki, a%16
zapisuje 3 znaki.Golfed 3 znaki zmieniając
class
sięinterface
i usuwaniepublic
za pomocą funkcji interfejsu metoda statyczna Java 8 za. Dzięki @TheNumberOne (bez komentarza, ale znajdź odpowiedź na „Wskazówki dotyczące gry w golfa w Javie”źródło
Integer
metody klasowe.switch
podczas golfa.case
/break
Są po prostu zbyt długo. Powinieneś być w stanie uratować grupę, czyniąc całość potrójną; coś w stylua=i=='!'?255-a:i==62?a/2:i=='<'?a*2%256:i=='@'?(a&240)>>4|(a&15)<<4:a;
Rdza,
121115 bajtówPrzykładowy przebieg:
Nie golfowany:
Zaskakująco skrót od Rust. Nic innego naprawdę interesującego poza faktem, że nauczyłem się dzisiaj więcej zasad pierwszeństwa - kto wiedział, że
(a>>b)|c
to to samo, coa>>b|c
?Ogolono bajt, zmieniając
n>>=1
nan/=2
; tego samego nie można jednak zrobić z mnożeniem, ponieważ przepełnienie arytmetyczne jest paniką (tj. awarią) w Rust.źródło
>>
to rodzaj jakby podziału i|
jest rodzaj jakby dodatkowo.HP 41C / CV / CX (bajty, 42 kroki)
Wyłącznie dla chichotów, tutaj jest dla kalkulatora HP 41C / CV / CX. (Wymaga modułu Rozszerzonych funkcji lub 41CX dla funkcji ATOX.) Niestety kalkulator nie zgłasza rozmiarów programów w bajtach.
Umieść swój program w rejestrze Alpha, co jest trochę trudne, ponieważ nie ma możliwości, aby wejść! lub @ bezpośrednio z klawiatury (aby dołączyć, użyj XTOA z kodami ASCII 33 i 64).
Kroki 08 i 10 pozwalają na ignorowanie niepoprawnych kodów; usuń je, aby zapisać 2 kroki, ale program ulegnie awarii przy nieprawidłowym wprowadzeniu.
źródło
Python 2, 79 bajtów
Uświadomiłem sobie, że zrobiłem wcześniej coś bardzo podobnego do tego w Pythonie. To tylko część mojej odpowiedzi Ruby , ale nawiasem mówiąc, jest to najkrótsza jak na razie odpowiedź w języku Python: D
Różnica w stosunku do wersji Ruby polega na tym, że ta nie ignoruje niepoprawnych instrukcji podczas iteracji po danych wejściowych. Zamiast tego korzystam z faktu, że Python ma tendencję do zwracania
-1
zamiastnil
gdy nie ma dopasowania - bieżąca wartośća
jest dołączana z tyłu tablicy wyników, dzięki czemu wszystkie niepoprawne instrukcje są odwzorowane na tę samą niezmienioną wartość.źródło
Python 3,
1249493 bajty„!” jest takie samo jak odejmowanie od 255.
„<” to to samo, co mnożenie przez 2. Ale 8-bitowy rejestr oznacza mod 256.
„>” oznacza dzielenie liczb całkowitych przez 2.
„@” oznacza przesunięcie ostatnich 4 bitów (
a%16
) o 4 bity (*16
) i dodanie pierwszych czterech bitów (a/16
).EDYCJA (czytaj bezwstydne kopiowanie)
Zobaczyłem drugą odpowiedź w pythonie (przez rozpad Beta). Wykorzystuje naprawdę skuteczny sposób symulowania przypadków przełączania za pomocą słownika. Za pomocą tego możemy pisać
Dzięki, rozpad beta.
źródło
256
prawda? Więc dlaczego nie zrobić na końcu:a={"!":255-a,"<":a*2,">":a//2,"@":(a%16)<<4+a>>4}.get(i,a)%256
. To natychmiast oszczędza bajt (bo zrobisz toa*2
zamiasta<<1
) ... ale odpowiedź @ daniero pokazuje również, że jeśli zrobisz to w ten sposób,(a%16)<<4
możesz go skrócić do sprawiedliwegoa<<4
, ponieważ każdy bit 16 lub większy zostanie wyeliminowany po pomnożeniu o 16 i zmniejsz go mod 256. Fajnie! Ponadto, można teraz zastąpić255-a
przez-1-a
... albo lepiej, po prostu~a
. W sumie te sugestie powinny zaoszczędzić 9 bajtów.Haskell, 89 bajtów
Przykład użycia:
f "!>>"
->63
źródło
Rdza, 111 bajtów
Więcej komentarza do odpowiedzi @ Doorknob, ale nie mam żadnych przedstawicieli do komentarzy, ponieważ właśnie utworzyłem konto.
Można ogolić 10 bajtów z jego rozwiązania w Rust:
źródło
Python 3, 127 bajtów
Edycja: zwarcie, dzięki @Jakube
Edycja2: popraw, dziękuję @Anachor
źródło
!<
daje,510
póki powinno być254
Cejlon,
297290Sformatowany:
#f
i#f0
są liczbami szesnastkowymi dla skubków,.byte
konwertuje liczbę całkowitą na bajt. Mam szczęście, że.string
atrybut Byte'a już używa niepodpisanej reprezentacji bajtu. Na Cejlonie znajduje się również instrukcja switch bez przewijania, a ciąg znaków to lista znaków, które można iterować.Próbowałem również skrócić nazwy metod długiego przesunięcia za pomocą importu aliasingu, ale tak naprawdę staje się on o 7 bajtów dłuższy:
Sformatowany:
Może to być przydatne, jeśli potrzebujemy tych metod nieco częściej.
źródło
Rubin,
8173 bajtyO wiele prostsze - bez ewaluacji! Dla każdego poprawnego znaku na wejściu ocenia każdą instrukcję i znajduje odpowiednią instrukcję na podstawie indeksu
$&
(bieżącego znaku na wejściu).źródło
STATA, 197 bajtów
Bez golfa
Nie działa z tłumaczem online i wymaga niewolnego domyślnego tłumacza. Byłoby to nieco łatwiejsze w przypadku rzeczywistych operacji bitowych, ale nie sądzę, aby były one zbyt przydatne w przypadku większości typowych zastosowań STATA.
źródło
JavaScript, 104
Zagnieżdżone operatory trójskładnikowe mapują na instrukcje.
BITWISE AND służy do ograniczenia naszego typu Number do jednego bajtu.
źródło
Julia,
117948673 bajtówJest to anonimowa funkcja, która przyjmuje ciąg znaków i zwraca liczbę całkowitą. Aby go wywołać, przypisz go do zmiennej.
Nie golfowany:
Zaoszczędzono 8 bajtów dzięki Sp3000 i 13 dzięki Dennis!
źródło
JavaScript (ES6), 76
81Jako funkcja bez nazwy zwraca wartość akumulatora
To przeniesienie super sprytnych odpowiedzi @daniero (które mają zdecydowanie za mało głosów pozytywnych)
Bonus: Państwo może przekazać wartość początkową akumulatorze. Jeśli nie przejdzie, wartość początkowa wynosi 0, jak dla konkretnego.
Przetestuj poniższy fragment kodu w dowolnej przeglądarce EcmaScript 6 (testowałem w przeglądarce Firefox)
źródło
Kryształ, 139 bajtów
źródło
C # 193
źródło
using System;
ani czegoś takiego, aby uzyskać dostępConsole.ReadLine
iConsole.Write
bezSystem.
prefiksu?byte
każdej operacji, ale mogę się mylić.Lua, 344 char
Zainspirowany przez @Beta Decay użycie akumulatora strunowego, ponieważ lua nie ma typu bajtów. Prawdopodobnie można by grać w golfa przy użyciu mniejszej liczby funkcji.
źródło
R 194 bajtów
bez golfa
źródło
<-
można zastąpić=
tutaj, zmniejszając w ten sposób kod o 7 bajtów. Dodatkowo możesz być w stanie zastąpić serięif
instrukcji jednym wywołaniem doswitch
(as inA=switch(r,"!"=(A+1)%%2, ...)
)b=readline();A=rep(0,8);s=strsplit(b,"")[[1]];for(r in s)A=switch(r,"!"=(A+1)%%2,">"=c(0,A)[1:length(A)],"<"=c(A,0)[-1],"@"=c(A[5:8],A[1:4]),A);print(sum(A*(2^(7:0))))
to 167 bajtów.RPL, 170,5 bajtów
Dane wejściowe należy wprowadzić jako ciąg na poziomie 1.
źródło
K, 57 bajtów
To poczatek:
testowane przy użyciu Kona:
Mogę być w stanie poradzić sobie lepiej w K5, ale jest to złożona seria kompromisów - na przykład konwersja wartości binarnej na dziesiętną jest równie łatwa
2/
, ale zachowanie?
utrudnia obsługę domyślnego przypadku wyszukiwania instrukcji.źródło
PHP, 189 bajtów
Nie chodzi o to, że pobije wiele odpowiedzi, tylko o trening
źródło
HPPPL ,
302294 bajtówNie golfowany:
Ta odpowiedź zapewnia, że HP Prime używa 8-bitowych liczb całkowitych bez znaku, nawet jeśli tryb jest ustawiony na np. 64 bity przez użytkownika. Jeśli kalkulator jest skonfigurowany ręcznie do używania liczb całkowitych dziesiętnych bez znaku, wówczas
pragma
polecenie można pominąć. Jeśli dane wyjściowe nie muszą ściśle przestrzegać formatu, toa*1
na końcu może być po prostua
. Pomnożenie wyniku przez 1 gwarantuje, że dane wyjściowe nie będą zgodne z danymi wyjściowymi dla wartości całkowitych.print
Polecenia w wierszu 4 można również pominąć, jeżeli terminal nie muszą być wyczyszczone przed wydrukowaniem wynik. Jeśli dozwolone jest przekazywanie programu jako argumentu ciągu,INPUT
polecenie można również pominąć.Jest to najkrótsza wersja z wejściem i właściwym wyjściem, bez argumentu pragma (jeśli domyślnie kalkulator jest ustawiony na Uint8:
243 bajty:
źródło
Perl 6,
9689 bajtówStare rozwiązanie:
źródło
C #, 119 bajtów
Inne wersje próbowałem, ale potrzebuję więcej bajtów:
źródło
Python 2.7.3, 104 bajty
Posiadanie kodu w ciągach do oceny wygląda dość brudno, ale działa: D
Oto dane wyjściowe (i dane wejściowe faktycznie…)
I tak, to naprawdę działa na RaspberryPi :)
źródło