Schlangen ringsum


12

Herausforderung

Die Herausforderung ist einfach: Drucken Sie eine Schlange .
Sie erhalten die Länge der Schlange als Eingabe.
Eine Schlange der Länge 2 sieht so aus:

==(:)-

Eine Schlange der Länge 7 sieht so aus:

=======(:)-

Mit anderen Worten, die Länge einer Schlange gibt an, wie viele Gleichheitszeichen sich vor dem Kopf befinden .

Verwendung

Nehmen wir an, ich habe eine C ++ - Implementierung erstellt und in kompiliert ./getsnake.
Ich könnte es so laufen lassen:

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

Klarstellungen

  • Standardlücken sind nicht zulässig.
  • Sie können Eingaben und Ausgaben auf jede akzeptable Weise erhalten.
  • Sie können davon ausgehen, dass alle angegebenen Eingaben positive ganze Zahlen sind.
  • Sie können eine Funktion anstelle eines normalen Programms schreiben.

8
Es ist irgendwie nutzlos, nur eine halbe Stunde lang eine Herausforderung in der Sandbox zu lassen. Sie haben ein Feedback erhalten, aber es ist normalerweise am besten, es 24 bis 72 Stunden in der Sandbox zu belassen. (Außerdem sollten Sie entweder den Teil "Origins"
ausarbeiten

Ist eine Funktion ausreichend oder möchten Sie ein vollständiges Programm?
Betseg

@ Betseg-Funktion ist genug
InitializeSahib

4
Ich fürchte, alle Antworten von My Squiggly Lamp lassen sich mühelos darauf übertragen.
Manatwork

3
Negative Ganzzahlen sollten bewirken, dass sich die Schlange selbst verschluckt.
GuitarPicker

Antworten:


18

Hexagony , 33 Bytes

Nicht gewinnen, aber trotzdem cool. Könnte in der Lage sein, mehr Golf zu spielen.

Probieren Sie es online!

Golf gespielt:

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

Formatiert:

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

Bunt (Mit Timwis Hexagony Colorer hergestellt )

Du hast da einen geheimen Snek gefunden!  ======= (:) -

Erläuterung:

Schleife, drucke "=" aus, bis der Zähler 0 erreicht.

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

Drucken "("

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

Drucken ":"

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

Drucken ")"

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

Die obigen Werte wurden mit einem einfachen Python-Skript generiert. Allerdings hatte ich irgendwie keinen Platz mehr für das "-". Also musste ich auf fortgeschrittenere Tricks zurückgreifen.

Wenn das Programm ")" ausgibt, ist der Wert der Zelle nicht 41, sondern 1065. Hexagony ändert nur den Wert beim Drucken. Wie sich herausstellt, ist (1065 * 1000 + 4)% 256 = 44, nur eins von 45 entfernt, der ASCII-Wert für "-". Dann inkrementiere, drucke und füge irgendwo nach dem Drucken ein @ ein.

    . . . .
   . $ ) @ $
  j . . 3 . .
 / . . } . . .
  4 0 0 . 5 \
   . ; . . \
    . . . .

Wie kann es eine Programmiersprache genannt werden, wenn .j4 /; ist ... Print "(" ??? Welcher Teil von .j4 /; ist der Druck und welcher Teil ist die Zeichenfolge zu drucken?
Fogmeister

