Wyzwanie:
Twoim zadaniem jest stworzenie prostego tłumacza dla prostego języka golfowego.
Wejście:
Dane wejściowe będą miały postać ciągu oddzielonego spacjami.
Możesz zastąpić separację przestrzeni tym, co chcesz
Wynik:
Wyprowadza wynik (liczbę lub ciąg) uzyskany po wykonaniu wszystkich operacji. Jeśli istnieje więcej niż jedno wyjście, połącz je ze sobą, aby uzyskać jeden wynik (bez separatorów). Wartość początkowa zmiennej wynosi zawsze zero. tj .: zaczyna się o0
Składnia języka:
Język ma następujące operatory:
inc ---> add one to variable
dec ---> remove one from variable
mult ---> multiply variable by 2
half ---> divide the variable by 2
Pri ---> print the variable to console (or whatever your language has)
exit ---> end the program (anything after this is ignored)
Przykłady:
inc inc inc dec Pri exit ---> 2
dec inc mult inc inc Pri ---> 2
inc inc inc mult half Pri exit inc ---> 3
inc Pri inc Pri inc Pri exit half mult ---> 123
Pri exit ---> 0
inc half Pri exit ---> 0.5
Ograniczenie:
To jest golf golfowy, więc wygra najkrótszy kod w bajtach dla każdego języka.
Uwaga:
- Dane wejściowe zawsze będą prawidłowe. (ciąg operatorów oddzielony spacją)
- Możesz zaokrąglić w dół do najbliższej liczby całkowitej, jeśli nie chcesz miejsc dziesiętnych.
code-golf
math
interpreter
Muhammad Salman
źródło
źródło
Odpowiedzi:
Bash , 61 bajtów
Wypróbuj online!
Konwertuje program na program dc, a następnie ocenia go jako kod dc. To pobiera dane wejściowe oddzielone znakami nowej linii. Zauważ, że dc jest oparte na stosie i używa odwrotnej notacji do polerowania.
Sygnał wejściowy jest najpierw przesyłany do sed
1i0
w pierwszym wierszu wejścia wpisz (prepend) a 0, będzie to akumulators/.//2g
usuń wszystko oprócz pierwszego znaku w każdej liniiy"idmhe"+-*/q"
transliterowaćidmhe
w+-*/q
odpowiednio + - * / są średnimi arytmetycznymi polecenia i q zamykany program/+\|-/
w każdym wierszu zawierającym + lub -i1
wstaw 1/*\|\//
w każdym wierszu zawierającym * lub /i2
wstaw 2/P/
w każdym wierszu zawierającym P,cdn
zmień go nadn
, równoważny duplikatowi i wyjściu bez nowej linii w dcTeraz jest to oceniane jako wyrażenie dc.
źródło
sed
składnia stanie się jeszcze bardziej obca niż wcześniej uważano za możliwe, gdy gra się w golfa.Galaretka , 21 bajtów
Wypróbuj online!
Zauważ, że wartości ASCII pierwszych znaków (
idmhPe
) modulo 11 są unikalnymi modulo 6.Korzystanie z modulo 16:
Galaretka , 21 bajtów
Wypróbuj online!
W tym przypadku jest używany ciąg znaków, który służy do indeksowania
ḤH‘’IȮ
. Nie‘’
są już na granicach.źródło
“”
zajmuje 2 bajty,¤
zajmuje 1 bajt, same dane 6 bajtów, pozostały 2 bajty na zrobienie czegoś. Obecnie jest⁾
ij
, aleịØJ
lubṃØJ
jest znacznie gorszy iỌ
nie działa (ponieważ Unicode).R ,
128125 bajtówWypróbuj online!
Należy wywołać za pomocą,
source(echo=FALSE)
aby zapobiec automatycznemu drukowaniu wartości zwracanej. Alternatywą byłoby owinięcie wszystkiego,invisible
ale to znacznie mniej golfa (i rujnuje moją [wciąż] niezłą liczbę bajtów).źródło
05AB1E , 25 bajtów
Wypróbuj online!
Odwzorowuje każdą funkcję języka na odpowiednią funkcję 05AB1E (używając pierwszego znaku każdej funkcji), a następnie wykonuje wynikowy ciąg jako kod 05AB1E.
źródło
Czerwony , 121 bajtów
Wypróbuj online!
Czytelny:
źródło
Python 2 ,
131125122121118117115 bajtówWypróbuj online!
-6 i -3 dzięki dzięki @Rod
-3 i -2 dzięki dzięki @etene
-1 zastępując
"Pri"==x
z"P"in x
źródło
split
na"exit"
i uzyskać 1st bloku, zamiastbreak
ing oszczędność 4 bajty'idmh'
i użyćfind
zamiast tegoindex
, co pozwoli zaoszczędzić kilka bajtówex
aby uratować kolejne 2v=(v+1,v-1,v*2,v/2.)
zev+=(1,-1,v,-v/2.)
to powinno działać, choć nie testowanyhalf
. Tak prosty! Dzięki.Python 3 ,
1109182 bajtówexit
spowoduje zamknięcie programu z błędem.Wypróbuj online!
źródło
i='x+=1';d='x-=1';...
a następnie w swoimexec
połączeniu zmień go naexec(eval(c[0]))
print
oświadczenia!JavaScript (ES6),
8379 bajtówZaoszczędzono 4 bajty dzięki @ l4m2
Iteracyjnie zastępuje instrukcje albo wyjściowymi, albo pustymi ciągami.
Wypróbuj online!
Skomentował
źródło
s=>s.replace(/\S+./g,w=>k<s?'':w<{}?k:(k+={d:-1,e:w,i:1,m:k}[w[0]]||-k/2,''),k=0)
w<{}
jest czyste zło: ps=>s.replace(/\S+./g,e=>m<s?'':e<{}?m:(m+={d:-1,e,i:1,m}[e[0]]||-m/2,''),m=0)
też pracaWęgiel drzewny ,
3735 bajtówWypróbuj online! Link jest do pełnej wersji kodu. Zainspirowany odpowiedzią @ RickHitchcock. Wyjaśnienie:
Wyczyść zmienną.
Obetnij wejście,
x
jeśli jest, a następnie zapętl i włącz każdy znak (pozostałą część) wejścia.n
i n crements zmiennej.d
d oblicza zmienną.m
m zwielokrotnia zmienną przez dwa (tj. podwaja).h
h żyje zmienną.r
p r oznacza zmienną rzutowaną na string.źródło
JavaScript (ES6),
7775 bajtów(Pożyczona ( ukradła ) @ sztuczka Arnaulda polegająca na użyciu
m
jako nazwy zmiennej, oszczędzając 2 bajty.)Rekurencyjnie chodzi po łańcuchu, szukając odrębnych liter na instrukcję i ignorując resztę:
Korzysta z faktu, że
undefined
nie jest ani większa ani mniejsza niż niż'x'
powodując rekursji, aby zatrzymać się na końcu łańcucha lub gdy napotka'x'
na wyjściu .Pokaż fragment kodu
źródło
JavaScript (Node.js) , 107 bajtów
Wypróbuj online!
źródło
f=
JavaScript (Node.js) , 91 bajtów
Wypróbuj online!
JavaScript (Node.js) , 96 bajtów
Wypróbuj online!
JavaScript (Node.js) , 99 bajtów
Wypróbuj online!
źródło
JavaScript, 107 bajtów
źródło
Haskell , 93 bajty
Wypróbuj online!
Zasadniczo tłumaczenie odpowiedzi Python na mbomb007 .
źródło
Lua, 207 bajtów
źródło
Python 3 ,
114110109116 bajtówW rzeczywistości wziąłbym dwa bajty mniej w Pythonie 2, ponieważ
exec
jest to instrukcja i nie potrzebuje nawiasów ...Zaoszczędź 4 dodatkowe bajty dzięki @ElPedro
Zapisano dodatkowy bajt, wykorzystując fakt, że
find
zwraca błąd po błędzie, który można następnie wykorzystać jako indeks+7 bajtów, ponieważ nie zauważyłem zasady braku nowych linii :(
Wypróbuj online!
Mapuje pierwszy znak każdego słowa wejściowego na fragment kodu Pythona. Są one następnie łączone i
exec
edytowane.Całkiem proste podejście, które prawdopodobnie można by trochę pograć w golfa. Trudność polega głównie na znalezieniu najkrótszej formy spośród wielu możliwych ...
źródło
print(i,end='')
. Zobacz 4. przypadek testowy.Ruby +
-na
,817365 bajtówWypróbuj online!
Całkiem proste. Dla pierwszej litery każdego słowa znajdź odpowiedni ciąg polecenia i
eval
go. Używa podziału na liczby całkowite iexits
rzucającZeroDivisionError
.-5 bajtów: użyj
.ord%11%6
zamiast wyszukiwania łańcucha. Kredyt trafia do użytkownika202729-3 bajty:
.ord
uwzględnia tylko pierwszy znak ciągu, więc mogę pominąć a[0]
.-8 bajtów: Użyj
-a
flagi, aby automatycznie podzielić dane wejściowe, dzięki Kirill L.źródło
-a
opcję wykonania automatycznego podziału za ciebie, w ten sposóbEmojicode , 270 bajtów
Wypróbuj online!
źródło
SNOBOL4 (CSNOBOL4) , 165 bajtów
Wypróbuj online!
Obrzydliwy.
źródło
C # (.NET Core), 186 bajtów
źródło
i
zv
, konsultacji z tabeli ASCII, dzięki czemu można używać małych liczb, rozmieszczanieif
s, a następnie za pomocą potrójnego:class Z{static void Main(string[]a){int v=0,i;foreach(var s in a){i=s[0]%'d';if(i==1)break;if(i>9)System.Console.Write(v);else v=i<1?v-1:i<5?v/2:i<6?v+1:v*2;}}}
(PS wyjaśnienie jak to działa i jak używać to (np. oczekuje, że argumenty wiersza poleceń) jest zawsze mile widziane!)%50
zamiast%'d'
)Perl 5
-a
, 61 bajtówWypróbuj online!
Stole @ user202729's
ord%11%6
sztuczkiW jaki sposób?
źródło
Pyth, 44 bajtów
Pakiet testowy
wyjaśnienie
źródło
TI-BASIC, 112 bajtów
Wykorzystuje to niektóre założenia, które są AFAIK całkowicie do przyjęcia. Po pierwsze, wszystkie zmienne są inicjowane do zera przed wykonaniem; po drugie, wejście jest pobierane przez
Ans
.źródło
Java (OpenJDK 8) , 164 bajty
Wypróbuj online!
Powyżej znajduje się moje rozwiązanie, które zaokrągla liczby całkowite, ale poniżej moje rozwiązanie, które obsługuje liczby dziesiętne. Nieprzyjemny sposób, w jaki java drukuje dwukrotnie, dodaje kolejne 55 bajtów do wyniku. Zostawiłem nowe wiersze, aby kod był bardziej czytelny przy drugim przesyłaniu tylko dlatego, że jest to zasadniczo to samo rozwiązanie z jednym dodatkowym poleceniem i instrukcją importu.
Java (OpenJDK 8) , 219 bajtów
Wypróbuj online!
źródło
C (gcc) ,
120114111 bajtów-6 bajtów dzięki pułapkowi cat.
Wypróbuj online!
124 bajty
Wersja zmiennoprzecinkowa:
Wypróbuj online!
Nie zawracałem sobie głowy wersją, która zaokrągla w dół, ale robi wyjątek dla 0, co byłoby dozwolone, jeśli poprawnie rozumiem łańcuch komentarzy.
źródło
33 , 62 bajty
Wypróbuj online!
Ten program przyjmuje instrukcje rozdzielone znakami nowej linii
Wyjaśnienie:
Kod przed tym segmentem definiuje wszystkie funkcje.
źródło