tak, ma 91 linii


50

yes, z coreutils, ma 91 linii . Wiele z nich to komentarze, ale to wciąż jest ZA DUŻO .

Edycja od września 2019 r .: plik źródłowy urósł w ciągu ostatnich pięciu lat i ma teraz długość 126 linii.

Napisz program imitujący yes:

  • wysyłanie do stdoutnieskończonego strumienia „y \ n”
  • musi istnieć opcja zatrzymania tego poza zabiciem procesu za pomocą SIGKILL: ale SIGINTi SIGPIPEsą w porządku
  • nie wolno używać „y” lub „\ n” lub ich wartości ASCII (121, 0x79, 0171, 10, 0xA lub 012)

Najkrótsza odpowiedź wygrywa.

Premia:

  • odejmij 10 od długości kodu, jeśli możesz otrzymać frazę stdini wydrukować ją zamiast „y” (ale nadal włączając podział wiersza).

13
Nie wolno używać«Y»lub«\ n» ” - powinna czytałem to jako „Użytkownik nie może używać ylub \nwewnątrz łańcucha dosłowny”?
apsillers,

12
Na powiązaną notatkę, GNU true.cma 80 linii.
Dennis Williamson,

6
@DennisWilliamson Na podobnie pokrewnej uwadze, false.c ma 2 linie długości ....; _;
LordAro,

6
coreutils yesprzyjmuje opcjonalny argument w wierszu poleceń, a nie stdin.
Brian Minton

7
@MrLore: aby potokować do innych programów, które mogą nieustannie prosić o potwierdzenie różnych rzeczy, które robią, więc nie musisz siedzieć i pisać ysamemu.
marcus erronius

Odpowiedzi:


37

CJam, 13 bajtów - 10 = 3

l_'x)?{_oNo}h

W tym celu musisz użyć interpretera Java , ponieważ interpreter online powraca dopiero po zakończeniu programu.

Możesz przerwać program za pomocą SIGINT (naciskając Ctrl-C). Odczyta wiersz ze STDIN i wydrukuje ten wiersz lub yjeśli dane wejściowe były puste.

Wyjaśnienie

l             "Read line from STDIN.";
 _            "Duplicate.";
  'x          "Push character x.";
    )         "Increment to get y.";
     ?        "Ternary operator. Replaces line with y if it was empty.";
      {    }h "Repeat while true. Leaves condition on the stack, which is the output string.";
       _o     "Duplicate line and print.";
         No   "Push string with newline and print.";

Po wyjaśnieniu PO wydaje się, że bardziej szczegółowo:

l{_o9c)o1}g

Poczekam jednak z aktualizacją zgłoszenia, aż OP odpowie na mój komentarz.


16
Podoba mi się, że twój program się zgadza /no/i, biorąc pod uwagę, jakie wyzwanie.
Kevin - Przywróć Monikę

20

Brainfuck - 38 bajtów

++++++++++[>++++++++++++>+<<-]>+[.>.<]

Nie używa 10 ani 121, ponieważ i tak +-<>.,[]są to wszystkie znaczące znaki w języku, ale oblicza je dość naiwnie (0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 = 10, 10 * 12 + 1 = 121).

To prawdopodobnie zależy od tłumacza, ale umiera ^Cna moim komputerze.

Brainfuck - (63-10) = 53

++++++++++[>,]<<[[<]>>[[.>]<[<]>]]>[>++++++++++++>+<<-]>+[.>.<]

@ Fry Nie mogłem dostać w ten sposób poniżej 39. W każdym razie potrzebuję 10, więc albo dodaję 1 do 120, albo odejmuję 1 od 11, a ten pierwszy jest krótszy.
undergroundmonorail

Tak, zauważyłem po tym, że ponownie
użyłeś

Zamiast 10 * 12 + 1, dlaczego nie 11 * 11? Myślę, że to może uratować cię.
ProgramFOX,