2
@Fogmeister [Teil 1/2] In Hexagony setzt ein beliebiges alphabetisches Zeichen den Wert der aktuellen Speicherzelle auf den ASCII-Wert dieses Zeichens. "j" hat einen ASCII-Wert von 106, daher ist der Speicher auf diesen Wert eingestellt. Außerdem multiplizieren numerische Zeichen den Wert der aktuellen Zelle mit 10 und addieren sich dann dazu (dies ermöglicht die einfache Konstruktion von Zahlen wie der 61 am Anfang.
Blau

3
[Teil 2/2] Also setzt j4 die Speicherzelle auf 1064. Wenn die IP das "/" erreicht, wird sie in ";" reflektiert, was das ASCII-Zeichen ausgibt, das der aktuellen Speicherzelle% 256 entspricht. 1064% 256 = 40, der ASCII-Wert für "(". Ich hoffe, dies beantwortet Ihre Frage.
Blau

Vielen Dank. Ja, tut es. Ich denke, dies ist eher eine Sprache, mit der man sein Gehirn testen kann. Anstatt also Programme zu schreiben? Interessant.
Fogmeister

@Fogmeister Es gibt viele esoterische Programmiersprachen, die mehr Gehirn-Drehungsübungen als nützliche für echte Arbeit sind, obwohl sie echte Arbeit leisten KÖNNEN, wenn Sie sich anstrengen.
Sparr

12

Zimtgummi, 7 Bytes

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

Probieren Sie es online aus.

Wäre 6 Bytes mit der alten pSyntax gewesen: /

Erläuterung

Dekomprimiert auf p~=~(:)-, die pBühne liest dann einfach die Eingabe und wiederholt die =n-mal.


Können Sie dazu eine Sprachangabe verlinken?
Robert Fraser

@RobertFraser Ich habe derzeit keine formale Spezifikation oder Dokumentation, aber Sie können die Quelle im GitHub-Repo nachlesen : github.com/quartata/cinnamon-gum
a spaghetto

12

Brian & Chuck , 31 Bytes

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

Eingabe in Form eines Byte-Wertes , also zB Eingabe !einer Schlange der Länge 33.

Probieren Sie es online!

Es ist eine Weile her...

Erläuterung

Eine kurze Einführung von Brian & Chuck:

  • Die erste Zeile des Programms ist Brian, die zweite ist Chuck.
  • Brian und Chuck sind zwei Brainfuck-ähnliche Instanzen. Der Hauptfang ist, dass Chucks Programm Brians Tape ist und umgekehrt. Die Bandköpfe / Anweisungszeiger beginnen in der ersten Zelle jedes Bandes und die Ausführung beginnt bei Brian.
  • Bei den Befehlen gibt es einige Unterschiede. Nur Brian kann ,(Input) und nur Chuck kann .(Output) verwenden. Zusätzlich zu <und >gibt es {und }die den Bandkopf bis zur nächsten Nullzelle bewegen (oder im Falle des {linken Bandendes, wenn keine Nullzelle unterwegs ist). Stattdessen [...]ist der einzige Kontrollfluss? die Steuerung auf die andere Instanz umschaltet, wenn die aktuelle Zelle nicht Null ist. Der erste ausgeführte Befehl in der anderen Zelle ist der nach der Bedingung. Und schließlich _ist es aus Bequemlichkeitsgründen nur ein Alias ​​für Null-Bytes.

Nun der Code. Brian beginnt damit:

,{-?

Dies liest die Eingabe in die erste Zelle von Chuck, bewegt dann den Bandkopf mit nach links {(macht im Moment nichts) und dekrementiert die Eingabe mit, -bevor die Steuerung für Chuck umgeschaltet wird, wenn der Wert immer noch ungleich Null ist. Dies beginnt die Hauptschleife. Chuck führt dann dieses Bit aus:

}<<.{?

Dies bewegt den Bandkopf auf Brian bis zum Ende, verschiebt zwei Zellen nach links auf den = Kopf und vor dem Bandkopf ganz nach links gedruckt und die Steuerung wieder auf Brian umgestellt. So funktionieren Schleifen im Allgemeinen in B & C.

Sobald die Eingabe auf Null reduziert wurde, wird das Band ?von Brian nichts mehr tun. Dann führt Brian diesen Teil aus:

>}-):(=?

Das ):(=sind No-Ops, also ist der eigentliche Code gerecht >}-?. Wir bewegen uns weg von der Null - Zelle mit >, nach oben zu _mit }, verringern sie es nicht Null und Schalter auf Chuck machen mit ?. Dann wird das letzte Bit von Chuck ausgeführt:

<.<.<.<.<.

Dies druckt einfach die fünf Zeichen vor Chuck, dh =(:)-. Beachten Sie, dass wir einen anderen drucken müssen, =da die Hauptschleife nur N-1zu Eingabezeiten ausgeführt wird N.


10
Herzlichen Glückwunsch zu 100k
Insane


6

Netzhaut , 10 Bytes

.+
$*=(:)-

Probieren Sie es online!

Dies ist eine einfache Regex-Ersetzung.

Es stimmt überein, .+was der gesamten Eingabe entspricht, und ersetzt sie dann durch$*=(;)- .

Das $*ist ein einzigartiges Merkmal in Retina: es ist der Charakter-Wiederholung spezielle Operator.

Zum Beispiel 5$*xwürde werden xxxxx.

Wenn das vorherige Argument fehlt, wird die gesamte Übereinstimmung als Standardargument verwendet.


5

Python, 21 Bytes

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

Ideone es!


Sie können 3 Bytes schneiden, indem Sie tun:"="*input()+"(:)-"
Gowrath

@gowrath Dann wird es nichts drucken
Leaky Nun

Es wird es ausgeben, wenn Sie im Interpreter nicht sind? Op sagte, Sie können auf jede Art und Weise ausgegeben werden.
Gowrath

@gowrath Sie können nicht davon ausgehen, dass wir in REPL
Leaky Nun

Ist das eine allgemeine Regel für das Code-Golfen? Neu hier :)
Gowrath

