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.

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 \
   . ; . . \
    . . . .

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.


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 >są {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.


10
Gratulacje na 100 tys.
— Szalony


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.


5

Python, 21 bajtów

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

Ideone to!


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 '='.


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+"(:)-";};

+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.


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.


'=×"ÿ(:)-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)+"(:)-"

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)+"(:)-";

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.


3

GolfScript, 11 10 bajtów

~"="*"(:)-"

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

-1 dzięki Leaky Nun


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.


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 )


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%


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*~'(:)-';
==========(:)-
(:)- =(:)- ==(:)- ===(:)- ====(:)- =====(:)-

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)


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
=============================================================================(:)-

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!


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ź.


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

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"

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$_."(:)-"'

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.

1

Befunge-98, 24 bajty

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

'=&:00pk:00gk,"-):("4k,@

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ą.

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.