Wszędzie węże

12

Wyzwanie

Wyzwanie jest proste: wydrukuj węża .
Otrzymasz długość węża jako dane wejściowe.
Wąż o długości 2 wygląda następująco:

==(:)-

Wąż o długości 7 wygląda następująco:

=======(:)-

Innymi słowy, długość węża to liczba znaków równości przed głową .

Stosowanie

Powiedzmy, że zrobiłem implementację C ++ i skompilowałem ją ./getsnake.
Mógłbym to uruchomić tak:

$ ./getsnake 10
==========(:)-

Wyjaśnienia

  • Standardowe luki są niedozwolone.
  • Wejścia i wyjścia można uzyskać w dowolny dopuszczalny sposób.
  • Możesz założyć, że wszystkie podane dane wejściowe są dodatnimi liczbami całkowitymi.
  • Możesz napisać funkcję zamiast zwykłego programu.
InitializeSahib
źródło
8
Nie ma sensu zostawiać wyzwania w piaskownicy na pół godziny. Dostałeś jakieś opinie, ale zwykle najlepiej pozostawić je w piaskownicy na 24-72 godziny. (Powinieneś także
rozwinąć
Czy funkcja jest wystarczająca, czy chcesz mieć pełny program?
betseg 31.07.16
Wystarczy funkcja @betseg
InitializeSahib
4
Obawiam się, że wszystkie odpowiedzi My Squiggly Lamp są łatwe do przeniesienia.
manatwork
3
Ujemne liczby całkowite powinny spowodować, że wąż się połknie.
GuitarPicker,

Odpowiedzi:

18

Sześciokąt , 33 bajty

Nie wygra, ale nadal będzie fajny. Może być w stanie zdobyć więcej golfa.

Wypróbuj online!

Gra w golfa:

61}?.$)@$j;(3<./;.}l/.400;5\j;.'\

Sformatowany:

    6 1 } ?
   . $ ) @ $
  j ; ( 3 < .
 / ; . } l / .
  4 0 0 ; 5 \
   j ; . ' \
    . . . .

Kolorowe (Wykonane przy użyciu Sześciokątnego Colorera Timwi )

znalazłeś da sekretnego snek!  ======= (:) -

Wyjaśnienie:

Pętla, drukuj „=”, aż licznik osiągnie 0.

    6 1 } ?
   . $ . . $
  . . ( . . .
 / . . } . . .
  . . . ; . .
   . . . ' .
    . . . .

Drukuj ”(„

    . . . .
   . . . . .
  . . . . . .
 / ; . . . . .
  4 . . . . .
   j . . . .
    . . . .

Drukuj „:”

    . . . .
   . . . . .
  . ; ( 3 < .
 . . . } l / .
  . . . . . .
   . . . . .
    . . . .

Drukuj „)”

    . . . .
   . . . . .
  j . . . . .
 . . . . . . .
  . . . ; 5 \
   . . . . \
    . . . .

Powyższe wartości zostały wygenerowane przy użyciu prostego skryptu python. Jednak zabrakło mi miejsca na „-”. Musiałem więc skorzystać z bardziej zaawansowanych sztuczek.

Kiedy program wypisuje „)”, wartość komórki nie wynosi 41, to jest 1065. Sześciokąt modyfikuje tylko wartość podczas drukowania. Jak się okazuje, (1065 * 1000 + 4)% 256 = 44, tylko jeden od 45, wartość ascii dla „-”. Następnie po prostu zwiększam, drukuję i wstawiam gdzieś @ po wydrukowaniu.

    . . . .
   . $ ) @ $
  j . . 3 . .
 / . . } . . .
  4 0 0 . 5 \
   . ; . . \
    . . . .
