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
stdout
nieskończonego strumienia „y \ n” - musi istnieć opcja zatrzymania tego poza zabiciem procesu za pomocą
SIGKILL
: aleSIGINT
iSIGPIPE
są 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ę
stdin
i wydrukować ją zamiast „y” (ale nadal włączając podział wiersza).
code-golf
restricted-source
Ramon Snir
źródło
źródło
y
lub\n
wewnątrz łańcucha dosłowny”?true.c
ma 80 linii.yes
przyjmuje opcjonalny argument w wierszu poleceń, a niestdin
.y
samemu.Odpowiedzi:
CJam, 13 bajtów - 10 = 3
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
y
jeśli dane wejściowe były puste.Wyjaśnienie
Po wyjaśnieniu PO wydaje się, że bardziej szczegółowo:
Poczekam jednak z aktualizacją zgłoszenia, aż OP odpowie na mój komentarz.
źródło
/no/i
, biorąc pod uwagę, jakie wyzwanie.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
^C
na moim komputerze.Brainfuck - (63-10) = 53
źródło
Python 3, 27 bajtów
Działa z co najmniej CPython i Jython.
SIGINT zatrzymuje to.
źródło
while 1:print`help`[1]
.chr(11**2)
, aby zaoszczędzić kilka znaków, a także121
.Cudowne 14 bajtów
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.
źródło
Pyth,
1096 - 10 bajtów =0-1-4Od wieków staram się uzyskać taki, z którego jestem usatysfakcjonowany. Zasadniczo konwertuje na:
źródło
#
ma równoważną funkcjonalnośćW1
iePG
jest znacznie krótszym sposobem na uzyskanie postaciy
niżC^hT2
.C #,
817876 bajtówNie można konkurować z innymi językami, ale i tak jest:
Można go zabić za pomocą SIGINT, naciskając Ctrl+ C.
Brak premii, ponieważ uzyskanie go zajęłoby więcej niż 10 bajtów.
źródło
while(1)
? Zapisuje dwie postacie.for(;;)
powinien działać.y
w sobie kod . Proszę zbadaćSystem
.System
nie 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 toy
. Zostawiam komentarz do pytania, aby zapytać Ramona, czy jest to poprawne.Java, 178
Drukowanie wymaga
System
, aley
znak jest zabroniony. Dlatego musiałem użyć refleksji.źródło
;
, wstawiającchar c='x'+1;
dofor
deklaracji pętli, więcfor(char c='x'+1;;)
skoro i tak masz tam pusty średnikPerl: 18 bajtów - 10 = 8
Ciąg jest z STDIN.
źródło
y\n
wielokrotnie, jeśli nie odbiera danych wejściowych ze STDIN? Jeśli nie, to nie naśladuje właściwieyes
.yes
wszystko nie pobiera danych wejściowychSTDIN
:)y\n
.Rubin,
302318 bajtówMożna go zabić za pomocą SIGINT, naciskając Ctrl+ C.
Dzięki manatwork za udostępnianie ulepszeń!
źródło
loop{puts [*?x..?z][1]}
- 23 znaki,loop{puts ?x.succ}
- 18 znakówPerl, 26 bajtów
Niestandardowe dane wejściowe z argumentu (jak
yes
faktycznie działa), 22 bajtów-10 = 12Niestandardowe dane wejściowe ze standardowego wejścia, 22 bajtów-10 = 12
źródło
C,
6455534540–10 = 30main(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
źródło
Linux Bash, 33-10 = 23
Można go zabić za pomocą SIGINT, naciskając Ctrl+ C.
źródło
yes
tylkocat
programy.read a;for((;;));{ echo $a;}
Rdza, 52 znaki
Wydaje się, że nie ma dobrego sposobu na obliczenie
y
bez zuchwałości w Rust - zrobili zbyt dobrą robotę, robiąc znaki bezpiecznie. JA:println!
, więc nie można tam wykonywać żadnych sztuczek;'x'
, ponieważ w Rust znaki nie są liczbami;Bonus kodu też nie jest tego wart, ponieważ czytanie z
stdin
niego wymagałoby obsługi błędów = 3Wiele 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)
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)
Jak wyżej, ale plik musi zostać wywołany
y
(niey.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)Ten jest jeszcze gorszy: musisz ustawić zmienną środowiskową
K
nay
podczas kompilacji .Edit : jeśli ustawisz
K
sięy\n
, można upuścićln
inprintln!
, dla ogólnej sumy35 znaków ikilku facepalms:źródło
x
w modny sposób, ale wciąż nie jest on krótki:(b'x' + 1) as char
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:
Myślę, że spełnia wymagania, ale być może narusza zasadę „nic, co ocenia na y”. Być może naśladowanie
yes
przez bieganieyes
jest niezgodne z zasadami.Można to nieco zoptymalizować (choć rzadziej będzie działać), aby zmniejszyć do 11 bajtów:
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
źródło
/*/*/?es `line`
lub/*/*/?es `head -n1`
jeśli nie masz/usr/bin/line
.sed q
dlaline
.dc, 12
Tylko wyjścia
y\n
. Nie czyta ze standardu, więc nie ma premii.30986 to 0x790A (tzn. „Y \ n”).
P
Polecenie po prostu zamienia liczbę oparcia 256, i wyświetla odpowiedni znak dla każdego bazowego 256 cyfry.źródło
y\n
?P
ale nie wiedziałem, że może zrobić więcej niż jedną postać na raz.Common Lisp: (30-10) = 20
(read)
ze strumienia wejściowego(format t ... )
format
argumenty (tutaj tylko jeden):~@{ ... ~}
wewnątrz pętli dla każdego argumentu:
~A
po którym następuje nowa linia~%
~:*
(nieskończona pętla)Możesz przerwać pętlę Ctrl+C, co sygnalizuje błąd przy opcjach restartu (kontynuuj / przerwij).
źródło
Haskell, 29 bajtów
Wierzę, że jest to powstrzymane zarówno przez, jak
SIGINT
iSIGPIPE
.źródło
'\89'
zamiastsucc 'x'
Ruby, 27 bajtów - 10 = 17
To tylko rozwiązanie @ ProgramFOX z bonusem (zajęło moje 9 bajtów, aby rozwiązać pytanie bonusowe).
źródło
dc, 21 bajtów - 10 = 11
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 jakodc
kod.źródło
C2
zamiast122
. W rzeczywistości argumentowałbym, że122 1-
można go zastąpić,C1
ponieważC1
nie jest to wyraźnie zakazane w pytaniuCommodore 64 Basic:
1413 bajtówJak zwykle dokonałem podstawienia znaków w PETSCII, które nie są obecne w Unicode.
|
służy do reprezentowaniaSHIFT+H
, podczas gdy╭
reprezentujeSHIFT+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.
źródło
SHIFT+H
, ale charakter rury jest łatwiejszy do wpisania. Nic nie odpowiada „liniom na górnej i lewej krawędzi” produkowanym przez „SHIFT + O”.AWK, 38 bajtów
Wariant, który będzie czytał ciąg na stdin: 14 bajtów-10 = 4
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.
źródło
Rozszczepienie , 5 bajtów
Jest to dość konkurencyjne dla rozszczepienia. :)
Przepływ kontrolny zaczyna się od
(1,0)
atomu o prawidłowej charakterystyce przyR
.x
ustawia masę120
i+
zwiększa ją, aby dać(121,0)
. Następnie!
drukuje odpowiedni znak (y
) iN
drukuje nową linię. Kod źródłowy zawija się na brzegach, więc atom przepływaR
ponownie (co teraz nic nie robi),x
ustawia masę120
ponownie,+
zwiększa ją i tak dalej i tak dalej ...źródło
C, 32 bajty
Wymaga małej maszyny endian i kompilacji z opcją -O2 (aby uniknąć przepełnienia stosu).
źródło
PowerShell, 27–10 = 17
Może nie działać w Pash. Powinna być bardziej niezawodna alternatywa
źródło
Lua, 42 bajty - 10 = 32
Lua, 49 bajtów - 10 = 39
Oba zostały przetestowane z Lua 5.1.4 i można je zabić SIGINT ( Ctrl+ C).
źródło
Perl, 31
Oto wersja Perla, która faktycznie zachowuje się jak GNU
yes
, o ile mogę powiedzieć:Działa to, jeśli można używać przełączników wiersza poleceń Perla (
-l
dla nowej linii), w przeciwnym razie stałoby się o 3 znaki dłużej:źródło
-l
(nie-e
) przełącznikiem nowej linii.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*
b
jest szesnastkowy dla11
, więcbb*
jest11*11
=121
, co jest odpowiednikiem UTF-8y
. Ta wartość jest wypychana na stos..
Wyrzuca najwyższą wartość ze stosu i wyświetla jako UTF-8. Tak jak121
na szczycie stosu, indeks jest tutaj ignorowany.n
Wysył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:.)}
i
Pobiera 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]
a
Szesnastkowy dla10
znaku 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.X
Usuwa 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”
?!
Działanie jest takie samo, jak> <> 'sźródło
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⍞
STDINtzn. nigdy, ale nieprzerwanie przez wstrzymanie wątku.
źródło
⍣
do przypisania←
, chociaż←
nie jest to prawdziwa właściwa funkcja, a zatem nie kwalifikuje się do bycia operandem. Nadal działa przez ...> <>, 6 bajtów
Nie umieszczając
;
na końcu znaku>, <> będzie pływał, dopóki nie zostanie wypuszczony przez SIGINT.Wyjaśnienie
> <>, 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
, gdzieecho
zapewnia\n
znak.Wyjaśnienie
Na
0r
koń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ą „-1
na górze”.źródło
Najwyraźniej nie jest to całkowicie przenośne. Mój
sys.version
jest2.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
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!)
sys.argv
jest 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 b
w Pythonie zwraca pierwszą wartość, która potwierdza wynik: Jeślia
to prawda, wiemy już, że wszystko będzie prawdziwe, więc po prostu jest zwracane. Jeśli jest to fałsz,b
jest zwracane (odFalse or b
==b
).źródło
y\n
natychmiast zaczął wypluwać, jeśli stdin był pusty.r=raw_input();p=r if r else`help`[1]\nwhile 1:print p
52 znakówy
w sobie drugą, też drugą.