@pro Nie mogłem uzyskać w ten sposób poniżej 39. W każdym razie potrzebuję 10, więc albo dodaję 1 do 120, albo odejmuję 1 od 11, a ten pierwszy jest krótszy.
undergroundmonorail

@undergroundmonorail Ah, rozumiem.
ProgramFOX,

18

Python 3, 27 bajtów

Działa z co najmniej CPython i Jython.

while 1:print(str(help)[1])

SIGINT zatrzymuje to.


18
Zrób to python2 i możesz go skrócić while 1:print`help`[1].
undergroundmonorail

4
Haha, miło. Zupełnie zapomniałem, że w pythonie „kiedyś” był operatorem
zwrotnym

Można użyć chr(11**2), aby zaoszczędzić kilka znaków, a także
user1354557

2
@RamchandraApte Nie możesz używać 121.
Jonathon Reinhart

17

Cudowne 14 bajtów

0978
]]/\++
!!

Jest to dość proste, urządzenie „/ \” umieszcza dwie kopie po lewej i prawej stronie, prawa jest zwiększana o jedną, ++a następnie spada z planszy i jest drukowana. ]]Urządzenie popycha każdą kulkę w prawo jeśli STDIN jest pusty, ale pozwala pierwszy bajt na STDIN upaść, jeśli tak nie jest. Spowoduje to uruchomienie !!urządzenia, które wychodzi z płyty. To będzie drukować y \ n, dopóki nie wpiszesz niczego na standardowym wejściu.

Działa to tylko w interpreterie Pythona.


17

Pyth, 10 9 6 - 10 bajtów = 0 -1 -4

#|zePG

Od wieków staram się uzyskać taki, z którego jestem usatysfakcjonowany. Zasadniczo konwertuje na:

#      = while True
(implied print)
|      = or
z      = (automatically initialized from stdin)
ePG    = second-to-last lowercase letter = 'y'

Zmienna „z” jest inicjowana ze standardowego wejścia, następnie wartość jest po prostu używana. Znalazłem krótki sposób na uzyskanie wartości ascii bez wyraźnego pisania.
swstephe

Przełączono z „^ 11 2” na „^ hT2”, aby zapisać znak.
swstephe

Cześć swstephe, cieszę się, że widzę innego użytkownika języka! Kilka golfów: #ma równoważną funkcjonalność W1i ePGjest znacznie krótszym sposobem na uzyskanie postaci yniż C^hT2.
isaacg,

Dzięki, zastosuję te zmiany. Nadal nowy w tej dziedzinie golfa. Lubię Pytha, ale życzenie ma jeszcze kilka funkcji kontekstowych i manipulację bitami.
swstephe

13

C #, 81 78 76 bajtów

Nie można konkurować z innymi językami, ale i tak jest:

class A{static void Main(){for(;;)System.Console.WriteLine((char)('x'+1));}}

Można go zabić za pomocą SIGINT, naciskając Ctrl+ C.

Brak premii, ponieważ uzyskanie go zajęłoby więcej niż 10 bajtów.


Nie można używać while(1)? Zapisuje dwie postacie.
Szczoteczka do zębów

@ Toothbrush Próbowałem tego, ale to nie działa w C #.
ProgramFOX,

1
for(;;) powinien działać.
core1024,

2
Z jakiegoś powodu ten kod wciąż ma yw sobie kod . Proszę zbadać System.
TheNumberOne

4
@TheBestOne Tego Systemnie można usunąć. jest to najwyższa przestrzeń nazw w .NET Framework, wszystkie klasy / inne przestrzenie nazw znajdują się w niej, więc refleksja nie pomoże tutaj. Ale nie jestem pewien, czy jest nieprawidłowy. Zobacz komentarz Ramona: „nic, co daje wartość y lub \ n”. Nie dotyczy to y. Zostawiam komentarz do pytania, aby zapytać Ramona, czy jest to poprawne.
ProgramFOX,

10

Java, 178

class C{public static void main(String[]a)throws Exception{for(char c='x'+1;;)((java.io.PrintStream)Class.forName("java.lang.S"+c+"stem").getField("out").get(null)).println(c);}}

