3var jest odmianą martwych ryb, która wykorzystuje trzy zmienne zwane A, B i R. A i B to akumulatory, natomiast R jest zmienną wynikową.
W tym wyzwaniu golfa musisz stworzyć tłumacza dla uproszczonej wersji tego języka.
Wymagane polecenia:
i Increments A
d Decrements A
s Squares A
p Prints A
P Prints the ASCII character of A
> Sets A to R
a Increments B
k Decrements B
m Squares B
o Prints B
O Prints the ASCII character of B
< Sets B to R
+ Adds A and B, stores in R
- Subtracts B from A, stores in R
* Multiplies A and B, stores in R
/ Divides A by B, stores in R
w Prints R
@ Resets A to 0
# Resets B to 0
e Resets R to 0
Cała reszta (w tym białe znaki) jest ignorowana.
Wyjaśnienia
o
ip
powinien po tym wyjść bez niczego.- Podział to podział na liczby całkowite.
- Obsługiwane są liczby powyżej 255 i liczby poniżej 0.
- „w” powinno wypisywać spację lub znak nowej linii po R
- Dzielenie przez 0 zatrzymuje się bez błędów. (Brak danych wyjściowych do STDERR)
- A, B i R mają początkowo wartość 0
Zasady
- To jest golf golfowy, więc wygrywa najkrótsza odpowiedź.
- W przypadku remisu wygrywa najstarsza odpowiedź.
- Plik zostanie dostarczony za pomocą argumentów wiersza poleceń lub STDIN.
- Dowolny język jest dozwolony.
- Ewaluacja jest dozwolona.
Przypadki testowe
Hello world!
(pochodzi z Esolangs)
iisssaa/>e
maa->e#
aamam->e#
dddddddddddddddddddddddddPiiiiiiiiiiiiiiiiiiiiiiiii
iiiiPiiiiiiiPPiiiP
@#e
iis
aamaaaa
*>P
@#e
iisssaa/>e
maa->e#
aamam->e#
iiiiiiiiiiiiiiiiiiiiiiP
ddddddddP
iiiP
ddddddP
ddddddddP
@#e
iiss
aa*>
iP
Wyjścia 20spooky22me
:
iipois+iis<-<aaaO<OkOOkkkkOP@#iippisa+<m+>PaO
Wyjścia 9P-1420 100 3Q-1 162 0
:
iiispsdPkokmo/w<+w#aaaommO-w@ii*wew
Liderów
Oto fragment kodu, który pozwala wygenerować zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka.
Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:
# Language Name, N bytes
gdzie N
jest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik to suma dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:
# Perl, 43 + 2 (-p flag) = 45 bytes
Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie tabeli wyników:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
var QUESTION_ID=63008,OVERRIDE_USER=45220;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"http://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
źródło
dddddp
daje wynik -5 iiiiissp
256 jak można się spodziewać, zamiast 0.r
? nie ma go na liście prawidłowych poleceń@#e
.Odpowiedzi:
CJam, 112
Wypróbuj online
Wyjaśnienie:
Program buduje tablicę fragmentów kodu do wykonania i wykonuje odpowiedni fragment dla każdego znaku. Radzenie sobie z dzieleniem przez zero jest trudniejsze, ponieważ CJam nie ma jeszcze operatora „break”. Zamiast tego program naciska π jako znacznik (ponieważ inaczej liczba zmiennoprzecinkowa nie może pojawić się inaczej), a na końcu zachowuje tylko dane wyjściowe przed pierwszym π.
Ponadto program używa zmiennych T, U i V zamiast A, B i R, ponieważ są one wstępnie zainicjowane z 0 w CJam.
Rzeczywiste implementacje poleceń (zbudowane przez program):
źródło
JavaScript (ES7) 208
213 223 237 241 311Edycja3 Kopiując się , ja i Dendrobium zwijają się razem.
Edit2 Korzystanie ECMAScript 7, aby zapisać tylko 2 bajty, połączone manipulacyjny A i B
Edytuj Po zmianach zasad.
Uwaga: dodałemr
polecenie, które nie jest wymagane w pytaniu, aby uruchomić stary przykład Hello worldźródło
A=B=R=0,
i ustawienie tych zmiennych przy użyciu rzeczywistych 3var funkcje przed przetworzeniem ciąg, takich jak:[...'@#e'+p]
.GNU Sed (z opcją eval do oceny
dc
wyrażenia), 254Deadfish mapuje całkiem ładnie na podzbiór
dc
. Więc używamy sed do wykonania tego mapowania:źródło
JavaScript
ES6ES7,217215213208 bajtówBez golfa
źródło
A=B=R=0,
i ustawienie tych zmiennych przy użyciu rzeczywistych 3var funkcje przed przetworzeniem ciąg, takich jak:for(c of '@#e'+s)
.w
APL, 191
Jest to funkcja, która przyjmuje program jako argument, np .:
Można go użyć jako funkcji anonimowej, właśnie nadałem mu nazwę dla przejrzystości.
Wyjaśnienie:
0::→
: jeśli wystąpi błąd (powiedzmy, dzielenie przez zero), zatrzymaj się bez drukowania komunikatu o błędzieA B R←0
: inicjowanie zmiennych{
...}¨⍵
: dla każdego polecenia:⍵∊G←'aikdms<>'
: Jeśli polecenie jest typu var ← fn (var, x) , znajdź właściwe fn i x , zamień je na, a następnie oceń:⍎
: oceń'AB'[1+2|G⍳⍵
:A
jeśli pozycja⍵
in'aikdms<>'
jest parzysta, wB
przeciwnym razie.'+-*∘'[M]
: dodawanie, odejmowanie, moc lub nic, w zależności odM
(zdefiniowane później)'←'
: przypisać'112R'[M←⌈2÷⍨G⍳⍵]
:1
(do dodawania i odejmowania),2
(dla mocy) iR
(dla niczego, tzn. po prostu ustawia zmienną naR
), w zależności od tegoM
, czy polecenie należy do pierwszej, drugiej, trzeciej lub czwartej pary.⍵∊G←'PpOo'
: wyjście:⍞←
: wyjście⎕UCS⍣(2|G⍳⍵)
: ASCII (cóż, Unicode) lub liczba w zależności od tego, czy polecenie było na parze nieparzystej czy parzystejPpOo
,⊢A B[⌈2÷⍨G⍳⍵]
:A
lubB
, w zależności od tego, czy polecenie było w pierwszej czy drugiej połowie.⍵∊G←'+-*/
: matematyka:R∘←⌊A(⍎'+-×÷'[G⍳⍵])B
: ustawianyR
na wynik zastosowania danego operatora doA
iB
.⍵∊G←'@#e':
nastawić:⍎
: oceń'ABR'[G⍳⍵]
: wybierz odpowiednią zmienną'∘←0
„: ustawiony na zero⍵='w':⍞←R
: jeśli polecenie jestw
, wyjścieR
.źródło
C,
253241 bajtówTen kod wykorzystuje ciąg znaków
id@s>ak#m<e+-*/wpoPO
jako tabelę poleceń. Ciąg jest ułożony zgodnie z miejscem docelowym obliczonego wyrażenia. Tak się składa, że 5 poleceń aktualizuje każdą ze zmiennych:id@s>
- aktualizacjaa
ak#m<
- aktualizacjab
e+-*/
- aktualizacjar
wpoPO
- zaktualizuj ... lokalizację pamięci poa
,b
ir
. Mam nadzieję, że to nie jest zbyt ważne :)Więc po zlokalizowaniu znaku wejściowego w ciągu poleceń, jego indeks jest wielokrotnie zmniejszany, aw zależności od tego, kiedy osiągnie 0, wybierane jest wyrażenie.
Jeśli nie osiągnie 0 po 15 odejmowaniach, jest to
printf
z odpowiednio dobranymi argumentami.Ponadto podczas dzielenia unika dzielenia przez 0 przez wywołanie
exit()
.To kod powinien być zestawiane bez optymalizacji, gdyż zakłada się, że
a
,b
ir
znajdują się w sąsiadujących adresów na stos (nie rejestrów CPU).Ponadto należy go skompilować w trybie 32-bitowym, ponieważ konwertuje wskaźniki na liczby całkowite i odwrotnie.
źródło
VBA,
484, 453380 bajtówZbyt długo, aby wygrać, ale bardzo prosty sposób na robienie rzeczy, nic Fancy po prostu dobre stare
Select Case
Dodawanie podziału liczb całkowitych i obsługi błędów Div 0 Zjadłem wiele bajtówUsunięto obsługę błędów, ponieważ wydaje się, że normalna obsługa błędów daje tę samą funkcjonalność. Naprawiono Int Division działający zgodnie z oczekiwaniami. Był także krótszy.
źródło
DefInt A-Z
, pomijając w ten sposób potrzebę wyraźnie oświadczającA
,B
iR
takInteger
:DefInt A-Z:Dim A, B, R
. To równie dobrze może pracować tylko przypisać je, bez deklaracji:A=0:B=0:R=0
. Obliczenia również powinny działać na wariantach.DefInt
czymś, czego używam na co dzień, ale w przyszłości będę bardzo przydatny w grze w golfa. NiestetyA=0
, po prostu sprawi, że będzie działał jak podwójny wynik z moich testów. Tam wytwarzanieiiiaa/w
daje wynik dziesiętny, a nie całość.PHP, 310 bajtów
Pierwszy raz w życiu za pomocą
:eval
Pobiera dane z pierwszego wiersza poleceń:
Dane wyjściowe z przykładów:
źródło
C 357
Makra FTW!
(Żartuję - c nigdy tego nie wygra)
źródło
JavaScript (ES6),
293262 bajtówStosowanie
Wyjaśnienie
Jest kilka szczegółów dotyczących języka, którego nie jestem pewien (rozmiary całkowite, obsługa nierozpoznanych znaków itp.), Ale to rozwiązanie wydaje się działać wystarczająco dobrze i ignoruje białe znaki, takie jak znaki nowej linii w przypadku testowym.
źródło
:$=>
z$
, a następnie dodanie wymienić na sznurku.Simplex v.0.8 , 211 bajtów
(Kodowany UTF-8).
Wyjaśnienie
Ponieważ jest to najdłuższy program simpleksowy, jaki do tej pory napisałem, ogólnie wyjaśnię, jak to działa w punktorach.
h@u]
- definiuje makro 0. To makro po prostu zapisuje do rejestru i sprawia, że lambda nic nie zwraca.u2
- przechodzi do powyższego paska i ustawia bieżący bajt na 2; określa to arianię lambdów, które należy zdefiniować.ƒ
- rozpocząć wyrażanie lambda; po zakończeniu]
przesunie funkcję lambda na stos lambda. Działa, pobierając (arity) komórki ze wskaźnika do paska lokalnego, a po zakończeniu ustawia pasek lokalny do pobranych komórek, chyba że bieżący bajt nie zostanie zapisany. Nie ma to wpływu na wskaźnik. Makro 0 pozwala na powrót funkcji bez modyfikowania czegokolwiek na pasku.§
- przechodzi do pierwszej zapisanej komórki w bieżącym pasku, tjA
.ð
- przechodzi do ostatniej zapisanej komórki w bieżącym pasku, tjB
.{"idspP>akmoO<+-*/w@#e"RlyG^u·u†vøÏ}
{...Ï}
powtarzaj, aż stos wejściowy będzie pusty"idspP>akmoO<+-*/w@#e"
- poleceniaRly
- włóż pasek w krotkęG^u
- indeks danych wejściowych w krotce·
- załaduj aktualny bajt th do analizatora lambdauRL
- idzie do paska gospodarstwaA
iB
(piszeA
iB
jeśli nie istnieją)†
- wykonuje lambda (jest to ewaluator lambda)vø
- resetuje się poniżej paskauff , jestem pod wrażeniem. Długo jest na Simplex, ale skrót od wszystkiego innego.
;)
źródło
Minkolang 0.11 , 222 bajty
Jestem pewien, że można dalej grać w golfa, ale było fajnie. Również pierwszy tłumacz Minkolang w innym języku!
Wypróbuj tutaj.
Wyjaśnienie
Pozostałe wiersze są dość proste, być może z wyjątkiem tych
1$((dl%"0"+$rl:d)$Ok
, które są idiomem, który wypisuje liczbę bez spacji końcowej. (Nie wdrożyłem jeszcze funkcji konwersji tego numeru na ciąg znaków, która będzie1Z
.) Och, tak, wszystkie mająv
na początku, co zabiera je z powrotem na początek.źródło
GNU Sed (z opcją eval do oceny ekspresji DC), 289
Zainspirowany Digital Trauma, który niestety nie zdał sobie sprawy, że a) nielegalne znaki należy zignorować, b) dc potrzebuje całego przekonwertowanego programu w jednym argumencie, c) dzielenie przez 0 musi zakończyć program bez błędu.
Gdyby wszystkie te reguły nie miały zastosowania, moje rozwiązanie miałoby tylko 235 bajtów długości;)
źródło
AWK,
311309Nawias TIL nie był potrzebny wokół printf. 2 bajty zapisane!
Wersja bez golfa dla łatwiejszego czytania:
źródło
Python 2, 272
źródło
print
wyciągi zawierają znak nowej linii.Ruby, 199 bajtów
5 bajtów można zapisać, usuwając
.read
z drugiej linii, jeśli tolerujesz drukowanie ostrzeżenia na stderr na nowszej wersji Ruby.źródło
Python, 244
Trochę późno, ale chciałem spróbować.
źródło
Prolog, 759 bajtów
Nie jest to najkrótszy program, ale przynajmniej jest uporządkowany i czytelny.
Przykładowe dane wejściowe
Wypróbuj online tutaj
źródło