Odwróć standardowe wejście i umieść na standardowe wyjście


58

Wymagania:

  • Wejdź na stdin, w tym nowe wiersze / zwroty karetki o nieograniczonej długości (ograniczone tylko pamięcią systemową; to znaczy, że program nie ma żadnych ograniczeń).
  • Wyjście odwrotne wejścia na standardowe wyjście.

Przykład:

Wejście:

Quick brown fox
He jumped over the lazy dog

Wynik:

god yzal eht revo depmuj eH
xof nworb kciuQ

Najkrótsze wygrane.

Tabela liderów:

var QUESTION_ID=242,OVERRIDE_USER=61563;function answersUrl(e){return"https://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"https://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.1.1/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>


5
Czy zezwalasz na korzystanie ze standardowych funkcji bibliotecznych, takich jak PHPstrrev
Ming-Tang

Czy dane wyjściowe mogą umieszczać ostatni nowy wiersz danych wejściowych na początku zamiast na końcu?
Joey Adams

@Joey Adams, tak, powinien dokładnie powielić dane wejściowe.
Thomas O

53
Twój przykład jest nieco błędny. Odwrotną ƃop ʎzɐʃ ǝɥʇ ɹǝʌo pǝdɯnɾ ǝH xoɟ uʍoɹq ʞɔınΌstroną byłoby: ;-P
ninjalj

Czy muszę obsługiwać tylko znaki, które można wprowadzić do systemu wykonującego kod?
Golden Ratio

Odpowiedzi:


25

Golfscript - 3 znaki

-1%

zaciemniona wersja ma również 3 znaki

0(%

oto wyjaśnienie, jak działa %


9
Jak możemy kiedykolwiek konkurować z Golfscript?
Thomas O

12
@Thomas: Chyba przy użyciu FlogScript. W każdym razie, jeśli opublikujesz trywialne zadanie, spodziewaj się, że rozwiązania będą równie trywialne. A jeśli wymaga trzech wywołań metod w Pythonie, to równie dobrze mogą być trzy znaki w Golfscript.
Joey

1
@ Thomas: Przepraszam, to nie było takie oczywiste. Biorąc pod uwagę, że niektórzy członkowie dyskutowali już o tym samym języku, który najwyraźniej nie był humorem, nie było zbyt nierozsądnie zakładać tutaj podobne.
Joey

3
@Joey To była bardziej żałosna rozpacz, ponieważ GolfScript wydaje się hałasowi dla niewprawnego oka.
Thomas O

36
Drugi jest zaciemniony, ale pierwszy nie. Gotcha
C0deH4cker

44

Bash - 7

tac|rev

tacodwraca kolejność linii, a revodwraca kolejność znaków.


Przejdźmy teraz do następnego kroku i pseudonim do pojedynczej litery polecenia bash! alias z='tac|rev'
Daniel Standage

18
@Diniel To trochę tak samo, jak używanie flag kompilatora do definiowania makr, tj. W duchu golfa kodu.
marcog

Miałem rev|tactaki sam wynik - wystarczy dodać notatkę, aby powiedzieć, że działa to dla dowolnej powłoki POSIX, nie tylko Bash.
Toby Speight

35

BrainFuck, 10 znaków

,[>,]<[.<]

Pokonuje sporą liczbę odpowiedzi na tak prosty język.


2
DNA cały czas odwraca swoją kolejność, więc być może jest coś fundamentalnego w naturze informacji i obliczeń w tym, co zaobserwowałeś. Natknąłem się na to rozwiązanie podczas rozwiązywania problemów na rosalind.info za pomocą jednowarstwowych powłok.
ixtmixilix,

9
@ixtmixilix W rzeczywistości mówi po prostu coś fundamentalnego o stosach i odwracaniu rzeczy.
Cruncher,



16

Python, 41 40 bajtów

import sys;print sys.stdin.read()[::-1]

41 -> 40 - usunięto średnik na końcu programu.

Prawdopodobnie można go zoptymalizować!


Chciałbym mieć łatwy sposób na odwrócenie czegoś w PowerShell ;-)
Joey

6
Marsjanie, zawsze przydatni. [:: - 1]
Wok

1
Tak print raw_input()[::~0]]? To wciąż Python 2 z powoduprint
CalculatorFeline