Drukowanie wymaga System, ale yznak jest zabroniony. Dlatego musiałem użyć refleksji.



Możesz zapisać a ;, wstawiając char c='x'+1;do fordeklaracji pętli, więc for(char c='x'+1;;)skoro i tak masz tam pusty średnik
corsiKa

@corsiKa Dobra uwaga.
Ypnypn,

10

Perl: 18 bajtów - 10 = 8

Ciąg jest z STDIN.

$_=<>;{print;redo}

3
Czy drukuje y\nwielokrotnie, jeśli nie odbiera danych wejściowych ze STDIN? Jeśli nie, to nie naśladuje właściwie yes.
vurp0

@ vurp0 mimo yeswszystko nie pobiera danych wejściowych STDIN:)
core1024,

1
Nie robi tego, ale tutaj pytanie o kod golfa określa, że ​​jeśli nie otrzyma danych wejściowych, powinien wielokrotnie drukować y\n.
vurp0

2
@ vurp0 Gdzie? Każdy program, który czyta ze strumienia, zawiesi się bez wprowadzania danych.
core1024,

@ vurp0 Zobacz komentarz OP do pytania.
nyuszika7h,

9

Rubin, 30 23 18 bajtów

loop{puts ?x.succ}

Można go zabić za pomocą SIGINT, naciskając Ctrl+ C.

Dzięki manatwork za udostępnianie ulepszeń!


1
loop{puts [*?x..?z][1]}- 23 znaki, loop{puts ?x.succ}- 18 znaków
manatwork

@manatwork Thanks! Zaktualizowano
ProgramFOX,

8

Perl, 26 bajtów

{print chr$=*2+1,$/;redo}

Niestandardowe dane wejściowe z argumentu (jak yesfaktycznie działa), 22 bajtów-10 = 12

{print @ARGV,$/;redo}

Niestandardowe dane wejściowe ze standardowego wejścia, 22 bajtów-10 = 12

while(<>){print;redo}

Program @mar Nitz ma tylko 14 bajtów i jest bardzo wysoko oceniany komentarz do twojego linku, który mówi, że chłodzenie nazw plików ma znaczenie, jeśli umieścisz je w bajtecount. Wydaje mi się to uzasadnione.
metro

och, czekaj, nie widziałem części pytania „nie możesz użyć”. nieważne, że to jest złe
metro

Masz rację. Naprawiono
Nitz

6

C, 64 55 53 45 40–10 = 30

main(int c,int**a){for(;;)puts(a[c>1]);}

Nie jestem z tego bardzo zadowolony, ponieważ wymaga, aby program miał nazwę „y” i by mógł być wywoływany tylko z „y”, więc musi być w $ PATH, ale hej, pierwszy codegolf :)

Alternatywny:

C, 30 (+ 1 nazwa pliku)

main(){for(;;)puts(__FILE__);}

Używam tej samej techniki, co mój szanowany kolega @Matt Windsor

  • EDYCJA: okazuje się, że ominięcie znaku no \ n jest krótsze
  • EDYCJA 2: „int” jest krótszy niż „char”
  • EDIT3: wcale nie potrzebowałem tej zmiennej
  • EDIT4: odrobinę nieokreślone zachowanie nigdy nikomu nie zaszkodzi
  • EDYCJA 5: dodaj alternatywną wersję

5

Linux Bash, 33-10 = 23

read a; while :; do echo $a; done

Można go zabić za pomocą SIGINT, naciskając Ctrl+ C.


Powinieneś przeczytać tylko jedną linię i wielokrotnie wydrukować tę samą linię. Twoje programy to nie yestylko catprogramy.
jimmy23013

Mój zło, nie powinienem był tego wypróbowywać po dniu pracy.
Orace,

Co powiesz naread a;for((;;));{ echo $a;}
core1024,

5

Rdza, 52 znaki

fn main(){loop{println!("{}",'Y'.to_lowercase())}}