5

Haskell, 25 Bytes

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

'='<$[1..n]ist äquivalent zu replicate n '='.


5

Java 8, 52 Bytes

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

Testsuite. (Übersetzen> Ausführen)

Credits .

die traditionelle Art, 61 54 53 Bytes

7 Bytes dank Kevin Cruijssen.

1 Byte danke an Dom Hastings.

n->{String s="";for(;n-->0;)s+="=";return s+"(:)-";};

+1 Oh, und für den traditionellen: for(int i=0;i<n;i++)kann man golfen for(;n>0;n--), da man den Input sowieso für nichts anderes als die for-Schleife braucht.
Kevin Cruijssen

@ KevinCruijssen Dank, bearbeitet
Leaky Nun

Beim Testen über den von Ihnen angegebenen Link können Sie die for-Schleife folgendermaßen ändern: for(;n-->0;)um ein weiteres Byte zu speichern!
Dom Hastings

@ DomHastings bearbeitet mit Dank
Leaky Nun


4

C 38

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

Probiere es auf ideone aus.


1
Nicht kürzer, aber kühler: f(n){~-printf(n?"=":"=(:)-")||f(~-n);}.
Orlp

f(n){for(;n;printf(n--?"=":"(:)-"));}für 1.
Erik der Outgolfer

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ - Das gibt den Kopf nicht aus.
Owacoder

@owacoder Nun, C ist nicht meine Hauptsprache ...
Erik der Outgolfer

1
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Und deshalb sollten Sie nicht ungetestete Golfvorschläge posten (insbesondere, wenn Sie 5 Sekunden gebraucht hätten, um Ihren Vorschlag mit dem in der Antwort angegebenen Link zu testen).
Martin Ender

4

05AB1E, 10 9 Bytes

'=×"ÿ(:)-

Erläuterung

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

Probieren Sie es online aus

1 Byte gespart dank Adnan.


'=×"ÿ(:)-für 9 Bytes :). Dies verwendet Zeichenketteninterpolation.
Adnan

1
@ Adnan: Aaah, so ist das, was ÿtut :)
Emigna

4

Javascript, 23 Bytes

n=>"=".repeat(n)+"(:)-"

1
Ich wollte gerade genau diesen Code posten! Schlagen Sie mich dazu! Positiv bewertet
MayorMonty

Heute habe ich etwas über Pfeilfunktionen gelernt . Vielen Dank.
Wusste

Wie nennt man diese Instanz der Funktion? Ich habe gerade versucht n(3)und eine Uncaught ReferenceError: n is not definedFehlermeldung erhalten ...
WallyWest

@WallyWest - tryx=n=>"=".repeat(n)+"(:)-"; x(7);
eithed

@eithedog Sollte die Antwort dann nicht die Initiale haben x=und auf 25 Zeichen geändert werden?
WallyWest

4

C #, 28 Bytes

n=>new string('=',n)+"(:)-";

Ich bin immer an den Lambda-Schnipsel interessiert. Wie kannst du das überhaupt machen?
Downrep_nation

@downrep_nation nimmt ein int auf und gibt den String automatisch zurück, da es sich nur um eine Anweisung handelt
TheLethalCoder

Die Antwort sollte ein vollständiges Programm oder eine Funktion sein, nicht nur ein Ausschnitt. Diese Antwort scheint also unvollständig zu sein.
Rasnagul

@raznagul Dies ist eine anonyme Funktion, daher ist sie vollständig
TheLethalCoder

@TheLethalCoder: Vielleicht würde ein Online-Link helfen, es zu verstehen. ( csharppad.com )
raznagul

4

Python , 24 Bytes.

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

input() wird vom Benutzer eingegeben

*Bei Verwendung für Zeichenfolgen und eine Ganzzahl wird eine neue Zeichenfolge erstellt, die aus verbundenen Kopien des Originals besteht. Zum Beispiel: "hello "*3Ausgänge hello hello hello.

Durch Multiplizieren von =und erhalten input()Sie eine Zeichenfolge mit =der vom Benutzer angegebenen Länge.