Oto wskazówka dotycząca formatowania kodu golfowego. Zawsze pisz język, w którym napisałeś program, w tym formacie:# Language Name, Character/Byte Count
dorukayhan

15

Pancake Stack , 342 316 bajtów

Put this nice pancake on top!
[]
Put this  pancake on top!
How about a hotcake?
If the pancake is tasty, go over to "".
Put this delightful pancake on top!
[#]
Eat the pancake on top!
Eat the pancake on top!
Show me a pancake!
Eat the pancake on top!
If the pancake is tasty, go over to "#".
Eat all of the pancakes!

Zakłada, że ​​wejście jest zakończone znakiem zerowym ( ^@w wierszu poleceń). Przykład uruchomienia za pomocą interpretera :

Put this nice pancake on top!
[]
Put this  pancake on top!
How about a hotcake?
If the pancake is tasty, go over to "".
Put this delightful pancake on top!
[#]
Eat the pancake on top!
Eat the pancake on top!
Show me a pancake!
Eat the pancake on top!
If the pancake is tasty, go over to "#".
Eat all of the pancakes!
~~~~~~~~~~~~~~~~~~~~~~~~
Hello, World!^@
!dlroW ,olleH

12

APL, 2

⊖⍞

Lub CircleBar QuoteQuad, jeśli znaki nie przechodzą, co oznacza po prostu: odwrócone wprowadzanie znaków z klawiatury.


Zmniejsz liczbę bajtów o połowę! Nawet nie potrzebujesz . Jest to pełna funkcja anonimowa, które mogą być przypisane i wykorzystane: f←⌽ f 'The quick brown fox'.
Adám

^^^^ Zwycięzca ^^^^
CalculatorFeline

@ Nᴮᶻ: cóż, spec powiedział, że pobiera dane wejściowe ze stdin, a nie z dosłownego ciągu :)
jpjacobs

@jpjacobs Powszechną praktyką PPGC jest dopuszczanie wbudowanego argumentu zamiast stdin dla języków, które nie obsługują (lub dla których użycie go jest nienaturalne).
Adám

11

Perl - 23

print scalar reverse <>

6
Możesz usunąć trzecie miejsce.
Timwi

6
W rzeczywistości print"".reverse<>jest tylko 17 znaków. A dzięki Perlowi 5.10+ możesz zapisać dwa dodatkowe znaki, używając sayzamiast print.
Ilmari Karonen

4
Wiem, że to jest bardzo stare, ale możesz też zrobić: print~~reverse<>dla 16 znaków
Dom Hastings,

5
@DomHastings A z Perlem 5.10+ say~~reverse<>działałoby? 14 znaków.
Timtech


10

C - 47 znaków

main(c){if(c=getchar(),c>=0)main(),putchar(c);}

Zauważ, że wykorzystuje to przestrzeń stosu O (n). Wypróbuj online!


Poprostu super!
st0le

1
Tylko twój pomysł, ale pozwala to zaoszczędzić 2-3 naciśnięcia klawiszy:main(c){(c=getchar())>0&&main(),putchar(c);}
Quixotic

2
Czy C ocenia liczby jako logiczne? Jeśli tak, to c>=0może zostać~c
Cyoce

9

Windows PowerShell, 53 54

-join($x=[char[]]($($input)-join'
'))[($x.count)..0]

30.01.2011 (54) - Pierwsza próba

30.01.2011 (53) - Podziały wierszy są fajne.

2011-01-3- (52) - Również wbudowane przypisania zmiennych.


-join($a="$args")[$a.Length..0]sam w sobie wydaje się działać dla podanego przykładu, nie mam żadnych problemów z podziałami linii działającymi z systemem Windows crlf- nie jestem pewien co do psv2 lub czegokolwiek, czego użyłeś podczas pisania.
colsw

@ConnorLSW: To nawet nie czyta ze standardowego wejścia. I $inputjest narzędziem wyliczającym uzyskującym wiersze, więc nie można tak go przekreślić.
Joey,


8

Befunge-93 - 11x2 (22 znaków)

>~:0`v >:v
^    _$^,_@

Testowane przy użyciu tego interpretera .


19
Czy na pewno nie nacisnąłeś tylko przypadkowych klawiszy na klawiaturze?
Thomas O

@Thomas - Czy na pewno nie próbowałeś użyć połączonego tłumacza? Jest oparty na sieci Web, na wypadek gdybyś martwił się pobraniem czegokolwiek.
MiffTheFox

4
Ja tylko żartuję. Jestem pewien, że to zadziała, ale wygląda to tak, jakbyś nacisnął kilka klawiszy losowo. To oznacza bardzo zwarty język.
Thomas O



6

Rozszczepienie , 16 14 12 bajtów

DY$\
?
[Z~K!

Wyjaśnienie

Przepływ kontrolny zaczyna się Dod opadającego (1,0)atomu. ?Czyta ze standardowego wejścia, jeden znak naraz, wyznaczając masę do kodu znaków czytać i energii do 0. Gdy uderzymy w EOF, ?zamiast tego ustawimy energię na 1. [Przekierowuje się na atom o Zprzełącznika. Tak długo, jak czytamy postacie, energia będzie 0, więc atom jest odchylany w górę przez Z. Klonujemy atom, zapętlając jedną kopię z powrotem do, ?aby kontynuować czytanie danych wejściowych. Zwiększamy energię druga kopia do 1z $i odkłada ją na stosie K. Zatem pętla wejściowa jest następująca:

DY$\
?
[Z K

Gdy energia 1wynika z EOF, Zzamiast tego przepuści atom prosto i 0ponownie obniży energię . ~dodatkowo zmniejsza energię -1. Atomy o ujemnej energii wyskakują ze stosu, abyśmy mogli pobrać postacie w odwrotnej kolejności i wydrukować je !. Zauważ teraz, że siatka jest toroidalna, więc atom pojawia się ponownie na lewej krawędzi tego samego rzędu. Pamiętaj, że wcześniej zwiększyliśmy energię wypychanych atomów $, więc atomy mają teraz energię 1tak jak ostatnia moc wyjściowa ?i ponownie przejdą przez Z. Ścieżka po EOF jest zatem

?
[Z~K!

Ta pętla w dolnym rzędzie trwa, dopóki stos nie będzie pusty. Kiedy tak się dzieje, atom jest odbijany z powrotem Ki jego energia staje się dodatnia ( +1). Zmniejsza ~to jeszcze raz (przesunięcie w lewo), dzięki czemu teraz uderzamy Zenergią nie dodatnią. To odchyla atom w dół, tak że kończy się na klinie miejsca, w Yktórym jest przechowywany, a ponieważ nie ma już ruchomych atomów, program kończy się.


lol dlaczego to przypomina mi Minecraft?
don bright

Wow, i pomyślałem, że moja implementacja w próbkach językowych była najkrótsza przy 16 znakach. Imponujący!
C0deH4cker

6

> <>, 16 14 bajtów

-2 bajty autorstwa @JoKing

dwa lata (!) później usuwa dodatkowe -1 z odczytu danych wejściowych, zmieniając logikę zatrzymywania.

i:0(7$.
0=?;ol

Wypróbuj online!

Podobnie jak w przypadku innej odpowiedzi> <>, nie musi to odwracać stosu ze względu na sposób odczytu danych wejściowych w pierwszym wierszu. W rzeczywistości nie jestem zbyt pewien, czy to powinna być sugestia dla drugiej> <> odpowiedzi, ponieważ ma ona zupełnie inny wygląd, ale podobną koncepcję.

Główną różnicą jest to, że moja odpowiedź porównuje dane wejściowe do 0, a jeśli jest mniej (tj. Nie ma danych wejściowych - izwraca -1, jeśli nie ma danych wejściowych), przeskakuje do (1,7), jeśli nie, (0, 7). Jeśli przeskakuje do poprzedniej, wyskakuje najwyższa wartość (-1) i rozpoczyna pętlę drukowania. Jeśli przeskoczy do tego drugiego, kontynuuje pętlę wejściową.

11 bajtów, wychodzi z błędem

Dzięki uprzejmości @JoKing

i:0(7$.
~o!

Wypróbuj online!

Uważam, że jest to teraz ważne w drodze meta konsensusu.

Poprzednia odpowiedź (14 bajtów)

i:0(7$.
~ol0=?;!

2
-5 bajtów , kończąc na błędzie. W przeciwnym razie -2 bajty (błędy przy pustym wejściu). Również oryginalne błędy przy pustych danych wejściowych, które można naprawić, przesuwając opo;
Jo King

1
@JoKing Dobry połów ze ostrony; wtedy tego nie zauważyłem. I dzięki za uratowanie. Sprytne użycie porównania do zera, aby pozbyć się ostatniego -1.
cole

1
Hmm, właściwie to działa równie dobrze dla 13 bajtów (nie mogę uwierzyć, że przegapiłem łatwą zamianę 0=?na ?!)
Jo King

@JoKing -1 Byte The? znak sprawdza górę stosu, jeśli 0, więc porównanie z długością nie jest potrzebne, tylko l.
Teal pelikan

@TealPelican Tak, wspomniałem o tym w moim drugim komentarzu
Jo King


5

Stack Cats , 7 bajtów

<!]T[!>

Wypróbuj online!

Istnieje wiele alternatyw dla tej samej liczby bajtów, z których większość jest zasadniczo równoważna w ich działaniu:

Wyjaśnienie

Krótki podkład Stack Cats:

  • Każdy program musi mieć symetrię lustrzaną, a przez odbicie lustrzane dowolnego fragmentu kodu otrzymujemy nowy kod, który oblicza funkcję odwrotną. Dlatego ostatnie trzy znaki powyższego programu cofają pierwsze trzy, jeśli nie byłoby to polecenia w środku.
  • Model pamięci jest nieskończoną taśmą stosów, która zawiera ukrytą, nieskończoną liczbę zer na dole. Początkowy stos ma -1na wierzchu tych zer, a następnie bajty wejściowe na górze tego (z pierwszym bajtem na samym szczycie i ostatnim bajtem nad -1).
  • Aby uzyskać wynik, po prostu bierzemy ostatni stos, odrzucamy a -1na dole, jeśli taki istnieje, a następnie drukujemy wszystkie wartości jako bajty do STDOUT.

Teraz właściwy program:

<    Move the tape head one stack left (onto an empty stack).
!    Bitwise NOT of the implicit zero on top, giving -1.
]    Move back to the original stack, taking the -1 with the tape head.
     We're now back to the original situation, except that we have a -1
     on top.
T    Reverse the stack down to the -1 at the bottom. One of the reasons
     we needed to move a -1 on top is that T only works when the top of
     the stack is nonzero. Since the first byte of the input could have
     been a null-byte we need the -1 to make sure this does anything at
     all.
[    Push the -1 to the stack on the left.
!    Bitwise NOT, turning it back into 0 (this is irrelevant).
>    Move the tape head back onto the original stack.

Sp3000 ustawił wyszukiwanie brutalnej siły, aby znaleźć wszystkie inne rozwiązania 7-bajtowe, więc oto kilka alternatyw:

<]!T![>
>![T]!<
>[!T!]<

Te trzy warianty są zasadniczo takie same, z tym wyjątkiem, że różnią się, kiedy bitowe NIE jest obliczane i czy używamy pustego stosu po lewej, czy po prawej.

<]T!T[>
>[T!T]<

Jak powiedziałem w powyższym wyjaśnieniu, Tnic nie robi, gdy górna część stosu ma wartość zero. Oznacza to, że !zamiast tego możemy umieścić środek. Oznacza to, że pierwszy Tto brak operacji , następnie zamieniamy zero na górze na -1a, a następnie drugi Twykonuje odwrócenie. Oczywiście oznacza to, że końcowy stan pamięci znajduje się -1na stosie obok oryginalnego, ale to nie ma znaczenia, ponieważ tylko stos w bieżącym położeniu głowicy taśmy wpływa na wynik.

<*ITI*>

Ten wariant używa *(XOR 1) zamiast !, więc zamienia zero na +1, i Ijest warunkowym pchnięciem, które popycha wartości dodatnie i prawe, wartości ujemne w lewo i neguje je w obu przypadkach (tak, że nadal otrzymujemy -1na szczycie oryginalnego stosu, gdy napotkamy T), więc ostatecznie działa tak samo jak oryginalne <!]T[!>rozwiązanie.


4

PHP, 82 29 24 29 28 znaków

<?=strrev(fread(STDIN,2e9));

82 -> 29: Nowy znak linii zostaje zachowany po odwróceniu za pomocą strrev.
29 -> 24: Teraz używa składni skrótu
24 -> 29: Teraz czyta wszystkie linie zamiast jednej linii


Jeden problem: fgets(STDIN)czyta tylko pierwszą linię.
PleaseStand

Zaktualizowałem kod, aby teraz czytał wszystkie wiersze.
Kevin Brown

Tyle że masz sztuczny limit 1000 znaków
anonimowy tchórz

Zaktualizowałem limit, aby pasował do poniższego Pythona, ale nie wyobrażam sobie, żeby ktoś tak często używał.
Kevin Brown

4

Befunge-98 - 11 10

#v~
:<,_@#

(Testowane z cfunge)

Poniższy wariant nieznacznie łamie wymaganie: wykonuje zadanie, ale później generuje nieskończony strumień zerowych bajtów (i nie kończy się).

~#,

Działa tak, że wielokrotnie odczytuje dane wejściowe do stosu ( ~) po jednym znaku, przeskakując ( #) przecinek. Po osiągnięciu EOF ~działa jak odbłyśnik, a komputer się przewraca, wielokrotnie wyskakując i wysyłając znak ( ,) podczas przeskakiwania ( #) tyldą.


Tutaj jest krótsza wersja (10 znaków): Linia 1: #v~Linia 2: :<,_@#. Zabawne, że używanie jgo tutaj nie poprawia.
Justin

@Quincunx, który jest sprytny, wykorzystując kierunek IP jako rodzaj ukrytej negacji.
FireFly,

4

Pyth - 3 5 4 bajty

Oryginalna wersja 3-znakowa nie odwróciła kolejności wierszy, tylko linie. Potem wymyśliłem tę 5-znakową wersję:

_jb.z

Zapisałem 1 bajt dzięki @FryAmTheEggman, aby go uzyskać:

_j.z

Demo na żywo.

Wyjaśnienie:

  .w  read all the input into a list of strings
 j    join (j) by using a newline character
_     reverse the result
      Pyth implicitly prints the result on an expression

Oryginalne (nieprawidłowe) rozwiązanie:

To technicznie się nie liczy, ponieważ Pyth został stworzony w 2014 roku, ale nadal fajnie jest, że jest związany z GolfScript.

#_w

Wyjaśnienie:

#    loop while no errors
  w  read a line of input (throws an error on end-of-file or Control-C)
 _   reverse the input line
     Pyth implicitly prints the result on an expression

2
Niestety nie odpowiada specyfikacji - kolejność linii również musi zostać odwrócona.
DLosc

Fk_.z_kJestem pewien, że ktoś może dostać coś krótszego niż to, ale to właśnie mam.
gcq

@gcq Mam krótszą wersję (5 znaków), ale nie miałem okazji jej edytować.
kirbyfan64sos

@DLosc Naprawiono! Właśnie przeczytałem wszystkie dane wejściowe, dołączyłem przez nowe linie i odwróciłem to.
kirbyfan64sos

@FryAmTheEggman Ach, tak! Nie wiedziałem o tym, kiedy opublikowałem to kilka miesięcy temu.
kirbyfan64sos

4

Cubix , 9 8 bajtów

Ogromne podziękowania dla Martina Endera za ten golf:

w;o@i.?\

Zobacz, jak działa online!

Staje się następującą kostką ( >wskazuje początkowy wskaźnik instrukcji):

      w ;
      o @
> i . ? \ . . . .
  . . . . . . . .
      . .
      . .

Pierwszym krokiem programu jest pobranie wszystkich danych wejściowych. iumieszcza 1 bajt danych wejściowych na stosie. O ile dane wejściowe nie są zakończone, ?IP skręca w prawo, owijając się wokół kostki, aż dojedzie w, i odsyła ją z powrotem i.

Po zakończeniu wprowadzania, ?IP kieruje się na północ, wchodząc w pętlę wyjściową:

  • o: wydrukuj znak na górze stosu
  • w: „boczny” wskaźnik po prawej stronie
  • ;: pop znak, który właśnie został wydrukowany
  • \: odzwierciedlają adres IP, wysyłając go na wschód
  • ?: jeśli pozostały znaki do wydrukowania, skręć w prawo, z powrotem w pętlę.

Ostateczny czas ?został osiągnięty, gdy nic nie pozostało na stosie, IP kontynuuje zamiast tego:

  • i: weź bajt danych wejściowych. Będzie to po -1zakończeniu wprowadzania danych.
  • \: odzwierciedlają adres IP, wysyłając go na północ, na:
  • @: zakończenie programu.

Rozwiązanie 9-bajtowe

..o;i?@!/

Zobacz, jak działa online!

W formie kostki:

      . .
      o;
> ja? @! /. . .
  . . . . . . . .
      . .
      . .

Pierwszym wprowadzonym znakiem jest ikod wejściowy. Jeśli nie ma już żadnych danych wejściowych, jest to -1.

Następna postać to ?- decyzja. Jeśli górna część stosu jest dodatnia, obraca się w prawo, owijając kostkę, aż uderzy, /co przesyła ją z powrotem do i, tworząc pętlę wejściową. Jeśli jednak TOS jest ujemny, wejście zostało zakończone, a zatem zamienia się w pętlę wyjściową.

Pętla wyjściowa jest prosta. o;wypisuje i wyskakuje TOS. Przy pierwszym uruchomieniu -1jest na górze stosu, ale nie odwzorowuje postaci i dlatego jest ignorowany. /odzwierciedla adres IP, który ma zostać przesunięty w lewo, tam gdzie się napotyka !@- co kończy program, jeśli stos jest pusty. W przeciwnym razie adres IP będzie kontynuowany, uderzając ?ponownie - ponieważ stos nie jest pusty, TOS musi być kodem znaków, z których wszystkie mają wartość dodatnią 1 , więc IP skręca w prawo i kontynuuje pętlę wyjściową.


1 Oba rozwiązania zakładają, że dane wejściowe nie będą zawierać pustych bajtów.


4

05AB1E, 1 bajt

R

R odwraca wejście.


1
Dziękujemy za skorzystanie z 05AB1E :). Na ,końcu nie potrzebujesz , ponieważ góra stosu jest drukowana automatycznie, gdy nic nie jest drukowane.
Adnan

@Adnan Dzięki za wskazówkę.
penalosa

4

Wumpus , 12 bajtów

i=)!4*0.l&o@

Wypróbuj online!


Odpowiedź Martina dobrze pokazuje przepływ trójkątnej siatki Wumpusa, ale pomyślałem, że spróbuję tego wyzwania z linią jednopowłokową.

Łatwiejsza do zrozumienia wersja (jeden bajt dłużej) to:

i=)!8*0.;l&o@

który działa tak:

[Input loop]
i        Read a byte of input (gives -1 on EOF)
=)!      Duplicate, increment then logical not (i.e. push 1 if EOF, else 0)
8*       Multiply by 8 (= x)
0        Push 0 (= y)
.        Jump to (x, y), i.e. (8, 0) if EOF else (0, 0) to continue input loop 

[Output]
;        Pop the extraneous -1 at the top from EOF
l&o      Output <length of stack> times
@        Terminate the program

Teraz spójrzmy na wersję golfową, która różni się w środku:

i=)!4*0.l&o@

Wersja w golfa oszczędza bajt, nie wymagając wyraźnego polecenia, ;aby pop obcy -1. W EOF ten program przeskakuje do miejsca, (4, 0)w (8, 0)którym wykonuje się 4*0.ponownie - z tym wyjątkiem, że obce -1 jest na wierzchu! To powoduje, że przeskakujemy do tego (-4, 0), co z powodu zawijania jest takie samo jak (8, 0)dla tej siatki, doprowadzając nas tam, gdzie chcemy, jednocześnie zużywając obcą wartość.


4

Wumpus , 13 11 bajtów

)?\;l&o@
=i

Wypróbuj online!

Wyjaśnienie

Ponieważ Wumpus jest językiem stosowym, podstawową ideą jest odczytanie całego STDIN do stosu, a następnie wydrukowanie całego stosu od góry do dołu. Interesującą częścią jest tutaj przepływ kontrolny przez siatkę.

Aby zrozumieć przepływ sterowania, musimy spojrzeć na rzeczywisty układ siatki trójkątnej:

wprowadź opis zdjęcia tutaj

Adres IP zaczyna się w lewym górnym rogu i idzie na wschód. Widzimy, że istnieje pętla przez grupę sześciu komórek po lewej stronie i gałąź poza \. Jak można się spodziewać, pętla odczytuje wszystkie dane wejściowe, a sekcja liniowa na końcu zapisuje wynik z powrotem do STDOUT.

Najpierw spójrzmy na pętlę. Bardziej sensowne jest myślenie, że pierwszy )?\nie jest częścią pętli, a rzeczywista pętla zaczyna się od i. Oto wstępny fragment:

)   Increment an implicit zero to get a 1.
?\  Pop the 1 (which is truthy) and execute the \, which reflects the IP
    to move southwest.

Następnie rozpoczyna się pętla:

i   Read one byte from STDIN and push it to the stack (or -1 at EOF).
    Note that Wumpus's grid doesn't wrap around, instead the IP reflects
    off the bottom edge.
=   Duplicate the byte we've read, so that we can use it for the condition
    later without losing it.
)   Increment. EOF becomes zero (falsy) and everything else positive (truthy).
?\  If the incremented value is non-zero, execute the \ again, which 
    continues the loop. Otherwise (at EOF), the \ is skipped and the
    IP keeps moving east.

To pozostawia odcinek liniowy na końcu:

;   Get rid of the -1 we read at EOF.
l   Push the stack depth, i.e. the number of bytes we've read.
&o  Print that many bytes.



3

Rozszczepienie , 20 15 bajtów

KX$ \
!
SR?J%
~

Algorytm jest bardzo podobny do Martina, ale implementacja różni się znacznie.

Jak to działa

Wszystko zaczyna się od R, który uwalnia atom na wschód o masie 1 i energii 0.

Po uderzeniu ?znak wejściowy zostaje zapisany jako masa atomu, a energia zostaje pozostawiona na 0, chyba że stdin zwróci EOF, w którym to przypadku energia staje się 1.

Jjest poleceniem skoku Fission i przeskakuje atom do przodu o liczbę komórek równoważną jego bieżącej energii, pozostawiając atom z zerową energią. Na razie nasz atom ma 0 energii i ignoruje to polecenie.

Następnie uderzamy %, co jest zmianą. Z większą niż 0 energii, nasz atom byłby skierowany w dół (jakby odbite przez \zwierciadło), ale ponieważ mamy dokładnie 0 energię, jesteśmy posłani w górę o przeciwnej lustro /.

Nasz atom trwa, dopóki nie uderzy w drugie lustro, \tym razem kierując go w lewo.

Zwiększamy energię atomu do 1 za pomocą $i używamy Xdo powielenia atomu. Jedna kopia będzie odzwierciedlać powrotem na $polecenia (pozostawiając tę kopię z 2 energii), a drugi egzemplarz zostanie odłożony na stosie, K.

Nasza odbita kopia przesuwa się wstecz, skąd przyszła, aż ponownie dotknie %przełącznika. Teraz, gdy mamy pozytywną energię, odbijamy się tak, jakbyśmy uderzyli w \lustro, owijając się wokół planszy na następną Si zmniejszając naszą energię do 1.

SKomenda pochłonie 1 energii, aby zachować nasz kierunek. Gdybyśmy nie mieli energii, atom odbiłby się tak, jakby uderzył go \lustro w dół. Zamiast tego ponownie przechodzimy w prawo i zbieramy więcej danych za pomocą, ?a cykl się powtarza.

Gdy nasz atom osiągnie EOF, ?polecenie zgromadzi 1 energię w atomie. Tak więc, kiedy Jtym razem uderzymy w komendę, całkowicie przeskakujemy %przełącznik i lądujemy na Sprzełączniku z zerową energią.

Ponieważ nasza energia została zużyta podczas skoku, nasz przełącznik nie zachowuje naszego kierunku S, ale jesteśmy raczej skierowani w dół. Następnie zmniejszamy naszą energię do -1 za pomocą ~polecenia i owijamy planszę. Po trafieniu ujemną energią Kpolecenie rozrywa atom zamiast go popychać. Wysyłamy nasz nowo wysadzony atom !i używamy energii 1 tego atomu do ominięcia Sprzełącznika, a cykl się kończy.

Jeśli stos Kbył pusty, energia naszego atomu jest zanegowana (co daje +1 energii) i jest odbijana z powrotem na ~polecenie, pozostawiając ją z energią 0. Po Sponownym trafieniu jesteśmy odchylani w prawo, aż do trafienia ?. Po osiągnięciu EOF ?niszczy atom i kończy program.


3

Labirynt , 10 bajtów

,)";@
:".(

Zwykle programy Labiryntu mają przypominać labirynty, ale udało mi się tak mocno skompresować pętle, że kod skończył się jako pojedynczy blok (pomieszczenie?). Oto nieco rozszerzona wersja, która ułatwia śledzenie przepływu sterowania:

,""")""""""";""@
"   "   "   "
:""""   ."""(

,odczytuje jeden bajt na raz ze STDIN, aż trafi do EOF i powróci -1. Te )przyrosty to wartość tak, że mamy coś pozytywnego dla każdego bajta czytać i zera na EOF. W :duplikaty każdy odczytać bajt.

Po trafieniu w EOF wskaźnik instrukcji przechodzi do drugiej pętli, gdzie wielokrotnie odrzuca jedną wartość za pomocą ;(początkowo EOF, później druga kopia każdego bajtu), a następnie zmniejsza następną wartość za pomocą (i drukuje ją za pomocą .. Dzięki tej drugiej kopii (która zawsze jest pozytywna) wiemy, że adres IP skręci w prawo na górze i będzie kontynuował tę pętlę.

Po wydrukowaniu wszystkich bajtów górna część stosu jest ponownie zerowa, a adres IP jest kontynuowany prosto do @i program się kończy.

Pozornie niepotrzebne duplikowanie każdego bajtu pozwala mi upewnić się, że (nawet w ciasnych pętlach wersji golfowej) IP zawsze przyjmuje właściwy obrót i nigdy nie przechodzi z jednej pętli do drugiej.

Porada dla TheNumberOne i Sp3000, których własne próby bardzo pomogły w znalezieniu tego wysoce skompresowanego rozwiązania.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.