Wydaje się, że nie ma dobrego sposobu na obliczenie ybez zuchwałości w Rust - zrobili zbyt dobrą robotę, robiąc znaki bezpiecznie. JA:

  • Nie można podać ciągów nieliteralnych println!, więc nie można tam wykonywać żadnych sztuczek;
  • Nie można dodać 1 do 'x', ponieważ w Rust znaki nie są liczbami;
  • Nie można ROT13 (dlaczego Rust nie ma ROT13 w swojej standardowej bibliotece !?);
  • Nie można łatwo zrobić nic niebezpiecznego, jak upuszczenie ciągów C, konwersja liczb na znaki itp. Bez nadmiernej gadatliwości i przekroczenia 52c.

Bonus kodu też nie jest tego wart, ponieważ czytanie z stdinniego wymagałoby obsługi błędów = 3

Wiele redukcji kodu, które mogłem znaleźć, wiązało się z robieniem coraz więcej przypadków łamania reguł w środowisku kompilatora:

Rdza, 44 znaki (+ co najmniej 1 znak dla nazwy pliku)

fn main(){loop{println!("{:.1}", file!())}}

Przestarzałe przez poniżej. Ten prawdopodobnie się nie liczy, ponieważ nazwa pliku źródłowego musi zaczynać się od y.

Edycja: Rust, 36 znaków (35 źródeł, 1 nazwa pliku)

fn main(){loop{println!(file!())}}

Jak wyżej, ale plik musi zostać wywołany y(nie y.rs, y). Humorystycznie Rust zastąpi źródło plikiem binarnym! Przynajmniej na moim komputerze, plik binarny działa potem.

Rdza, 37 znaków (+ równowartość env K='y'na twojej platformie)

fn main(){loop{println!(env!("K"))}}

Ten jest jeszcze gorszy: musisz ustawić zmienną środowiskową Kna ypodczas kompilacji .

Edit : jeśli ustawisz Księ y\n, można upuścić lnin println!, dla ogólnej sumy 35 znaków i kilku facepalms:

fn main(){loop{print!(env!("K"))}}

Naszą zwykłą zasadą wymagającą określonych nazw plików lub flag kompilatora jest po prostu uwzględnienie ich w liczbie bajtów.
Martin Ender,

@ MartinBüttner Wystarczająco uczciwy. Co dziwne, wydaje się, że rdza nie jest najlepszym językiem dla golfa kodowego>: P
Matt Windsor

Możesz dodać jeden xw modny sposób, ale wciąż nie jest on krótki:(b'x' + 1) as char
Shepmaster,

5

Linux Bash - 19 bajtów

Jest to prawdopodobnie oszustwo i może ulec awarii, jeśli nie masz / usr / bin / yes lub masz / usr / bin / xes lub / usr / bin / zes:

/usr/bin/[x-z]es $*

Myślę, że spełnia wymagania, ale być może narusza zasadę „nic, co ocenia na y”. Być może naśladowanie yesprzez bieganie yesjest niezgodne z zasadami.

Można to nieco zoptymalizować (choć rzadziej będzie działać), aby zmniejszyć do 11 bajtów:

/*/*/?es $*

Nie mogłem wymyślić, jak uzyskać premię 10 punktów, czytając ciąg ze standardowego wejścia bez dodawania więcej niż 10 bajtów do kodu


2
/*/*/?es `line` lub /*/*/?es `head -n1` jeśli nie masz /usr/bin/line.
jimmy23013,

2
Lub sed qdla line.
jimmy23013,

5

dc, 12

[30986Pdx]dx

Tylko wyjścia y\n. Nie czyta ze standardu, więc nie ma premii.

30986 to 0x790A (tzn. „Y \ n”). PPolecenie po prostu zamienia liczbę oparcia 256, i wyświetla odpowiedni znak dla każdego bazowego 256 cyfry.


To całkiem sprytne, jak ocenia 30986 y\n?
nyuszika7h,