niebieski
źródło
Jak można go nazwać językiem programowania, gdy .j4 /; is ... Print "(" ??? Która część .j4 /; jest drukiem, a która część to ciąg do wydrukowania?
Fogmeister
2
@Fogmeister [Część 1/2] W Hexagony każdy znak alfabetyczny ustawia wartość bieżącej komórki pamięci na wartość ascii tego znaku. „j” ma wartość ascii równą 106, więc taka jest pamięć. Ponadto, a znaki numeryczne mnożą wartość bieżącej komórki przez 10, a następnie dodają się do niej (pozwala to na łatwą budowę liczb, takich jak 61 na początku.
Niebieski
3
[Część 2/2] Zatem j4 ustawia komórkę pamięci na 1064. Gdy adres IP osiągnie „/”, zostanie odzwierciedlony w „;”, który wypisuje znak ascii odpowiadający bieżącej komórce pamięci% 256. 1064% 256 = 40, wartość ascii dla „(”. Mam nadzieję, że to odpowiada na twoje pytanie.
Blue
dzięki. Tak, to działa. Wydaje mi się, że jest to raczej język używany do testowania mózgu. Czy to nie sposób pisania programów? Ciekawy.
Fogmeister,
@Fogmeister istnieje wiele ezoterycznych języków programowania, które są bardziej skręcające mózg niż przydatne do wykonywania prawdziwej pracy, chociaż MOGĄ wykonywać prawdziwą pracę, jeśli wystarczająco się postaracie.
Sparr,
12

Guma cynamonowa, 7 bajtów

0000000: 7043 dc95 6d4f ce                        pC..mO.

Wypróbuj online.

Byłoby 6 bajtów przy starej pskładni: /

Wyjaśnienie

Dekompresuje do p~=~(:)-, a pnastępnie etap po prostu odczytuje dane wejściowe i powtarza =n razy.

spaghetto
źródło
Czy możesz podać link do specyfikacji języka?
Robert Fraser
@RobertFraser Obecnie nie mam formalnej specyfikacji ani żadnej dokumentacji, ale możesz sprawdzić źródło w repozytorium GitHub: github.com/quartata/cinnamon-gum
spaghetto
12

Brian & Chuck , 31 bajtów

,{-?>}-):(=?
#}<<.{?_<.<.<.<.<.

Dane wejściowe w postaci wartości bajtowej , np. Dane wejściowe! dają węża o długości 33.

Wypróbuj online!

Minęło trochę czasu...

Wyjaśnienie

Szybki podkład Brian & Chuck:

  • Pierwsza linia programu to Brian, druga to Chuck.
  • Brian i Chuck są dwoma instancjami podobnymi do Brainfuck. Głównym haczykiem jest to, że program Chucka to taśma Briana i odwrotnie. Głowice taśmy / wskaźniki instrukcji zaczynają się na pierwszej komórce każdej taśmy, a wykonywanie rozpoczyna się na Brianie.
  • Jeśli chodzi o polecenia, istnieje kilka różnic. Tylko Brian może używać ,(dane wejściowe) i tylko Chuck może używać .(dane wyjściowe). Oprócz <i >{i }które przesuwają głowicę taśmy do następnej komórki zerowej (lub w przypadku {lewego końca taśmy, jeśli po drodze nie ma komórki zerowej). Zamiast [...]tego jedynym przepływem kontrolnym jest ?przełączenie sterowania na inne wystąpienie, jeśli bieżąca komórka jest niezerowa. Pierwsza wykonana instrukcja w drugiej komórce to ta po warunku. I na koniec, _to tylko alias dla zerowych bajtów, dla wygody.

Teraz kod. Brian zaczyna od tego:

,{-?

Odczytuje dane wejściowe do pierwszej komórki Chucka, a następnie przesuwa głowicę taśmy w lewo za pomocą {(obecnie nic nie robi) i zmniejsza wartość wejściową -przed przełączeniem kontroli dla Chucka, jeśli wartość jest wciąż niezerowa. To zaczyna główną pętlę. Następnie Chuck uruchamia ten bit:

}<<.{?

To przesuwa głowicę taśmy na Brianie do samego końca, przesuwa dwie komórki w lewo na = i drukuje ją przed głowicą taśmy do końca w lewo i przełącza sterowanie z powrotem na Briana. Tak zwykle działają pętle w B&C.

Gdy wejście zostanie zredukowane do zera, ?taśma Briana nic nie zrobi. Następnie Brian wykonuje tę część:

>}-):(=?

Nie ):(=ma operacji, więc rzeczywisty kod jest po prostu >}-?. Przechodzimy od komórki zerowej za pomocą >, przechodzimy do góry _z }, zmniejszamy ją, aby stała się niezerowa i przełączamy na Chucka za pomocą ?. Następnie uruchamiany jest ostatni bit na Chucku:

<.<.<.<.<.

To po prostu drukuje pięć znaków przed Chuckiem, tj =(:)-. Zauważ, że musimy wydrukować kolejną, =ponieważ główna pętla jest wykonywana tylko N-1razy dla danych wejściowych N.

Martin Ender
źródło
10
Gratulacje na 100 tys.
Szalony
10

V , 8 bajtów

Àé=A(:)-

Wypróbuj online!

V używa kodowania „Latin1”.

Wyjaśnienie:

À        "Arg1 times:
 é=      "Insert an '='
   A(:)- "Append the head
James
źródło
2
@zwei zobacz moją edycję.
James
Rozumiem! Tak lepiej
Zwei,
6

Siatkówka , 10 bajtów

.+
$*=(:)-

Wypróbuj online!

Jest to proste podstawienie wyrażenia regularnego.

Dopasowuje, .+który pasuje do całego wejścia, a następnie zastępuje go $*=(;)-.

Jest $*to unikalna funkcja Retina: jest to specjalny operator powtarzania znaków.

Na przykład 5$*xstałby się xxxxx.

W przypadku braku poprzedniego argumentu jako argument domyślny jest używane całe dopasowanie.

Leaky Nun
źródło
5

Python, 21 bajtów

lambda n:"="*n+"(:)-"

Ideone to!

Leaky Nun
źródło
Możesz wyciąć 3 bajty, wykonując:"="*input()+"(:)-"
gowrath
@gowrath W takim razie nic nie będzie drukować
Leaky Nun
Wyśle go, jeśli jesteś w tłumaczu nie? Op powiedział, że możesz uzyskać wynik w jakikolwiek sposób.
gowrath
@gowrath Nie możesz zakładać, że jesteśmy w REPL
Leaky Nun
Czy to ogólna zasada dla golfa kodowego? Nowy tutaj :)
gowrath
5

Haskell, 25 bajtów

f n=('='<$[1..n])++"(:)-"

'='<$[1..n]jest równoważne z replicate n '='.

Michael Klein
źródło
5

Java 8, 52 bajty

n->new String(new char[n]).replace("\0","=")+"(:)-";

Zestaw testowy. (Kompiluj> Wykonaj)

Kredyty .

tradycyjny sposób, 61 54 53 bajtów

7 bajtów dzięki Kevin Cruijssen.

1 bajt dzięki Dom Hastings.

n->{String s="";for(;n-->0;)s+="=";return s+"(:)-";};
Leaky Nun
źródło
+1 Och, a dla tradycyjnego: for(int i=0;i<n;i++)można grać w golfa for(;n>0;n--), ponieważ i tak nie potrzebujesz wkładu do niczego innego niż for-loop.
Kevin Cruijssen
@KevinCruijssen Dzięki, edytowane
Leaky Nun
Testowanie za pomocą podanego linku wygląda na to, że możesz zmienić pętlę for na: for(;n-->0;)aby zapisać kolejny bajt!
Dom Hastings
@DomHastings edytowane z podziękowaniami
Leaky Nun
4

C, 38

f(n){for(;n--;printf(n?"=":"=(:)-"));}

Wypróbuj na ideone.

owacoder
źródło
1
Nie krócej, ale chłodniej: f(n){~-printf(n?"=":"=(:)-")||f(~-n);}.
orlp
f(n){for(;n;printf(n--?"=":"(:)-"));}Za 1.
Erik the Outgolfer
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ - To nie generuje głowy.
owacoder
@owacoder C, C nie jest moim podstawowym językiem ...
Erik the Outgolfer
1
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ I dlatego nie powinieneś publikować niesprawdzonych sugestii dotyczących gry w golfa (szczególnie jeśli zajęłoby ci to 5 sekund na przetestowanie swojej sugestii za pomocą linku podanego w odpowiedzi).
Martin Ender
4

05AB1E, 10 9 bajtów

'=×"ÿ(:)-

Wyjaśnienie

'=         # push equal-sign
  ×        # repeat input nr of times
   "ÿ(:)-  # interpolate snake body with head as a string
           # implicitly display

Wypróbuj online

1 bajt zapisany dzięki Adnan.

Emigna
źródło
'=×"ÿ(:)-za 9 bajtów :). Używa interpolacji ciągów.
Adnan
1
@Adnan: Aaah, więc to właśnie ÿdziała :)
Emigna
4