Mit +verbindet man zwei Fäden, in diesem Fall unseren Körper "=…="mit unserem Kopf, "(:)-"um die Schlange zu machen.

print gibt das Ergebnis aus.


3

GolfScript, 11 10 Bytes

~"="*"(:)-"

Multipliziert "=" mit der Eingabe und fügt head hinzu.

-1 dank Leaky Nun


3

Mathematica, 21-20 Bytes

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

Anonyme Funktion. Nimmt eine Zahl n als Eingabe und gibt eine Schlange der Länge n als Ausgabe zurück. "="~Table~#generiert eine Liste mit {"=", "=", ..., "="}der Länge n , <>"(:)-"verknüpft die Elemente der Liste und hängt sie "(:)-"an die resultierende Zeichenfolge an.


1
Golf um ein weiteres Byte:"="~Table~#<>"(:)-"&
LLlAMnYP

3

R 32 27 Bytes

Diese Lösung ist ziemlich unkompliziert. Die repFunktion wiederholt das erste Element ( "=") scan()mal, was tatsächlich die Eingabe des Benutzers ist.

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

EDIT :

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

Etwas kürzere Antwort mit scan() direkt.

Alternative,

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

für eine nicht gehackte Schlange ( 34 Bytes )


Ich würde sagen , das sep=""hier gebraucht wird, sonst Ihre Schlange aussieht wie die, dass die Bahn durchquert: = = = (:)-.
Handarbeit

Die hier produzierte Schlange ist in der Tat ein bisschen zerkleinert, aber die OPs geben nur an, dass die Länge der Schlange die Anzahl der Gleichheitszeichen vor dem Kopf ist. Ich werde das septrotzdem als Randnotiz hinzufügen ;)
Frédéric

3

Batch, 68 Bytes

@set h=(:)-
@for /l %%i in (1,1,%1)do @call set h==%%h%%
@echo %h%


2

Perl 6,  16 15  12 bytes

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

Explanation:

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

Usage:

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

put snake 10;

# put ^5 .map: &snake;
put ^5 .map: '='x*~'(:)-';
==========(:)-
(:)- =(:)- ==(:)- ===(:)- ====(:)- =====(:)-

2

JAISBaL, 9 bytes

t=*Qb(:)-

Verbose:

# \# 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 (:)- #\

Tested with JAISBaL-0.0.7 (The compiled .jar was just pushed, but the source has been up on git for a while)


Use a # before the language name to make it look like everybody else's.
Michael Klein

@MichaelKlein okay
Socratic Phoenix

2

PowerShell v2+, 19 bytes

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

Full program. Takes input $args[0], uses string multiplication to construct the body, then string concatenation to tack on the head.

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

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

Kudos to you, I got as far as 26: "$("="*[int]$args[0])(:)-"
Chirishman

2

C, 46 45 43 bytes

saved 2 bytes thanks to owacoder! saved 3 bytes thanks to rici!

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

Try it on Ideone!


3
The mysterious --> operator strikes again.
Leaky Nun

@LeakyNun 46 bytes version was without the goes to operator, than I remembered the goes to operator ;)
betseg

1
You can remove the >0 and save two bytes.
owacoder

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

2

Cheddar, 15 bytes (noncompeting)

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

A straightforward answer.


1

Sesos, 11 bytes

Hexdump:

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

Try it online!

Assembler:

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 Bytes

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

Example;

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

Explanation;

{}                 /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"

What is -1(...);?
Adám

Save a byte: {(x#"="),"(:)-"}
Adám

Thanks Adam. -1 Prints to the console. -1"Hello"; will print Hello
Chromozorz

But isn't printing implicit?
Adám

Yes but it includes the double quotes... "====(:)-" rather than; =====(:)-
Chromozorz

1

Perl, 16 + 1 (-p flag) = 17 bytes

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

Needs -p flag, so run with :

perl -pe '$_="="x$_."(:)-"'

1

Minkolang 0.15, 12 bytes

"=(:)-"nD$O.

Try it here!

Explanation

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

Takes numerical input from the user, then prints the snake.

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

1

Matlab / Octave, 22 bytes

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

This is an anonymous function.

Try it on Ideone.

Explanation

Assume n= 5.

1:n produces the row vector [1 2 3 4 5].

~(1:n) negates each entry, so it gives [0 0 0 0 0].

...+61 adds 61 to each entry, so it gives [61 61 61 61 61]. 61 is the ASCII value of character =.

[... '(:)-'] concatenates that with the string '(:)-'. This automatically converts [61 61 61 61 61] into the string '=====' before the concatenation.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.