Wiedziałem o tym, Pale nie wiedziałem, że może zrobić więcej niż jedną postać na raz.
nyuszika7h

5

Common Lisp: (30-10) = 20

(format t"~@{~a~%~:*~}"(read))
  • (read) ze strumienia wejściowego
  • wydruk do strumienia wyjściowego: (format t ... )
  • powtarzaj wszystkie formatargumenty (tutaj tylko jeden):~@{ ... ~}
  • wewnątrz pętli dla każdego argumentu:

    • argument print, ~Apo którym następuje nowa linia~%
    • przewiń aktualny element do poprzedniego ~:*(nieskończona pętla)

Możesz przerwać pętlę Ctrl+C, co sygnalizuje błąd przy opcjach restartu (kontynuuj / przerwij).


3

Haskell, 29 bajtów

main=putStrLn[succ 'x']>>main

Wierzę, że jest to powstrzymane zarówno przez, jak SIGINTi SIGPIPE.


sugestia: użyj '\89'zamiastsucc 'x'
dumny haskeller

3

Ruby, 27 bajtów - 10 = 17

To tylko rozwiązanie @ ProgramFOX z bonusem (zajęło moje 9 bajtów, aby rozwiązać pytanie bonusowe).

loop{puts ARGV[0]||?x.succ}

3

dc, 21 bajtów - 10 = 11

C1st?st[ltP[]ps0dx]dx

Zauważ, że dane wejściowe muszą być opakowane [], np. [no]Ponieważ ?jest to jedyny sposób na pobranie danych wejściowych, które wykonują je jako dckod.


Możesz użyć C2zamiast 122. W rzeczywistości argumentowałbym, że 122 1-można go zastąpić, C1ponieważ C1nie jest to wyraźnie zakazane w pytaniu
Digital Trauma

3

Commodore 64 Basic: 14 13 bajtów

1?C|(11↑2):R╭

Jak zwykle dokonałem podstawienia znaków w PETSCII, które nie są obecne w Unicode. |służy do reprezentowania SHIFT+H, podczas gdy reprezentuje SHIFT+U. Zauważ, że to zwraca ASCII „y” (wartość bajtu 121) zamiast znaku, który domyślny zestaw znaków Commodore wyświetla jako „y”.

BASIC jest podobno łatwym do nauczenia, angielskim językiem programowania. Dodaj skróty do pisania obecne w wielu wczesnych dialektach, a otrzymasz coś krótszego i mniej czytelnego niż Perl.

EDYCJA : W „trybie przesuniętym” jest to dwa bajty krótsze, ponieważ małe litery „y” są kodowane z wartością dziesiętną 89. Użycie zestawu znaków spoza ASCII w celu obejścia zasady „niedozwolone używanie ich wartości ASCII” może być jednak oszukiwanie.

1?cH(89):rU

Biorąc pod uwagę wszystkie in istniejące w Unicode, wydaje się zaskakujące, że pełny zestaw znaków używany przez C64 gdzieś tam nie będzie.
kasperd,

@kasperd, znaki rysunkowe w Unicode pochodzą głównie z zestawu „DOS” IBM i przechodzą przez środek komórki znaków. PETSCII ma znacznie większy zestaw, z którego wiele wykorzystuje krawędzie komórki postaci. U + 2502 jest prawdopodobnie przyzwoitym przybliżeniem pręta pionowego wytwarzanego przez SHIFT+H, ale charakter rury jest łatwiejszy do wpisania. Nic nie odpowiada „liniom na górnej i lewej krawędzi” produkowanym przez „SHIFT + O”.
Mark

Bardzo dobrze, ale możesz zaoszczędzić jeden bajt, zastępując „Goto 1” słowem „Run”: „1? CH (89): rU”
LeFauve

@LeFauve, dzięki. Zastosowałem go również do wersji emitującej ASCII.
Mark

3

AWK, 38 bajtów

BEGIN{for(;;)printf("%c%c",60+61,5+5)}