JavaScript, 23 bajty

n=>"=".repeat(n)+"(:)-"
eithed
źródło
1
Właśnie miałem opublikować dokładnie ten kod! Pokonaj mnie! Głosuj
MayorMonty
Dzisiaj dowiedziałem się o funkcjach strzałek . Dziękuję Ci. Nie wiedziałem, że to jest coś
bobkingof12vs
Jak wywołać tę instancję funkcji? Właśnie próbowałem n(3)i otrzymałem Uncaught ReferenceError: n is not definedbłąd ...
WallyWest
@WallyWest - tryx=n=>"=".repeat(n)+"(:)-"; x(7);
eithed
@eithedog Czy odpowiedź nie powinna mieć początkowej x=i zmienionej na 25 znaków?
WallyWest,
4

C #, 28 bajtów

n=>new string('=',n)+"(:)-";
TheLethalCoder
źródło
zawsze interesują mnie fragmenty lambda. jak możesz to uruchomić?
downrep_nation
@ downrep_nation przyjmuje int i automatycznie zwraca ciąg, ponieważ jest to tylko jedna instrukcja
TheLethalCoder
Odpowiedzią powinien być pełny program lub funkcja, a nie tylko fragment kodu. Ta odpowiedź wydaje się niepełna.
raznagul
@raznagul Jest to funkcja anonimowa, dlatego jest kompletna
TheLethalCoder
@TheLethalCoder: Może spróbuj link online pomoże to zrozumieć. ( csharppad.com )
Raznagul
4

