Więc napisałem sobie jedno-linijkę, która wydrukowała węża na konsoli. To trochę zabawne i zastanawiałem się, jak mogę skondensować kod ...
Oto (krótki) przykładowy wynik:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Oto specyfikacje:
- W każdym wierszu na konsoli drukowany jest pojedynczy znak spacji (w zależności od tego, co chcesz), początkowo z 29 do 31 spacjami po lewej stronie.
- Przy każdej iteracji pomiędzy tymi trzema akcjami podejmowana jest losowa decyzja
- Ilość wypełnienia zmniejsza się o 1
- Ilość wypełnienia pozostaje taka sama
- Ilość wypełnienia wzrasta o 1
Zrób to 30 razy, aby wydrukować węża o długości 30 segmentów na konsolę.
Najkrótsza odpowiedź w bajtach wygrywa.
Odpowiedzi:
05AB1E ,
1514 bajtówWypróbuj online!
Zastosowania
0
.Wyjaśnienie
źródło
Random Brainfuck ,
123 122121 bajtówWypróbuj online!
Random Brainfuck jest rozszerzeniem „brainfuck”, z pomocnym dodatkiem
?
polecenia, które ustawia bieżącą komórkę na losowy bajt. To drukuje węża wykonanego z!
s, który bardziej zabawnie przypomina kroki.Jak to działa:
Inne rozwiązanie, które przylgnie do litery pytania, a nie ducha.
87 bajtów
Wypróbuj online!
Ten jest mocno tendencyjny do pozostawiania wyściółki w spokoju, ale zwiększenie lub zmniejszenie wyściółki są równie możliwe. Każda z nich ma nieco mniej niż 1 na 256 okazji.
źródło
?
polecenia. +1?
jest dostępny tylko w Random Brainfuck , a nie w klasycznym brainfuckC (gcc) ,
615856 bajtówOdpowiedź edytowana w celu odzwierciedlenia zmian zasad ...
Wypróbuj online!
źródło
s+=1-rand()%3
do funkcji printf.i;f(s){for(s=i=31;--i;)printf("%*c\n",s+=1-rand()%3,43);}
Siatkówka , 24 bajty
Wypróbuj online!
Wyjaśnienie
Zainicjuj łańcuch roboczy do pierwszego wiersza, tj. 30 spacji i znaku a
+
.W drugiej linii jest spacja.
-29{
opakowuje pozostałą część programu w pętlę, która jest uruchamiana 29 razy.¶<
wypisuje ciąg roboczy na początku każdej iteracji pętli z końcowym przesuwem linii. Sam etap atomowy wstawia spację na początku łańcucha (podstawową ideą jest wstawienie jednej spacji, a następnie losowe usunięcie 0–2 spacji, ponieważ jest to bajt krótszy niż losowe wybieranie między usuwaniem, wstawianiem i brakiem operacji).Odpowiada to pustemu wyrażeniu regularnemu względem danych wejściowych, co daje nam każdą pozycję między znakami (oraz początkiem i końcem łańcucha). Następnie
,2
zachowuje tylko trzy pierwsze dopasowania, tzn. Dopasowania po zera, jeden i dwa spacje.@
wybiera losowy jeden z tych trzech dopasowań. Następnie etap podziału (S
) dzieli dane wejściowe wokół tego dopasowania. I1
każe zachować tylko drugą część podziału. Innymi słowy, odrzucamy wszystko, aż do losowego dopasowania.30. linia, która jest wynikiem końcowej iteracji pętli, jest drukowana domyślnie na końcu programu.
źródło
VBA,
605949 bajtówWklej go w oknie Natychmiastowe i naciśnij klawisz Enter. (Upewnij się, że wyraźna deklaracja jest wyłączona!)
O wiele bardziej prawdopodobne jest, że poruszy się niż pozostanie w linii (tzn. Akcje nie są równo ważone), ale nie był to określony wymóg (na szczęście!)
{EDYCJA} Zaoszczędzono 1 bajt, usuwając spację między
=1
iTo
{EDIT2} Zaoszczędzono 10 bajtów dzięki komentarzowi Remoela
Stare wersje:
źródło
String(i," ")
je,Spc(30+i)
a następnie usuwająci=30:
. Lub -1 bajt przez usunięcie&
. :)C # (.NET Core),
1121101061009998 bajtów-1 bajt dzięki @raznagul .
-1 bajt dzięki @auhmaan .
Wyjaśnienie:
Wypróbuj online.
źródło
new Random().Next()
wiele razy lokalnie (.NET Framework wersja 4.6.1), zawsze otrzymuję ten sam wynik. Muszę dodać przerwęThread.Sleep(10)
między rozmowami, aby niezawodnie uzyskać różne wyniki. Przy czasie snu krótszym niż 10 ms czasami wciąż otrzymuję ten sam wynik. Tak więc .net-Framework i TIO (.net-Core) mają różne PRNG lub przynajmniej używają różnych nasion. Jeśli zmienię twój program w TIO na C # -mono, otrzymam takie samo zachowanie, jak lokalnie w .net-Framework.new Random()
wykorzystuje czas jako ziarno, więc w ciasnej pętli czas jest taki sam, więc wynik jest taki sam.Thread.Sleep(10)
niezawodnie uzyskać różne wyniki, aThread.Sleep(1)
nawet 9 ms to za mało.C, 56 bajtów
Wypróbuj online!
Wyjaśnienie:
C (gcc) , 55 bajtów
Zależy od f „powrotu” wartości przypisanej nw funkcji, co jest niezdefiniowanym zachowaniem, ale działa spójnie z gcc, gdy nie są włączone optymalizacje.
Wypróbuj online!
źródło
JavaScript (ES8),
636260 bajtówZawiera końcowy znak nowej linii.
*2-1
można by zastąpić-.5
1 bajtem oszczędności, ale szanse, że każda linia będzie miała taką samą długość jak poprzednia linia, znacznie wzrosłyby. Oczywiście, ponieważ „wyzwanie” nie jest zdefiniowane w wyzwaniu, RNG można zastąpićnew Date%3-1
całkowitą liczbą bajtów wynoszącą 55 .Zapisałem bajt dzięki komuś, kto usunął swój komentarz, zanim mogłem złapać nazwę. Ja rzeczywiście starał się to w ten sposób
repeat
, apadStart
jednak nie sądzę, aby spróbowaćpadEnd
- nie wiem dlaczego!Pokaż fragment kodu
Premia
Dla tej samej liczby bajtów, oto wersja, która przyjmuje liczbę początkowych spacji i iteracji jako dane wejściowe.
Pokaż fragment kodu
źródło
f=(x=y=30)=>x?`+\n`.padStart(y+=Math.random()*2-1)+f(--x):``
jest o jeden bajt krótszy. (Uwaga: ponieważ SO nie pozwala na łamanie linii w komentarzach, musiałem wpisać \ n zamiast faktycznie używać łamania linii.)y=31
, istnieje możliwość, że pierwszy wiersz będzie zbyt krótki. tio.run/##BcFLDsIgEADQvSeZkUCs7kzQE7hyqSYzKfRjKBCYGHp6fO/…Java 8,
8987 bajtówNajpierw golf, jestem pewien, że mogłoby być znacznie lepiej ..
Edycja: Naprawiono pierwszą linię dzięki Steadybox .
Wypróbuj online!
źródło
Python 2 ,
836564 bajtówProste podejście:
Wypróbuj online!
Dzięki @Rod za uratowanie niektórych bajtów! Dzięki @ovs za -1 bajt!
Edycja: zmieniono nazwę zmiennej i ciąg wyjściowy na literę „s”
Więcej wężowych danych wyjściowych dla 88 bajtów:
źródło
APL (Dyalog) , 20 bajtów
1 bajt zapisany dzięki ngn
Wypróbuj online!
źródło
¯2+
--->2-
Węgiel drzewny , 14 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:
Byłby tylko 10 bajtów, gdyby nie było wymogu wstępnego wcięcia.
źródło
PHP, 61 bajtów
Wypróbuj online!
źródło
$i<30;$i++
można$i++<30;
zapisać 2 bajty.for($p=30;$i++<30;$p+=rand(-1,1))printf("%{$p}s\n",'+');
(\n
liczony jest jako 1 znak i należy go zastąpić prawdziwym nowym wierszem)for($i=$p=30;$i--;$p+=rand(-1,1))printf("%{$p}s\n",'+');
Java 8,
131129127126119108101 bajtówWyjaśnienie:
Wypróbuj online.
Stara 119 bajtowa odpowiedź:
Wyjaśnienie:
Wypróbuj online.
źródło
R ,
726967 bajtówDzięki Zahiro Mor za 2 dodatkowe bajty!
Wypróbuj online!
źródło
sample(3,29,T)-2
narunif(29,-1,1)
zmniejszy liczbę bajtów o 2, ale ruchy nie są już tak prawdopodobne. Czy mógłbyś również przejść napaste("%"
zamiast,paste0("% "
czy coś mi brakuje?% 30 s
zamiast% 30s
. Jak powiedziałeśrunif
, zepsułoby to prawdopodobieństwo.sprintf("%30s")
,sprintf("% 30s")
isprintf("% 30 s")
zwraca te same rezultaty dla mnie. Ale w TIO tylko pierwsze dwa mają identyczne wyniki, więcpaste0("%"
należy zapisać bajt. I nie ma wymogu, aby każdy ruch miał takie samo prawdopodobieństwo.Japt , 13 bajtów
Zwraca tablicę wierszy.
Sprawdź to
Wyjaśnienie
Premia
Dla 2 bajtów mniej , oto wersja, która przyjmuje liczbę początkowych spacji i iteracji jako dane wejściowe.
Spróbuj
Alternatywne RNG
Ostatnie 4 bajty można zastąpić dowolnym z poniższych:
źródło
-1
RNG zwróci go przy pierwszej iteracji, otrzymamy całkowitą długość linii,29
kiedy powinna być30
,31
lub32
.30
a następnie dodajemy-1
,0
lub1
dajemy29
,30
lub31
- dodajemy"
i, który daje nam całkowitą długość30
,31
lub32
dla pierwszego wiersza.Szybki , 101 bajtów
Wyjaśnienie
Pełny program. Wykorzystuje to dość dziwną sztuczkę:
arc4random()
jest członkiemDarwin
modułu, aleUIKit
także ma zainstalowaną tę funkcję, więc oszczędza bajt :) Używa także jednej z moich wskazówek golfowych Swift do powtarzania ciągów dowolną liczbę razy.źródło
for _ in 0 ... g
wykonuje bloku kodu 29 razy zamiast 30 (pętla od 0 do 29 (wyłącznie))?0...g
generuje wszystkie liczby całkowite w [0; g] . Mój zły, naprawiłem wyjaśnienie.0..<g
wygeneruje liczby całkowite w [0; g) : P[0; g)
edytowałeś[0; g]
mnie, żeby naprawdę mnie zdezorientować. :) Hmm, aleg=30
czy[1; g]
w takim przypadku nie można zacząć od pętli ?[0; g)
lub na[1; g]
pewno byłaby możliwa, jeśli wybioręg=30
zamiast tego, ale następnieprint(...,0)
należy go zmienić naprint(...+"0")
, ponieważ w przeciwnym razie przed 0 pojawiłoby się dodatkowe (obce) miejsce. Tak czy inaczej liczba bajtów pozostaje taka sama.Perl, 36 bajtów
źródło
say
do odejmowania. Czy mam rację, myśląc, że nie zmienia liczby przebiegów, gdy$#a
jest zwiększany, ponieważ nie jest to odniesienie?map
który wydaje się najpierw układać elementy na stosie.for
nie ma i miałby nieprzewidywalną długość pętliperl -E 'map{$#a+=rand(3)-say"@a -"}@a=1..30'
, ale czasami (nie za każdym razem) powodowało to błąd segmentacji. Czy to może być błąd w perlu v5.22.1 i v5.16.3?R,
5453 bajtyPodobny pomysł jak powyżej , ale ze skróconym
sprintf
kodem i literałem krótszego ciągu znaków. Zamiast\n
(dwóch bajtów) używam dosłownego podziału linii (jeden bajt).Try it online!
źródło
A field width or precision (but not both) may be indicated by an asterisk *: in this case an argument specifies the desired number.
Używam odsprintf
lat i jakoś zawsze tęskniłem za tą częścią ... Dziękuję za przypomnienie!Rubinowy ,
4539 bajtówWypróbuj online!
Modyfikacja
x
podczas pętli nie wpływa na licznik pętli. Wybrałem S jako szczególnie snakelową postać wyjściową.-6 bajtów: użyj
rand(3)-1
zamiast[-1,0,1].sample
. Dzięki, Eric Duminil !źródło
x.map
zamiastx.times
(ekwiwalent, ponieważ nie używasz wartości zwracanej)rand -1..1
jest pięć bajtów krótszy niż[-1,0,1].sample
rand(3)-1
mniej o 6 bajtów.(x=30).times{puts' '*x+?+;x+=rand(3)-1}
(ten sam rozmiar) wydrukuje dokładnie 30 spacji dla głowy węża zgodnie z żądaniem wyzwaniaSenseTalk ,
237198 bajtówJest to język, który poznałem i pokochałem około dziesięć lat temu. Jest to język skryptowy, który napędza narzędzie do automatycznego testowania Eggplant Functional . Przez wiele lat byłem zapalonym użytkownikiem tego narzędzia, zanim na jakiś czas dołączyłem do firmy. Nie jest to język, który najlepiej nadaje się do gry w golfa, ale pisanie go jest dla mnie bardzo przyjemne. Gra w golfa jest w rzeczywistości dość trudna, ponieważ język ma być gadatliwy i podobny do angielskiego ... zajęło mi sporo czasu do 237 bajtów.
Niegolfowane / Wyjaśnienie
Edycja: Zapisano 36 bajtów dzięki @mustachemoses
źródło
J , 23 bajty
Wypróbuj online!
źródło
PowerShell , 42 bajty
Wypróbuj online!
Pętle od
1
do$l=30
. Każdej iteracji umieszczamy$l
spacje orazx
znak w potoku jako ciąg znaków, a następnie+=
albo na-1, 0, 1
podstawieGet-Random
do$l
dla następnej pętli. Te ciągi znaków są zbierane z potoku, a domniemanyWrite-Output
daje nam listę oddzieloną znakiem nowej linii za darmo.źródło
Bash, 53
Wypróbuj online .
źródło
p+=RANDOM%3-1
też działa.Galaretka , 18 bajtów
Wypróbuj online!
Wybrana postać to 0 . Jeśli dozwolone jest zwracanie listy znaków,
Y
można ją usunąć, a przesłanie można przekształcić w łańcuch niladyczny na 17 bajtów . Alternatywa .Jak to działa
Galaretka , 16 bajtów
Łącząc moje, rozwiązania Erika i Jonathana, możemy zagrać w golfa do 16 bajtów. Wybrana postać to 1 .
Wypróbuj online!
Podziękowania dla Jonathana Allana za heads-up (on
Ṭ€o⁶
).źródło
Ṭ€o⁶
zamiast tego,⁶ẋ;€0
co robi mój 18 bajter i zejść do 17.Oktawa ,
53 51 5049 bajtówWypróbuj online!
Zapisano 1 bajt, nie wykonując już pętli. Zapisane innego jak Octave ma
printf
jakfprintf
.Ten nowy kod tworzy tablicę 30 losowych liczb całkowitych w zakresie
-1:1
. Następnie sumuje sumę macierzy i dodaje 30, co daje pożądaną sekwencję.Wynik jest drukowany przy użyciu
fprintf
formatu, który brzmi: „Liczba dziesiętna, dopełniona do określonej szerokości, a następnie nowy wiersz. Szerokość będzie pierwszą wartością wejściową, a liczba dziesiętna drugą wartością. Jeśli liczba wartości wejściowych jest więcej, Octave będzie automatycznie powtarzał wydruk, aby uzyskać pożądany wynik.Aby więc uzyskać pętlę, potrzebujemy tylko zerować zera między tablicą sekwencji, więc
fprintf
funkcja wykorzystuje każdą wartość w sekwencji jako szerokość, a każde zero jako cyfrę do wydrukowania.Drukuje dane wyjściowe, takie jak:
Powyższy kod nie zawsze drukuje dokładnie 30 spacji w pierwszym wierszu. Będzie to 29, 30 lub 31. Aby to naprawić, użyj tej 53-bajtowej wersji:
źródło
x=31;for i=2:x;fprintf('%*d\n',x+=randi(3)-2,0);end
Lua
8175 bajtówW
for i=1,n ...
tym to_expn
oceniana jest tylko raz przed wejściem do pętli, oszczędzając jeden bajt.-6 dzięki @ user202729
Wypróbuj online!
źródło
Python 3.6 ,
847369 bajtówDzięki @WheatWizard za -11 bajtów. Dzięki @JoKing za -4 bajty.
źródło
i
, możeszfor i in[1]*30
zamiast tego użyć do zapisania bajtów.from random import*
, aby nie potrzebowaćrandom.
później. I możesz usunąć spację nowego wiersza po swoim:
.30
się można zastąpić .29
"+".rjust(x)
" "*x+"+"
[1]*30
na,[1]*x
ponieważ jest o jeden bajt krótszy.ES5,
979581 bajtówES5,
11298 bajtów, jeśli wymagany jest format funkcji:źródło
_=>{p=30;for(i=0;i<p;i++){console.log(Array(p).join(" ")+"+\n");r=~~(Math.random()*3);p+=r==2?-1:r}}
join(" ")
zjoin` `
Czerwony , 54 bajty
Wypróbuj online!
źródło