Wariant, który będzie czytał ciąg na stdin: 14 bajtów-10 = 4

{for(;;)print}

Ale ponieważ nie może zrobić obu (przywróć „y”, jeśli nie podano standardowego wejścia), nie jestem pewien, czy to się liczy ...: o)

Oba można wyjść za pomocą Ctrl + C.


3

Rozszczepienie , 5 bajtów

Rx+!N

Jest to dość konkurencyjne dla rozszczepienia. :)

Przepływ kontrolny zaczyna się od (1,0)atomu o prawidłowej charakterystyce przy R. xustawia masę 120i +zwiększa ją, aby dać (121,0). Następnie !drukuje odpowiedni znak ( y) i Ndrukuje nową linię. Kod źródłowy zawija się na brzegach, więc atom przepływa Rponownie (co teraz nic nie robi), xustawia masę 120ponownie, +zwiększa ją i tak dalej i tak dalej ...


3

C, 32 bajty

Wymaga małej maszyny endian i kompilacji z opcją -O2 (aby uniknąć przepełnienia stosu).

a=11*11;main(){main(puts(&a));}

2

PowerShell, 27–10 = 17

param($s=$Host[1])for(){$s}

Może nie działać w Pash. Powinna być bardziej niezawodna alternatywa

param($s="$(gal gh*)"[2])for(){$s}

2

Lua, 42 bajty - 10 = 32

while 1 do print(...or('').char(90+31))end

Lua, 49 bajtów - 10 = 39

y=...or(string.char(60+61))while 1 do print(y)end

Oba zostały przetestowane z Lua 5.1.4 i można je zabić SIGINT ( Ctrl+ C).


Niesamowite! Moja mama pisze w Lua, nigdy wcześniej nie widziałam tego na wolności. ( Hej mamo! Zgadnij, co widziałem! )
Signal15

2

Perl, 31

Oto wersja Perla, która faktycznie zachowuje się jak GNU yes, o ile mogę powiedzieć:

{print "@ARGV"||chr 11**2;redo}

Działa to, jeśli można używać przełączników wiersza poleceń Perla ( -ldla nowej linii), w przeciwnym razie stałoby się o 3 znaki dłużej:

{print "@ARGV"||chr 11**2,$/;redo}

literówka: jest -l(nie -e) przełącznikiem nowej linii.
chris-l

Bonus jest również, jeśli twój skrypt może czytać ze standardowego wejścia . Tak, wiem, że prawdziwe tak nie czyta ze standardowego, ale z argumentu, ale taka jest zasada postawionego OP; bonus musi pochodzić ze standardu.
chris-l

@ chris-l naprawił typ, dzięki.
Usunąłem

hehe pewnie, moja własna odpowiedź jest jak twoja; używa argumentu zamiast standardowego wejścia. IMHO, operacja powinna dać premię tym, którzy faktycznie robią to, co robi prawdziwe tak .
chris-l

2

CAPL 1.5+; 6 bez danych wejściowych; 10–10 = 0 z wejściem

Sidenote
Czytałem gdzieś [link?], Że niestandardowe języki są niedozwolone w pytaniach golfowych, ponieważ mogą one tworzyć wbudowane funkcje, które robią dokładnie to, o co pyta pytanie, jednak sprawiłem, że CAPL ogólnie ułatwia golfa . Jeśli uważasz, że nie jest to dozwolone tutaj, daj mi znać!

Mam pomysły od > <> i Befunge (możesz poruszać się między liniami i używać znaków szesnastkowych do wypychania liczb), niektóre od Ruby, a niektóre ode mnie, aby ułatwić grę w golfa.
CAPL odczytuje od lewej do prawej i przechodzi o jedną linię w dół na końcu linii. Jeśli jest to ostatni wiersz, program zostanie zamknięty.

Ponieważ nikt jeszcze nie zna tego języka, postaram się wyjaśnić jak najwięcej.

Wyprowadzanie y. 6 bajtów

bb*.n<