Python , 24 bajty.

print"="*input()+"(:)-"

input() pobiera dane wejściowe od użytkownika

*, użyte w ciągach znaków i liczbach całkowitych, tworzy nowy ciąg znaków, który składa się z połączonych kopii oryginału. Na przykład: "hello "*3wyjścia hello hello hello.

Po pomnożeniu =i input()otrzymujesz ciąg o =długości określonej przez użytkownika.

Za pomocą +łączy dwa sznurki, w tym przypadku nasze ciało "=…="z głową, "(:)-"aby stworzyć węża.

print wyprowadza wynik.

ja..
źródło
3

GolfScript, 11 10 bajtów

~"="*"(:)-"

Mnoży „=” przez dane wejściowe i dodaje nagłówek.

-1 dzięki Leaky Nun

Nikogo tu nie ma
źródło
3

Mathematica, 21 20 bajtów

"="~Table~#<>"(:)-"&

Funkcja anonimowa. Pobiera liczbę n jako dane wejściowe i zwraca węża długości n jako dane wyjściowe. "="~Table~#generuje listę {"=", "=", ..., "="}długości n , <>"(:)-"łączy elementy listy i dołącza "(:)-"do powstałego ciągu.

LegionMammal978
źródło
1
golfable o jeszcze jeden bajt:"="~Table~#<>"(:)-"&
LLlAMnYP
3

R, 32 27 bajtów

To rozwiązanie jest dość proste, repfunkcja powtarza pierwszy element ( "=") scan()razy, co w rzeczywistości jest wkładem użytkownika.

a=scan();cat(rep("=",a),"(:)-")

EDYCJA :

cat(rep("=",scan()),"(:)-")

Nieco krótsza odpowiedź, przy użyciu scan()bezpośrednio.

Alternatywnie,

cat(rep("=",scan()),"(:)-",sep="")

dla niepociętego węża ( 34 bajty )

Frédéric
źródło
Chciałbym powiedzieć, że sep=""tutaj jest potrzebna, inaczej wygląda snake jak ten, który przemierzał kolejowej: = = = (:)-.
manatwork
Wytworzony tutaj wąż jest wprawdzie nieco rozdrobniony, ale przesyłki OP wskazują jedynie, że długość węża to liczba znaków równości przed głową. Dodam jednak sepjako notatkę dodatkową;)
Frédéric
3

Partia, 68 bajtów

@set h=(:)-
@for /l %%i in (1,1,%1)do @call set h==%%h%%
@echo %h%
Neil
źródło
2

CJam, 13 11 bajtów

qi'=*"(:)-"

Sprawdź to tutaj.

-2 bajty dzięki quartata

acrolith
źródło
Możesz zrobić '=*zamiast {'=}*.
spaghetto
2

Perl 6 ,  16 15  12 bajtów

{"{'='x$_}(:)-"}
{'='x$_~'(:)-'}
'='x*~'(:)-'

Wyjaśnienie:

'=' x * # 「=」 string repeated by the only parameter 「*」
~        # concatenated with
'(:)-'   # the head

Stosowanie:

# store it in the lexical namespace
my &snake = '='x*~'(:)-';

put snake 10;

# put ^5 .map: &snake;
put ^5 .map: '='x*~'(:)-';
==========(:)-
(:)- =(:)- ==(:)- ===(:)- ====(:)- =====(:)-
Brad Gilbert b2gills
źródło
2

JAISBaL , 9 bajtów

t=*Qb(:)-

Gadatliwy:

# \# enable verbose parsing #\
push1 =        \# push = onto the stack #\
mul            \# multiply the top two values of the stack #\
popout         \# pop the top value of a stack and print it #\
print4 (:)-    \# print (:)- #\

Testowane z JAISBaL-0.0.7 ( Skompilowany plik .jar został właśnie wypchnięty, ale źródło jest już dostępne na git)

Socratic Phoenix
źródło
Użyj #przed nazwą języka, aby wyglądała jak nazwa każdego innego.
Michael Klein,
@MichaelKlein w porządku
Socratic Phoenix
2

