Prawda-maszyna (kredyty idzie do tego faceta za wymyślanie nim) Jest to bardzo prosty program przeznaczony do wykazania strumień we / wy i sterowania języka. Oto, co robi maszyna prawdy:
Pobiera liczbę (0 lub 1) z STDIN.
Jeśli ta liczba to 0, wydrukuj 0 i zakończ.
Jeśli liczba ta wynosi 1, wydrukuj 1 na zawsze.
Wyzwanie
Napisz maszynę prawdy, jak opisano powyżej, w wybranym języku. Maszyna prawdy musi być pełnym programem, który przestrzega następujących zasad:
- pobrać dane ze STDIN lub akceptowalnej alternatywy
- Jeśli twój język nie może przyjmować danych wejściowych ze STDIN, może pobierać dane ze zmiennej zakodowanej na stałe lub odpowiedniego odpowiednika w programie
- musi generować do STDOUT lub akceptowalnej alternatywy
- Jeśli twój język nie jest w stanie wypisać znaków
0
lub 1
, bajt lub jednoargumentowe We / Wy są dopuszczalne.
- gdy wejście jest
1
, musi stale drukować 1
s i zatrzymywać się tylko wtedy, gdy program zostanie zabity lub zabraknie pamięci
po danych wyjściowych musi 0
następować albo jedna, albo żadna nowa linia lub spacja, albo nieskończone 1
s, każda 1
po której następuje jedna lub żadna nowa linia lub spacja. Żadne inne dane wyjściowe nie mogą być generowane, z wyjątkiem stałych wyników tłumacza języka, których nie można stłumić (takich jak powitanie, kody kolorów ANSI lub wcięcia). Używanie znaku nowej linii lub spacji musi być spójne: na przykład, jeśli zdecydujesz się na wyjście 1
za pomocą nowego wiersza po wszystkim, 1
s musi mieć po nim nowy wiersz.
wtedy i tylko wtedy, gdy twój język nie może zakończyć się na wejściu 0
, dopuszczalne jest, aby kod wszedł w nieskończoną pętlę, w której nic nie jest wyprowadzane.
Ponieważ jest to katalog, języki utworzone po tym wyzwaniu mogą konkurować. Pamiętaj, że musi być tłumacz, aby można było przetestować zgłoszenie. Dozwolone jest (a nawet zachęcane) samodzielne pisanie tego tłumacza dla wcześniej niewdrożonego języka. Poza tym wszystkie standardowe zasady golfa kodowego . Zgłoszenia w większości języków będą oceniane w bajtach w odpowiednim wcześniej istniejącym kodowaniu (zwykle UTF-8).
Katalog
Fragment kodu na dole tego postu generuje katalog na podstawie odpowiedzi a) jako listy najkrótszych rozwiązań dla każdego języka oraz b) jako ogólnej tabeli wyników.
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 jest sumą 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:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
<style>body { text-align: left !important} #answer-list { padding: 10px; width: 290px; float: left; } #language-list { padding: 10px; width: 320px; float: left; } table thead { font-weight: bold; } table td { padding: 5px; }</style><script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="language-list"> <h2>Shortest Solution 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> <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> <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><script>var QUESTION_ID = 62732; var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe"; var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk"; var OVERRIDE_USER = 12012; var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page; function answersUrl(index) { return "https://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER; } function commentUrl(index, answers) { return "https://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER; } function getAnswers() { jQuery.ajax({ url: answersUrl(answer_page++), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { answers.push.apply(answers, data.items); answers_hash = []; answer_ids = []; data.items.forEach(function(a) { a.comments = []; var id = +a.share_link.match(/\d+/); answer_ids.push(id); answers_hash[id] = a; }); if (!data.has_more) more_answers = false; comment_page = 1; getComments(); } }); } function getComments() { jQuery.ajax({ url: commentUrl(comment_page++, answer_ids), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { data.items.forEach(function(c) { if (c.owner.user_id === OVERRIDE_USER) answers_hash[c.post_id].comments.push(c); }); if (data.has_more) getComments(); else if (more_answers) getAnswers(); else process(); } }); } getAnswers(); var SCORE_REG = /<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/; var OVERRIDE_REG = /^Override\s*header:\s*/i; function getAuthorName(a) { return a.owner.display_name; } function process() { var valid = []; answers.forEach(function(a) { var body = a.body; a.comments.forEach(function(c) { if(OVERRIDE_REG.test(c.body)) body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>'; }); var match = body.match(SCORE_REG); if (match) valid.push({ user: getAuthorName(a), size: +match[2], language: match[1], link: a.share_link, }); else console.log(body); }); valid.sort(function (a, b) { var aB = a.size, bB = b.size; return aB - bB }); var languages = {}; var place = 1; var lastSize = null; var lastPlace = 1; valid.forEach(function (a) { if (a.size != lastSize) lastPlace = place; lastSize = a.size; ++place; var answer = jQuery("#answer-template").html(); answer = answer.replace("{{PLACE}}", lastPlace + ".") .replace("{{NAME}}", a.user) .replace("{{LANGUAGE}}", a.language) .replace("{{SIZE}}", a.size) .replace("{{LINK}}", a.link); answer = jQuery(answer); jQuery("#answers").append(answer); var lang = a.language; lang = jQuery('<a>'+lang+'</a>').text(); languages[lang] = languages[lang] || {lang: a.language, lang_raw: lang.toLowerCase(), user: a.user, size: a.size, link: a.link}; }); var langs = []; for (var lang in languages) if (languages.hasOwnProperty(lang)) langs.push(languages[lang]); langs.sort(function (a, b) { if (a.lang_raw > b.lang_raw) return 1; if (a.lang_raw < b.lang_raw) return -1; return 0; }); for (var i = 0; i < langs.length; ++i) { var language = jQuery("#language-template").html(); var lang = langs[i]; language = language.replace("{{LANGUAGE}}", lang.lang) .replace("{{NAME}}", lang.user) .replace("{{SIZE}}", lang.size) .replace("{{LINK}}", lang.link); language = jQuery(language); jQuery("#languages").append(language); } }</script>
Bf
ibf
być różne języki.Odpowiedzi:
Sześciokąt , 6 bajtów
Było to zaskakująco trudne
i nie jestem przekonany, czy jest optymalne ...Po wypełnieniu i rozwinięciu kodu reprezentuje to następującą siatkę heksadecymalną:
Wykorzystuje to podobny przepływ kontrolny, jak mój ostatni bezbłędny program dla kotów , poruszający się po przekątnych. Aby to osiągnąć, zaczynamy od odchylenia wskaźnika instrukcji (IP) w lewo, gdzie fioletowa ścieżka otacza lewy dolny róg.
?
odczytuje dane wejściowe jako liczbę całkowitą.!
drukuje to z powrotem..
jest po prostu zakazem. Teraz róg siatki działa jak gałąź:Jeśli dane wejściowe były
0
, adres IP będzie kontynuowany wzdłuż czerwonej ścieżki, która po prostu kończy działanie programu@
.Jeśli dane wejściowe były
1
, adres IP będzie kontynuowany na zielonej ścieżce. Ponownie,.
to po prostu brak możliwości, ale$
jest odpowiednikiem trampoliny Befunge: pomija następną instrukcję. Po zawinięciu następna instrukcja byłaby?
, ale ze względu na$
wykonanie faktycznie kontynuuje na niebieskiej ścieżce, zaczynając od!
wydrukowania kolejnej kopii1
. Ta pętla, która zawiera tylko,!..$
jest teraz powtarzana w nieskończoność.Badanie przepływu kontrolnego w Hexagony ...
Uważam, że powyższe rozwiązanie jest optymalne. Napisałem brutalny forcer, który sprawdza wszystkie 6-bajtowe programy Hexagony, które zawierają co najmniej jeden z nich
?!@
(które są konieczne; sprawdziłem również:
i%
zamiast tego@
kończyć się błędem dzielenia przez zero, ale to też nie pomogło). Czek wypisuje wszystkie programy, które a) wytwarzają0
wejście0
i kończą oraz b) wytwarzają co najmniej dwa1
s (i nic więcej) i nie kończą się w ciągu pierwszych 60 znaczników programu (200 znaczników dla rozwiązań 5-bajtowych) . Wątpię, aby każde prawidłowe rozwiązanie wymagało więcej niż 200 tyknięć, aby poprawnie wydrukować pierwszy0
lub drugi1
na tak małej siatce, więc nie sądzę, że nie przegapiłem żadnych potencjalnych rozwiązań.Wyszukiwanie nie przyniosło żadnych wyników dla 5 bajtów, ale 57 wyników dla 6 bajtów (przy użyciu
@
; nie trzeba kończyć z błędem, jeśli możemy rozwiązać ten problem w tej samej ilości bajtów). Z tych 57 tylko 6 było fałszywie dodatnich, które w rzeczywistości wydrukowały tylko dwie1
sekundy, a następnie weszły w nieskończoną pętlę bez drukowania. Jedno rozwiązanie zostało wymienione dwukrotnie, ponieważ zawierało dwa!
polecenia. Pozostawia dokładnie 50 poprawnych rozwiązań.Istnieje pewna degeneracja między rozwiązaniami, w których jedna lub dwie postacie nie są znaczące, np. Dlatego, że i tak nie działają. Rozwiązania można pogrupować w 23 zestawy naprawdę odrębnych programów (w niektórych przypadkach istnieje tylko jedna różnica znaków między dwoma zestawami, ale zmienia to znacznie przepływ sterowania, więc policzyłem je osobno). Dwie grupy nawet wykorzystują wiele wskaźników instrukcji w bardzo nieoczekiwany sposób. Ponieważ nigdy nie wymyśliłem większości tych sposobów korzystania z rozgałęzień i luster, robią one bardzo interesujące studium tego, jaki rodzaj kontroli jest możliwy w Hexagony, i na pewno nauczyłem się nowych sztuczek dla przyszłych golfów.
Ogólny przepływ sterowania jest prawie zawsze taka sama: odczytać numer, wydrukować go. Jeśli
0
znajdziesz sposób na@
, jeśli nie, kontynuuj zapętlanie, utrzymując!
jednocześnie wartość krawędzi1
. Istnieją cztery godne uwagi wyjątki:!
) drukuje dwie1
s na iterację przez siatkę, dlatego drukuje około dwa razy szybciej niż większość programów. Oznacziłem tenx2
poniżej.o
) wymieni1
z111
(kodem znakuo
), więc wydrukować trzy1
s na iteracji, co czyni je wydrukować około trzy razy tak szybko, jak w większości programów. Oznacziłem jex3
poniżej.1
do wartości krawędzi w każdej iteracji (więc1
->11
->111
-> ...). Te drukują się bardzo szybko, ale w końcu zabraknie im pamięci. Oznacziłem jeOoM
poniżej.!
, drukując co drugi tik (zamiast co piątego lub więcej), co czyni je nieco szybszymi (i bardziej uporządkowanymi). Oznacziłem je><
poniżej.Oto całe zoo:
Poniżej znajduje się krótki przewodnik dla kilku bardziej reprezentatywnych grup. Szczególnie warto sprawdzić grupy 10 i 23. Istnieje wiele innych interesujących i czasami skomplikowanych ścieżek w innych grupach, ale myślę, że na koniec dość mi się nudziłem. Dla każdego, kto naprawdę chce nauczyć się heksagonii, zdecydowanie warto je zbadać, ponieważ wykazują jeszcze więcej możliwych zastosowań lusterek i
$
.Grupa 1
To nie jest dużo bardziej skomplikowane niż moje oryginalne rozwiązanie, ale ścieżki idą w różnych kierunkach. Pozwala również na największą liczbę odmian w jednej komórce, ponieważ najbardziej prawy brak no-op można zastąpić 5 różnymi poleceniami, które nadal sprawiają, że jest to ważne bez zmiany struktury:
Grupa 2
Ten jest dość interesujący, ponieważ porusza się tylko w poziomie. Po zawinięciu do
>
adresu IP natychmiast się odwraca, biorąc gałąź w rogu. Nie jest to całkiem dobrze widoczny schemat, ale w przypadku ponownie1
przechodzimy do pierwszego rzędu, ale tym razem do tyłu. Oznacza to również, że?
ponownie się na nie natkniemy, co teraz zwraca0
(EOF). Jest to naprawione za pomocą)
(przyrostu), aby zachować drukowanie1
. Ma to również 5 odmian, a)
może być również1
lubo
, i>
może być także|
:Grupa 3
Ten wygląda prawie identycznie jak poprzedni, ale jest bałaganiarski jak diabli.
|
To samo dotyczy uderzenia, a następnie przejścia dolnego lub górnego rzędu. Ale w przypadku pętli$
teraz przeskakuje nad)
na lustrze. Idziemy więc turkusową ścieżką po prawej stronie, teraz uderzamy o przyrost, przeskakujemy@
przed, zanim|
ponownie się zawiniemy, a następnie wracamy do zielonej ścieżki u góry.Grupa 4
Myślałem, że ten był wyjątkowo fajny:
_
Lustro w prawym górnym rogu jest początkowo no-op, więc drukować!
i hit<
.0
Ścieżka uderza teraz poziome lustro i kończy.1
Ścieżka trwa bardzo interesujący tor chociaż: to ugina w dół, zawija do!
, zostanie przekierowany do linii poziomej, a następnie owija powrotem do!
ponownie . Następnie porusza się w tym kształcie rombu, drukując dwa razy na iterację (co trzeci tik).Grupa 8
To jedno z dwóch rozwiązań z bardzo ciasną pętlą drukującą:
Że
<
działa jako oddział. Po dwukrotnym owinięciu0
trafienia@
.1
z drugiej strony, najpierw przeskakuje?
, a następnie>
przesyła go$
ponownie do, więc przeskakuje@
. Następnie IP owija się w turkusową ścieżkę, gdzie odbija się tam iz powrotem między>
i<
(owija się wokół krawędzi pomiędzy).Grupa 10
Jedna z dwóch grup, które używają innych wskaźników instrukcji i jest absolutnie piękna. Sześciokąty mają 6 - każdy zaczyna się od innego rogu wzdłuż krawędzi zgodnej z ruchem wskazówek zegara, ale tylko jeden z nich jest aktywny na raz.
Jak zwykle czytamy
?
. Teraz~
jest jednoargumentacja: zamienia on1
w-1
. Następnie trafiliśmy na#
. Jest to jeden ze sposobów przełączania między adresami IP: pobiera bieżącą wartość krawędzi modulo 6 i przełącza się na odpowiedni adres IP (adresy IP są ponumerowane0
zgodnie z ruchem wskazówek zegara). Więc jeśli dane wejściowe były0
, wtedy IP po prostu pozostaje takie samo i nudzi się prosto do przodu!@
. Ale jeśli dane wejściowe były1
, to aktualna wartość jest taka,-1
która jest5 (mod 6)
. Przełączamy się więc na adres IP, który zaczyna się w tej samej komórce (zielona ścieżka). Teraz#
nie ma opcji i?
ustawia krawędź pamięci na0
.)
przyrosty, więc!
drukuje a1
. Teraz uderzamy~
ponownie, aby to zapewnić#
nadal nie działa (w przeciwieństwie do przełączania nas na IP 1, co kończy program). To niesamowite, jak dobrze wszystko pasuje do siebie w tym małym programie.Grupa 22
Należy zauważyć, że jest to grupa, w której znajduje się moje oryginalne rozwiązanie. Zdarza się również, że jest to największa grupa, ponieważ brak operacji może znajdować się w dwóch różnych miejscach i istnieje kilka opcji dla rzeczywistego polecenia (efektywnego braku operacji).
Grupa 23
To druga grupa korzystająca z wielu adresów IP. W rzeczywistości ten wykorzystuje 3 różne adresy IP. W prawym górnym rogu jest trochę bałaganu, ale spróbuję przeprowadzić Cię przez to:
Tak więc początek, który widziałeś wcześniej:
<
odbija północno-wschodni,?
odczytuje dane wejściowe. Teraz]
jest inny sposób przełączania między adresami IP: przekazuje kontrolę do następnego adresu IP w kolejności zgodnej z ruchem wskazówek zegara. Przełączamy więc kontrolę na turkusową ścieżkę, która (wiem, że trudno ją zobaczyć) zaczyna się w narożniku północno-wschodnim i przechodzi na południowy wschód. Od razu odbija się to<
tak, że owija się w południowo-wschodni róg, kierując się na północny zachód. To także uderza]
więc przejść do następnego OD. To jest szara ścieżka rozpoczynająca się we wschodnim rogu, prowadząca na południowy zachód. Drukuje dane wejściowe, a następnie zawija do północno-wschodniego rogu.<
odchyla ścieżkę do poziomu, gdzie jest odbijana przez drugą<
. Teraz prawa ręka<
działa jak gałąź: jeśli dane wejściowe były0
, IP przenosi się na północny wschód i opada na@
. Jeśli dane wejściowe były1
, IP przesuwa się do!
, zawija w lewą stronę,<
gdzie jest odbijane ... teraz w rogu, zawija się z powrotem!
, odbija się w prawo<
, odbija w lewo,<
a ścieżki zaczynają się koniec...Całkiem bałagan, ale piękny bałagan. :)
Diagramy wygenerowane przez niesamowity HexagonyColorer Timwi .
źródło
Kod maszynowy Motorola MC14500B , 2 bajty
W hex:
Wyjaśnienie:
Motorola MC14500B jest 1-bitowym mikrokontrolerem; ma jeden 1-bitowy rejestr i 1-bitową szynę danych. Ponieważ kody operacyjne mają po 4 bity, jest ich tylko szesnaście; połowa z nich wykonuje operację logiczną między rejestrem a bitem na szynie danych.
Instrukcja skoku ustawia flagę skoku; gdy nie podano adresu, zwykle ustawia się licznik programu na 0. Jeśli bit wejściowy wynosił zero, procesor nie skoczy. Jeśli bit wejściowy miał wartość 1, procesor przeskakuje z powrotem na początek; ponieważ korzystamy
OR
z wejścia, nie ma znaczenia, jaki będzie potem sygnał wejściowy - rejestr będzie miał 1 na zawsze.Jak zwykle, rejestr jest inicjowany na 0.
Listę kodów operacyjnych można znaleźć w arkuszu danych lub tutaj .
źródło
Arnold C, 296 bajtów
Nie bardzo konkurencyjny, ale dla zabawy. Nie obsługuje stdin, wymienić
@NO PROBLEMO
się@I LIED
do wartości zerowej.@No Problemo
wynosi 1.Uruchom z (zakładając, że plik ma wartość truemachine.arnoldc):
źródło
BECAUSE I'M GOING TO SAY PLEASE
LOLif(i){while(i) print(i);} else {print(i);}
Z pewnością byłoby to krótszeprint(i);while(i) print(i);
?BULLSHIT
ma duży wkład w wartość rozrywkową programu, technicznie nie jest to konieczne. Możesz uwzględnić całąBULLSHIT
gałąź, przechodzącTALK TO THE HAND i
za niąYOU HAVE NO RESPECT FOR LOGIC
.BULLSHIT
Minecraft, 18 bajtów (wersja MC 15w45a)
Jak widać, w powtarzającym się bloku poleceń znajduje się dźwignia, w której znajduje się polecenie
say 1
. Na wierzchu znajduje się sygnał odwracający pochodnię, który kieruje moc do bloku pojedynczego uruchomienia z poleceniemsay 0
w nim.Ilekroć przełącznik jest skierowany w stronę prawdy, blok repeatera używa kodu
say 1
do wyprowadzania nieskończonych1
s. Gdy dźwignia zostanie przekierowana na false, wyprowadza pojedynczy0
.Zauważ, że
[@]
domyślnie jest to wyjście a . Jeśli naprawdę chcesz po prostu zerować jedynki i zera, to staje się 34 bajtami, gdzie kod w blokach poleceń totellraw @a [1]
itellraw @a [0]
. Wykorzystuje to sugerowaną liczbę bajtów @ Cᴏɴᴏʀ O'Bʀɪᴇɴ dla MC, co można znaleźć w Meta .źródło
is:answer Minecraft
. c:Narzędzia Bash + GNU, 13
Bash, 35
źródło
Ruby, 20 lat
Uruchom z wiersza poleceń, aby uniknąć ostrzeżeń, jak
Wyjaśnienie:
To jest mniej golfa
Kiedy Regexp jest używany w warunkach warunkowych, ocenia się go jako falsey, chyba że zmienna
$_
jest zapełniona i pasuje do wzorca. Za pierwszym razem przez pętlę$_
jest pusty, więc przechodzimy dogets
, który ustawia wartość$_
do linii odczytanej ze STDIN.print
bez drukowanych argumentów$_
. Teraz ponownie oceniamy warunki warunkowe. Jeśli czytamy w 1, zwieramy i po prostu drukujemy 1 ponownie, i tak dalej. W przeciwnym razie przechodzimy dogets
, ale ponieważ nie ma drugiego wiersza wejścia,gets
zwraca zero, więc pętla się kończy.źródło
||gets
część jest fajna, ale czy nie możesz po prostu zrobićgets;print while/1/
bajtu?Microscript, 3 bajty
Najkrótszy, jaki znam.
Wyjaśnienie:
Po skasowaniu mikrokrypt ma niejawne drukowanie rejestru 1, co powoduje, że dane wejściowe
0
są drukowane jeden raz.źródło
Kod maszynowy Turinga, 32 bajty
Za pomocą składni tabeli reguł znajdującej się tutaj.
źródło
JavaScript, 28 bajtów
Pętle są często krótsze niż pętle while.
alert(x)
zwracaundefined
, co jest fałszem, więc operator bitowy lub operator, rzutuje|
na0
. Tak więc, jeślix
jest"0"
, zaalarmuj raz, w przeciwnym razie kontynuuj zapętlenie. Używaalert
STDOUT jak ta odpowiedź .źródło
SyntaxError
bez niego.Python 2, 29 bajtów
Kończy się z włączonym błędem podziału
0
, który jest domyślnie dozwolony .źródło
Brainfuck,
41363130 bajtówSkrócono, drukując jeden raz zaraz po wprowadzeniu danych i przy pomocy Ethana i użytkownika46915.
Poprzednia wersja: odejmij 48 od wejścia, a jeśli nie jest zero, dodaj 1 do 48, aby wydrukować ASCII na
1
zawsze, w przeciwnym razie wydrukuj0
.Uruchomiłem go tutaj , ale z powodu buforowanego wyjścia nie widać żadnego wyjścia, ponieważ program nigdy się nie kończy
1
.Edycja: zapomniałem wydrukować
0
na wejściu0
. Naprawiono teraz. Na końcu lubię te>.<
twarze.źródło
,.[>+>+<<-]-[>-<-----]>+++[>.<]
,.[->+>+<<]>>[->[>-<[-]]>+[<+>-]<<]>[<<.>>]
,.+++[->>+<-----<]>>---<-[>.<]
Piet,
271816 kodów(Codel to fantazyjna nazwa piksela używana w celu uniknięcia pomyłek podczas rozciągania obrazu do oglądania. Liczyłem kodery zamiast bajtów, ponieważ skrypty piet są zapisywane jako obrazy, więc rozmiar fizyczny może się różnić. Myślę, że idealny format pliku, który można zapisać ten plik tak efektywnie, jak to możliwe, zająłby 11 bajtów. W praktyce mój mały plik gif ma 62 bajty, z optymalnymi danymi palety. Powiedz mi, czy powinienem użyć tego jako rozmiaru mojego wpisu zamiast wielkości kodu.)
Oryginalny obraz:
Powiększony:
W trybie piet różnica między dwoma kolorami decyduje o tym, które polecenie zostanie uruchomione, więc dwukrotne zobaczenie tego samego koloru nie oznacza, że wykonuje tę samą akcję. Wykonanie rozpoczyna się w lewym górnym kodzie. Następnie przesuwa się w poziomie, wykonując następujące czynności:
Jeśli wartością wejściową było 1, kursor przesuwa się w dół do kodera limonki, który wypycha 1 na stos. Następnie egzekucja trwa nadal w lewo. Kiedy kursor przechodzi z koloru na biały i z białego na kolor, nic się nie dzieje. Ponieważ czarny jest również uważany za ściany, kursor wraca do kodera limonki w górnym wierszu i powtarza całą rzecz z kroku 2.
Jeśli jednak wartość wejściowa wynosiła 0, kursor nigdy nie spadnie w dół i skończy na niebieskim J po prawej stronie (zamierzona gra słów, było warto), jeśli pozostanie uwięziony (ponieważ góra, prawo, lewo i dolne boki tego bloku w kształcie litery J znajdują się obok czarnych kodów lub krawędzi obrazu). Ponieważ kursor jest w pułapce, wykonywanie się kończy.
Nieoczekiwane wartości:
jeśli użytkownik zapisze inną liczbę, nadal będzie drukowana, a następnie kursor będzie się obracał mniej więcej w zależności od wartości.
5111111111111...
Każda wartość nie będąca liczbą całkowitą spowoduje zakończenie programu. Wykonanie będzie kontynuowane normalnie, ale wszystkie operacje zostaną zignorowane, ponieważ na stosie nie ma nic. W pewien sposób program nigdy się nie zawiesza - albo zatrzymuje się normalnie, albo zapętla na zawsze.
Wersja przyjazna dla PietDev
PietDev (bardzo podstawowy internetowy Piet IDE) wydaje się mieć problem z białymi kodami, dlatego stworzyłem nową wersję, która ręcznie obraca się z powrotem w górę, zamiast polegać na prawidłowym automatycznym obracaniu białego kodu. I nawet nie musiałem używać nowego koloru! Jeśli chcesz go przetestować, narysuj czarną ramkę wokół kodu, ponieważ PietDev nie obsługuje niestandardowych rozmiarów programów.
starsza wersja
Pierwsza wersja nie wypchnęła 1 z powrotem na stos i zamiast tego zapętliła poprzednią instrukcję duplikacji. Miał także ozdobne, bezużyteczne kody.
Potem wpadłem na pomysł, aby nacisnąć 1 na stosie, aby usunąć pustą linię. To zabawne, jak o tym pomyślałem dzięki moim ozdobnym kodom.
Potem zdałem sobie sprawę, że mam obcy duplikat, który nie był już potrzebny, i zmniejszyłem liczbę kolorów, aby zaoszczędzić na danych palety na obrazie. Pozbyłem się również jednego ozdobnego kodu, ponieważ nie wiem.
źródło
Pyth
43)2)Jest nie! końcowe spacje (dzięki isaac :)). Kiedyś wymagana była przestrzeń do kompilacji pętli while, ale od tego czasu Pyth został zaktualizowany. Zwykle dyskwalifikuje to korzystanie z niego, ale ponieważ jest to katalog, powinien być ważny.
Wyjaśnienie:
źródło
pass
do Pytha. Przestrzeń jest teraz niepotrzebna. pyth.herokuapp.com/?code=WpQ&input=0&debug=0Chip , 6 bajtów
Chip to język 2D, który zachowuje się trochę jak układ scalony. Pobiera dane wejściowe, jeden bajt na raz, i dzieli bity na poszczególne elementy wejściowe. Dane wyjściowe łączą wartości elementów wyjściowych z powrotem w bajty.
Rozbijmy to:
*
jest sygnałem źródłowym, wyśle prawdziwą wartość do wszystkich sąsiednich elementów.e
if
odpowiadają piątemu i szóstemu bitowi wyjścia. Tak więce*f
tworzy binarny00110000
, który jest znakiem ASCII „0”.Teraz
A
jest pierwszym bitem wejściowym ia
pierwszym bitem wyjściowym, więcaA
kopiuje ten bit z wejściowego na wyjściowy. Tak więc, w połączeniu ze*f
, wejście ASCII „0” daje „0”, a „1” daje „1”. (Nie ma interakcji międzyf
ia
, ponieważ żaden nie wytwarza żadnego sygnału.)Na
s
końcu, gdy zostanie aktywowany przez prawdziwy sygnał, zapobiegnie przejściu sygnału wejściowego do następnego bajtu, co oznacza, że cała rzecz będzie działać ponownie z tym samym wejściem.Ponieważ pierwszy bajt „0” ma wartość zero, nie aktywuje tego elementu, a program wypisze „0”, a tym samym wyczerpie swoje wejście, co pozwoli mu zakończyć. Jednak „1” aktywuje ten element, co oznacza, że „1” jest wyprowadzane, ale nie jest zużywane na wejściu, umożliwiając powtarzanie cyklu w nieskończoność.
Jeśli wartości wyjściowe 0x0 i 0x1 są używane, a nie ASCII, możemy wyeliminować
e*f
część, co daje tylko 3 bajty :Jeśli zero musi się samo zakończyć, zamiast oczekiwać, że stdin się zamknie, otrzymamy następujący wynik, który odwraca pierwszy bajt
~
i przekazuje wynik dot
, który kończy program ( 10 bajtów ):(
t
również nie wytwarza sygnału, więc nie ma interakcji międzyt
ie
.)źródło
Brainbool , 5 bajtów
Brainbool jest Brainfuck, ale działa tylko na bitach i wykonuje operacje wejścia / wyjścia
0
i1
znaków.źródło
LOLCODE, 119 bajtów
Nie golfowany:
źródło
MAEK n A NUMBR
rzucić? 3. Czy możesz używaćDIFFRINT
zamiastBOTH SAEM
i zmieniać warunki warunkowe?O RLY?
rzuca się na boolean?O RLY?
jest jak postfiksif
.C, 37 bajtów
Inne podejście do tego, jak to zrobić w C.
c
domyślnie przyjmujeint
wartość 1.gets(&c)
pobiera ciąg znakówstdin
, tutaj spychając wartośćc
, w sposób hackerski, ponieważc
nie jest tochar*
.putchar(c)
wypisuje wartośćc
dostdout
i zwracac
. Ponieważ'0'
jest 48 i'1'
jest 49 w ASCII, możemy użyć ostatni kawałek (&1
), aby określić, który to jest. Jeśli tak'0'
, pętla pęka. W przeciwnym razie będzie trwać wiecznie.Kompiluje (z ostrzeżeniem o
gets
) i działa wgcc-4.8
systemie Linux.źródło
c
domyślnieint
ma wartość wielobajtową, a w architekturze big-endiangets
ustawi niepoprawny bajt.Labirynt , 7 bajtów
Labirynt to język oparty na stosie 2D, w którym przepływ sterowania zależy od znaku górnego elementu stosu, sprawdzanego po każdej instrukcji. Wykonanie zaczyna się przesuwać w prawo od pierwszej ważnej instrukcji w górnym rzędzie, którą jest tutaj
?
.Odpowiednie instrukcje to:
Jeśli wartość wejściowa wynosi 0, adres IP odczytuje wartość wejściową za pomocą
?
, dodaje dwie górne części stosu (0 + 0 = 0
), a następnie duplikuje:
i wyprowadza!
wartość 0. W tym miejscu spotykamy jedyne połączenie w programie i musimy sprawdzić górę stosu, aby ustalić Gdzie iść. Ponieważ górna jest 0, idziemy do przodu i kończymy na@
.Z drugiej strony, jeśli wartością wejściową jest 1, wykonujemy tę samą instrukcję jak poprzednio (ale wypisujemy 1) przed dotarciem do skrzyżowania na
!
. Teraz wierzch stosu jest dodatni, co powoduje, że skręcamy w prawo w?
. Na EOF Labirynt wypycha 0, więc robimy to0 + 1 = 1
na+
duplikacie:
i wyjściu!
. Ponownie mamy 1 na górze stosu i pętla trwa.Aby uzyskać bonus, oto 7-bajtowe rozwiązanie @ MartinBüttner, które działa podobnie:
Zauważ, że w przeciwieństwie do większości języków,
1
faktycznie wyskakujen
ze stosu i wypychan*10 + 1
, co ułatwia tworzenie dużych liczb. Ponieważ jednak górna część stosu jest pusta, nie różni się niczym od pchnięcia 1.źródło
> <> , 7 bajtów
Wykorzystuje to fakt, że> <> wypycha -1 na EOF, czyli 1 mod 2. Używa również dzielenia przez 0 do zakończenia (co najwyraźniej jest w porządku, ponieważ konsensus jest taki, że wyjście STDERR jest ignorowane).
Dla porównania, czyste wyjście bez błędów to dodatkowy bajt:
źródło
APL, 6 bajtów
Wyjaśnienie:
źródło
Brian & Chuck , 21 bajtów
Tutaj
<SOH>
należy zastąpić odpowiednim znakiem sterującym (0x01).Wyjaśnienie
Podstawową ideą jest odjęcie kodu znakowego wejścia (48 lub 49) od
p
końca Chucka, co da albo?
(co jest poprawną komendę) albo a,@
który nie działa.,
wczytuje znak wejściowy do pierwszej komórki Chucka (oznaczonej_
). Chcemy zmniejszyć tę wartość do0
pętli, jednocześnie wprowadzając inne zmiany:}<
przesuwa się dop
i-
zmniejsza. Następnie{
wraca do-
dekrementacji komórki wejściowej, która również. Dopóki nie jest to jeszcze zero,?
daje kontrolę Chuckowi. Teraz>
przesuwa taśmę Briana o jedną komórkę w prawo (która jest inicjowana1
) i+
zwiększa to. Następnie resetujemy pętlę za pomocą{?
.Do czasu trafienia pierwszej komórki Chucka
0
,<SOH>
komórka zostanie zwiększona do znaku, który odczytaliśmy ze STDIN ip
będzie?
do wprowadzania1
lub@
wprowadzania0
.Teraz
?
nie przełącza już kontroli. Opcja „0
lub1
po” oznacza brak operacji, podobnie jak bajt zerowy (reprezentowany przez_
).{
przesuwa się z powrotem do pierwszej komórki Chucka i+
wykonuje przyrosty, aby upewnić się, że jest dodatnia, tak że?
ręce kontrolują Chucka.Tym razem
>+
zwiększa komórkę po zakończeniu początkowej taśmy Briana. Ta komórka to śmieci, ale nigdy jej nie wykorzystamy. Teraz{
nie skanuje do końca taśmy Briana, ale tylko do_
. Dlatego?
nie ma możliwości, ponieważ obecna komórka ma zero. Następnie<.
przesuwa jeden w lewo (kopia znaku wejściowego) i drukuje go.Wreszcie napotykamy
?
lub@
. Jeśli dane wejściowe były,0
a ta komórka@
to brak operacji, a program zostanie zakończony. Ale jeśli dane wejściowe były1
i ta komórka jest?
przekazywana Brianowi, który{+?
zresetuje pętlę na Chucku, a teraz drukujemy na1
zawsze (dopóki liczba całkowita w komórce na końcu taśmy Briana nie pasuje do pamięci więcej, jak sądzę ...).Premia
Sp3000 i ja grałem w golfa od kilku dni. Zaczęliśmy od około 40 bajtów i doszliśmy do dwóch zupełnie różnych, ale powiązanych rozwiązań, po 26 bajtów. Dopiero kiedy zacząłem pisać moje wyjaśnienie, przyszło mi do głowy powyższe 21-bajtowe rozwiązanie. Ogromne podziękowania dla Sp za podzielenie się pomysłami i nauczenie się kilku sztuczek golfowych w B&C. :)
Oto jego 26-bajtowe rozwiązanie:
A to jest moje:
Gdzie
®
jest bajt o wartości 174 (np. Po prostu zapisz plik jako ISO 8859-1).W rdzeniu kopalnia działa podobnie do 21-bajtowego rozwiązania, w którym
®
staje się}
dla danych wejściowych1
i~
(bez0
operacji ) dla danych wejściowych , ale wykonanie jest znacznie mniej eleganckie.Jego rozwiązanie jest całkiem fajne, ponieważ kod źródłowy jest tylko ASCII i że nie wymaga pętli do przetworzenia danych wejściowych. Zamiast tego
----
zamienia się1
w-
i0
w,
(no-op dla Chucka). To-
zmieni pierwszą?
taśmę Briana w a>
, tworząc w ten sposób inny przepływ sterowania dla1
skrzynki.źródło
Bitowy cykliczny znacznik , 3 bity lub <1 bajt
Bitowy cykliczny tag jest jednym z najprostszych dostępnych języków Turinga. Działa z dwoma ciągami bitów, programem i danymi . Bity programu są odczytywane cyklicznie i interpretowane w następujący sposób:
0
: Usuń pierwszy bit danych (i wyślij go w implementacjach, które mają wyjście).1x
: Jeśli pierwszym bitem danych jest1
, dołączx
(reprezentujący albo0
lub1
) na końcu danych. (Jeśli pierwszy bit danych to0
, nic nie rób.)Program działa, dopóki ciąg danych nie będzie pusty.
Maszyna prawdy
Gdy ciąg danych jest ustawiony na
0
:11
nie dołącza niczego, ponieważ nie jest to pierwszy bit danych1
.0
usuwa / wyjścia0
.Gdy ciąg danych jest ustawiony na
1
:11
dołącza1
.0
usuwa / wyjścia1
.1
a program powrócił do miejsca, w którym się zaczął, więc zapętlamy na zawsze.źródło
GNU sed, 10
Wyjaśnienie
:
zdefiniuj nienazwaną etykietę/1/
Jeśli wejście pasuje do wyrażenia regularnego1
, top
wydrukuj przestrzeń wzoru (tj. 1)b
i wróć do nienazwanej etykiety (na zawsze)źródło
:;p;/1/b
i flagi n , w sumie 9 bajtów. Ponieważ ised -f
tak jest używany do uruchomienia pliku skryptu, dodanie tej dodatkowej flagi nie wymaga 2 bajtów.Poważnie ,
43 bajtyPrzekreślone 4 to wciąż 4 :(
,
odczytuje wartość ze STDIN.W
uruchamia pętlę, która działa, gdy wartość na szczycie stosu jest zgodna z ciałem■
.■
drukuje element górnego stosu bez wyskakiwania. Pętla jest domyślnie zamknięta w EOF.Na wejściu
0
pętla nigdy się nie uruchamia (ponieważ0
jest to falsey), a program kończy się na EOF, automatycznie wyskakując i wypisując każdą wartość na stosie. Na wejście1
(lub wartość, która nie ma0
,""
lub[]
), pętla działa w nieskończoność.W rzeczywistości , wiodące
,
nie jest potrzebne (dzięki niejawnemu wprowadzeniu), co zmniejsza wynik do 2 bajtów.źródło
Czw. 34 bajty
Wyjaśnienie:
1::=12
Instancje podłańcucha „1” mogą mieć postać „12”2::=~1
Wystąpienia podciągu „2” można usunąć, drukując „1”0::=~0
Instancje podłańcucha „0” można usunąć, drukując „0”@::=:::
Instancje podłańcucha „@” można zastąpić ciągami z danych wejściowych::=
Koniec listy reguł podstawiania@
Początkowy ciąg to „@”źródło
Arnold C, 134 bajty
Chociaż nie jest to tak zabawne jak inne odpowiedzi ArnoldC , jest w golfa. Na przykład wcięcie nie jest konieczne, podobnie jak makra
@NO PROBLEMO
i@I LIED
.Przetestowano z tą wersją języka , która nie może przyjmować danych wejściowych.
źródło
Cubix , 5
6bajtówCubix to nowy, dwuwymiarowy język @ETHproductions, w którym polecenia są owijane wokół ścian sześcianu. Tłumacz online Dzięki @ETHproductions dla oszczędności.
To kończy się rozszerzeniem do kostki
To zaczyna się od
I
polecenia. Wprowadź liczbę całkowitą na stos.\
, przekierowuje wskaźnik instrukcji w dół nad no op.O
, wyświetla wartość liczbową początku stosu.!
, pomiń następną komendę (@
), jeśli true na szczycie stosu. Spowoduje to przeskok\
przekierowania, jeśli 1\
, przekieruje wskaźnik instrukcji do@
programu obsługi wyjścia.Wykorzystuje to fakt, że stos nie jest otwierany przez
O ? !
polecenia.źródło
?
i po prostu używając!
:!I\@O
@IOw!
,@I?Ov
,@!IOw
,!IOW@
,!I\@O
Foo , 6 bajtów
Wejście jest zakodowane jako drugi znak, ponieważ Foo nie ma wejścia STDIN. Czy nie zgadzamy się, że Foo jest teraz niesamowite? :)
Wyjaśnienie
źródło
Perl,
18 + 1 = 1913 + 1 = 14 bajtówUruchom tak:
Dzięki ThisSuitIsBlackNot (który jest lepszy w golfie w Perlu ode mnie) za grę w golfa na pięć bajtów.
źródło
+0
:echo -n 0 | perl -pe'print while$_'
(13 bajtów + 1 dla-p
).perl -M5.010 -pe'say while$_'
byłby jeszcze krótszy, ale skutkuje to niespójnymi0
jest fałszywy, ale0
+ nowa linia jest prawdą. Zobaczyćperldoc perlsyn
.say
jest krótszy, nawet jeśli liczysz-E
jako dodatkowy bajt.-l
:perl -lpE 'say while$_'
(11 bajtów + 2 dla-lp
).> <> , 6 bajtów
Przesuwa dane wejściowe na stosie, aby rozpocząć
źródło
'0'
) i 49 ('1'
). Czy się mylę?-v
flagi.-v
, a potem zostałem poprawiony. Więc nie jesteś jedyny. :)