bb* bjest szesnastkowy dla 11, więc bb*jest 11*11= 121, co jest odpowiednikiem UTF-8 y. Ta wartość jest wypychana na stos.
.Wyrzuca najwyższą wartość ze stosu i wyświetla jako UTF-8. Tak jak 121na szczycie stosu, indeks jest tutaj ignorowany.
nWysyła nową linię
<Wysyła wskaźnik z powrotem na początek linii, w ten sposób powtarzając tę ​​linię. Ponieważ nie oczekujemy danych wejściowych, możemy to zrobić bezpiecznie bez ponownego pytania o dane wejściowe.

Wyprowadzanie z wejścia. 10 bajtów, 0 po premii

i~a&{X:.)}

iPobiera dane od użytkownika, przesuwa jako UTF-8 na wierzchu stosu, a następnie przesuwa długość. Tj. [72,101,108,108,111,5]
~Wyrzuca liczbę ze stosu, a następnie odwraca tę liczbę bajtów. Tzn. [111,108,108,101,72]
aSzesnastkowy dla 10znaku nowej linii
&{...}Tworzy nieskończoną pętlę. Mamy dane wejściowe, więc nie możemy wysłać wskaźnika z powrotem do linii. Mógłbym umieścić tę funkcję w wierszu poniżej, co zabezpieczyłoby mnie bajtem, ale nowe wyzwania nie są dozwolone w tym wyzwaniu.
XUsuwa najwyższą wartość ze stosu (Indeks z pętli)
:.Duplikuje najwyższą wartość, a następnie wyprowadza jako UTF-8
)Obraca stos w prawo. ( [1,2,3,4,5]-> [5,1,2,3,4])

Jednak oznacza to, że zaczynamy od nowej linii, a następnie zaczynamy wypisywać dane wejściowe, następnie nową linię, następnie dane wejściowe itp. Jeśli nie możemy zacząć od nowej linii, użyj następującego kodu z 12 bajtami lub 2 po odjęciu premia.

iXa#~&{X:.)}

Jedynym nowym poleceniem tutaj jest #przesunięcie liczby przedmiotów ze stosu na stos.
Usunąłem długość i, ponieważ dodanie 1, a następnie zamiana z nową linią jest dłuższe niż usunięcie i odzyskanie długości ponownie.

Dla zabawy, oto program „Hello World”

"Hello World"#~
#?!;.<

?!Działanie jest takie samo, jak> <> 's


W rzeczywistości ograniczenie dotyczy niestandardowych języków / bibliotek / funkcji opublikowanych po opublikowaniu pytania.
manatwork

@manatwork Oznaczałoby to, że moja odpowiedź jest nieprawidłowa. Dziękuję za wyjaśnienie. Stworzyłem ten język i chciałem zrobić kilka golfowych wyzwań, aby przetestować, co mógłbym ulepszyć w przyszłych wersjach, jeśli to coś poprawi.
Charlie

Moim zdaniem nie jest to nieważne, po prostu nie kwalifikuje się do wygrania. Celem ograniczenia było zapobieganie oszustwom, ale gdy dodałeś oświadczenie o świeżości języka, nie można tego uznać za próbę oszustwa.
manatwork

2

APL (Dyalog APL) , 5-10 = -5 bajtów

Ostrzeżenie: polega na nieudokumentowanej i nieobsługiwanej funkcji / błędzie.

⎕←⍣≢⍞

Pusty STDIN drukuje puste linie (nie „y”), co jest dozwolone i zostało zasugerowane .

Wypróbuj online!

 STDOUT z końcowymi znakami nowej linii,

 dostaje

 wielokrotnie do

 różni się od

 STDIN

tzn. nigdy, ale nieprzerwanie przez wstrzymanie wątku.


Hmm nadużywanie błędów .. ciekawe.
Matthew Roh

@MatthewRoh Używanie, nie nadużywanie. „Funkcja” używa operatora do przypisania , chociaż nie jest to prawdziwa właściwa funkcja, a zatem nie kwalifikuje się do bycia operandem. Nadal działa przez ...
Adám