PowerShell v2 +, 19 bajtów

'='*$args[0]+'(:)-'

Pełny program Pobiera dane wejściowe $args[0], używa mnożenia struny do budowy ciała, a następnie konkatenacji struny w celu przyczepienia do głowy.

PS C:\Tools\Scripts\golfing> .\snakes-all-around.ps1 7
=======(:)-

PS C:\Tools\Scripts\golfing> .\snakes-all-around.ps1 77
=============================================================================(:)-
AdmBorkBork
źródło
Uznanie dla ciebie, mam aż 26:"$("="*[int]$args[0])(:)-"
Chirishman
2

DO, 46 45 43 bajty

zapisane 2 bajty dzięki owacoder! zapisane 3 bajty dzięki rici!

f(n){while(4-printf("=\0(:)-"+2*!n--));}

Wypróbuj na Ideone!

betseg
źródło
3
Tajemniczy -->operator uderza ponownie.
Leaky Nun
@LeakyNun Wersja 46 bajtów nie była przeznaczona dla operatora, niż pamiętałam dla operatora;)
betseg
1
Możesz usunąć >0i zapisać dwa bajty.
owacoder
Nieco krótszy:f(n){while(4-printf("=\0(:)-"+2*!n--));}
rici
2

Cheddar, 15 bajtów (niekonkurencyjny)

n->'='*n+'(:)-'

Prosta odpowiedź.

Deimos
źródło
1

Sesos , 11 bajtów

Hexdump:

0000000: aaaa5e a0f7b4 ed4cee 5d3b                         ..^....L.];

Wypróbuj online!

Monter:

set numin
add 61
fwd 1
get
jmp,sub 1,rwd 1,put,fwd 1,jnz
add 40,put
rwd 1,sub 3,put
fwd 1,add 1,put
add 4,put
Leaky Nun
źródło
1

K, 17 bajtów

{,[x#"=";"(:)-"]}

Przykład;

f:{,[x#"=";"(:)-"]}
-1(f'!10);          /print out the result of calling f where x is 0 1 2 3 4 5....
(:)-
=(:)-
==(:)-
===(:)-
====(:)-
=====(:)-
======(:)-
=======(:)-
========(:)-
=========(:)-

Wyjaśnienie;

{}                 /function x is implicit and is an int
x#"="              /take (#) x of "=" --> so 3#"=" gives "==="
,[x#"=";"(:)-"]    /comma is a join that takes 2 args --> ,[x;y] gives the concatination of x and y --> "a","abc" is the same as ,["a";"abc"] and gives "aabc"
Chromozorz
źródło
Co to jest -1(... );?
Adám
Zapisz bajt:{(x#"="),"(:)-"}
Adám
Dzięki Adam. -1 Drukuje na konsoli. -1 „Cześć”; wydrukuje Witam
Chromozorz
Ale czy druk nie jest domyślny?
Adám
Tak, ale zawiera podwójne cudzysłowy ... "==== (:) -" zamiast; ===== (:) -
Chromozorz
1

Perl, 16 + 1 ( -pflaga) = 17 bajtów

$_="="x$_."(:)-"

Potrzebuje -pflagi, więc uruchom z:

perl -pe '$_="="x$_."(:)-"'
Dada
źródło
1

Minkolang 0,15 , 12 bajtów

"=(:)-"nD$O.

Wypróbuj tutaj!

Wyjaśnienie

"=(:)-"         Push this to the stack in reverse order - ["-",")",":","(","="]
       n        Take number from input
        D       Pop k and duplicate top of stack (the "=") k times
         $O.    Output whole stack as characters and stop.
El'endia Starman
źródło
1

Befunge-98, 24 bajty

Pobiera dane liczbowe od użytkownika, a następnie drukuje węża.

'=&:00pk:00gk,"-):("4k,@
owacoder
źródło
1

Matlab / Octave, 22 bajty

@(n)[~(1:n)+61 '(:)-']

To anonimowa funkcja.

Wypróbuj na Ideone .

Wyjaśnienie

Załóżmy n= 5.

1:ntworzy wektor wiersza [1 2 3 4 5].

~(1:n)neguje każdy wpis, więc daje [0 0 0 0 0].

...+61dodaje 61do każdego wpisu, więc daje [61 61 61 61 61]. 61to wartość ASCII znaku =.

[... '(:)-']łączy to z łańcuchem '(:)-'. To automatycznie konwertuje [61 61 61 61 61]na ciąg '====='przed konkatenacją.

Luis Mendo
źródło