2

> <>, 6 bajtów

b:*oao

Nie umieszczając ;na końcu znaku>, <> będzie pływał, dopóki nie zostanie wypuszczony przez SIGINT.

Wyjaśnienie

b:*oao
b         Push 11
 :        Duplicate
  *       Multiply top elements to get 121
   o      Print as character
    a     Push 10
     o    Print as character (yielding '\n')
          No program terminator, so our ><> will 
          keep on swimming this path forever.
^----' 


> <>, 17–10 = 7 bajtów

Poprzednie jest dość nudnym rozwiązaniem, więc oto jedno, które pobiera dane wejściowe ze standardowego wejścia. To narusza fakt, że domyślnym sposobem dostarczania danych wejściowych do programu > <> jest echo 'input' | fish.py yes.fish, gdzie echozapewnia \nznak.

 i:0)?!v
0r}o:r~<

Wyjaśnienie

 i:0)?!v     Load STDIN into the stack (reversed)

             NOP           <----------,
 i           Push a byte from STDIN   |
  :          Duplicate top element    |
   0         Push 0                   |
    )?       If (i > 0):              |
      !        Wrap around  ----------'
             Else:
       v       Move to the second part

0r}o:r~<     Print STDIN until halted

       <     Go right         <---------------,
      ~      Remove top element (duplicated   |
                -1 from EOF)                  |
     r       Reverse stack                    |
    :        Duplicate top element            |
   o         Output as character              |
  }          Rotate stack to right (go to     |
                next character)               |
 r           Reverse the stack                |
0            Push 0                           |
             Wrap around       ---------------'

Na 0rkońcu pozwala na to, aby pętla sfor miała miejsce, owijając się wokół niej, gdzie nadal zakładamy, że stos zostanie odwrócony za pomocą „ -1na górze”.


1

Najwyraźniej nie jest to całkowicie przenośne. Mój sys.version jest 2.7.9 (default, Dec 11 2014, 04:42:00) \n[GCC 4.9.2], więc jeśli twój jest inny, to może nie działać.

Python 2 - (76-10) = 66

import sys
s=sys.stdin;a=`help`[1]if s.isatty()else s.read()
while 1:print a

Dość długo, ale chciałem skorzystać z bonusu (mimo że kosztował więcej niż 10 bajtów). Wygląda na to, że sprawdzanie, czy standardowe wejście jest puste, czy nie bez monitowania o wprowadzenie danych, jest długie.

Na początku błędnie odczytałem premię jako podjęcie kłótni zamiast stdin. Jestem dumny z mojego rozwiązania, więc i tak to publikuję;)

Python 2 - (52-10 + ∞) = ∞ (niepoprawny!)

import sys
while 1:print(sys.argv+[0])[1]or`help`[1]

sys.argvjest listą, w której element zerowy jest nazwą pliku, a każde posłowie elementu jest argumentem przekazanym programowi. Dodaję wartość falsey na końcu listy; jeśli nie ma argumentów, pierwszym elementem jest ta wartość falsey, w przeciwnym razie jest to pierwszy argument. a or bw Pythonie zwraca pierwszą wartość, która potwierdza wynik: Jeśli ato prawda, wiemy już, że wszystko będzie prawdziwe, więc po prostu jest zwracane. Jeśli jest to fałsz, bjest zwracane (od False or b== b).


@ smażyłbym mógł, ale zachęciłoby użytkownika. Chciałem, żeby y\nnatychmiast zaczął wypluwać, jeśli stdin był pusty.
undergroundmonorail

@fry To dziwne, działa dla mnie. Może to zależeć od cPython? Nie mam żadnych innych pomysłów.
metro

dobry pomysł, na nim
podziemny

r=raw_input();p=r if r else`help`[1]\nwhile 1:print p 52 znaków
globby,

1
Hmm, już pierwsza linia wydaje się mieć yw sobie drugą, też drugą.
Paŭlo Ebermann
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.