Serpenti tutt'intorno


12

Sfida

La sfida è semplice: stampare un serpente .
Otterrai la lunghezza del serpente come input.
Un serpente di lunghezza 2 si presenta così:

==(:)-

Un serpente di lunghezza 7 si presenta così:

=======(:)-

In altre parole, la lunghezza di un serpente è quanti segni uguali ci sono davanti alla testa .

uso

Diciamo che ho fatto un'implementazione C ++ e l'ho compilata ./getsnake.
Potrei eseguirlo in questo modo:

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

chiarimenti

  • Le scappatoie standard non sono ammesse.
  • È possibile ottenere input e output in qualsiasi modo accettabile.
  • Puoi presumere che tutti gli input dati siano numeri interi positivi.
  • È possibile scrivere una funzione anziché un normale programma.

8
È quasi inutile lasciare una sfida nella Sandbox per solo mezz'ora. Hai ricevuto un feedback, ma di solito è meglio lasciarlo nella Sandbox per 24-72 ore. (Inoltre, dovresti
arricchire la

Una funzione è sufficiente o vuoi un programma completo?
betseg,

La funzione @betseg è sufficiente
InitializeSahib

4
Temo che tutte le risposte di My Squiggly Lamp siano facilmente trasportabili.
arte

3
I numeri interi negativi dovrebbero far deglutire il serpente.
GuitarPicker,

Risposte:


18

Esagonia , 33 byte

Non vincerò, ma sarà comunque fico. Potrebbe essere in grado di ottenere più golf.

Provalo online!

golfed:

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

formattato:

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

Colorato (realizzato con Timex's Hexagony Colorer )

hai trovato da segreto snek!  ======= (:) -

Spiegazione:

Ripeti, stampa "=" fino a quando il contatore raggiunge 0.

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

Stampa "("

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

Stampa ":"

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

Stampa ")"

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

I valori sopra sono stati generati utilizzando un semplice script Python. Tuttavia, ho quasi esaurito lo spazio per il "-". Quindi, ho dovuto ricorrere a trucchi più avanzati.

Quando il programma stampa ")", il valore della cella non è 41, è 1065. Hexagony modifica il valore durante la stampa. A quanto pare, (1065 * 1000 + 4)% 256 = 44, a solo uno di distanza da 45, il valore ASCII per "-". Quindi, ho solo incrementare, stampare e inserire un @ da qualche parte dopo la stampa.

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

Come può essere chiamato un linguaggio di programmazione quando .j4 /; is ... Print "(" ??? Quale parte di .j4 /; è la stampa e quale parte è la stringa da stampare?
Fogmeister

2
@Fogmeister [Parte 1/2] In Hexagony, qualsiasi carattere alfabetico imposta il valore della cella di memoria corrente sul valore ASCII di quel carattere. "j" ha un valore ASCII di 106, quindi questo è ciò su cui è impostata la memoria. Inoltre, i caratteri numerici moltiplicano il valore della cella corrente per 10, quindi si aggiungono ad essa (ciò consente una facile costruzione di numeri, come il 61 all'inizio.
Blu

3
[Parte 2/2] Quindi, j4 imposta la cella di memoria su 1064. Quando l'IP raggiunge "/", si riflette in ";", che stampa il carattere ascii corrispondente alla cella di memoria corrente% 256. 1064% 256 = 40, il valore ascii per "(". Spero che questo risponda alla tua domanda.
Blu

Grazie. Sì lo fa. Immagino che questo sia più di un linguaggio da usare come modo per testare il tuo cervello. Piuttosto che un modo per scrivere programmi allora? Interessante.
Nebbia

@Fogmeister ci sono molti linguaggi di programmazione esoterici che sono più esercizi per attorcigliare il cervello che utili per fare un vero lavoro, anche se POSSONO fare un vero lavoro se ci provi abbastanza.
Sparr

12

Gomma alla cannella, 7 byte

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

Provalo online.

Sarebbe stato di 6 byte con la vecchia psintassi: /

Spiegazione

Decomprime p~=~(:)-, lo pstage legge semplicemente l'input e ripete =n volte.


Puoi collegarti alle specifiche della lingua per questo?
Robert Fraser,

@RobertFraser Non ho una specifica formale o alcuna documentazione al momento, ma puoi controllare l'origine nel repository GitHub: github.com/quartata/cinnamon-gum
a spaghetto

12

Brian e Chuck , 31 byte

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

Inserire sotto forma di a valore byte , quindi ad esempio input !dà un serpente di lunghezza 33.

Provalo online!

È passato un po 'di tempo...

Spiegazione

Un rapido primer Brian & Chuck:

  • La prima riga del programma è Brian, la seconda è Chuck.
  • Brian e Chuck sono due esempi simili a Brainfuck. Il problema principale è che il programma di Chuck è il nastro di Brian e viceversa. I puntatori / istruzioni del nastro iniziano sulla prima cella di ogni nastro e l'esecuzione inizia su Brian.
  • Per quanto riguarda i comandi, ci sono alcune differenze. Solo Brian può usare ,(input) e solo Chuck può usare .(output). Oltre a <e >ci sono {e }che spostano la testa del nastro nella cella zero successiva (o nel caso {dell'estremità sinistra del nastro se non ci sono celle zero sulla strada). Invece [...], l'unico flusso di controllo è quello ?che commuta il controllo sull'altra istanza se la cella corrente è diversa da zero. La prima istruzione eseguita sull'altra cella è quella dopo la condizione. E infine, _è solo un alias per null-byte, per comodità.

Ora il codice. Brian inizia con questo:

,{-?

Questo legge l'input nella prima cella di Chuck, quindi sposta la testina a sinistra con {(non fa nulla in questo momento) e diminuisce l'input con -prima di cambiare il controllo per Chuck se il valore è ancora diverso da zero. Questo inizia il ciclo principale. Chuck quindi esegue questo bit:

}<<.{?

Questo sposta la testina su Brian fino alla fine, sposta due celle a sinistra sul = e la stampa davanti alla testina completamente a sinistra e riportando il controllo su Brian. Ecco come funzionano generalmente i loop in B&C.

Una volta che l'input è stato ridotto a zero, il ?nastro di Brian non farà nulla. Quindi Brian esegue questa parte:

>}-):(=?

Non ci ):(=sono operazioni, quindi il codice effettivo è giusto >}-?. Spostiamo la cella zero con >, spostiamo su _con }, diminuiamo per renderla diversa da zero e passiamo a Chuck con ?. Quindi viene eseguito l'ultimo bit su Chuck:

<.<.<.<.<.

Questo stampa semplicemente i cinque personaggi di fronte a Chuck, cioè =(:)-. Si noti che è necessario stamparne un altro =poiché il ciclo principale viene eseguito solo N-1per i tempi di input N.


10
Congratulazioni per 100k
Insane


6

Retina , 10 byte

.+
$*=(:)-

Provalo online!

Questa è una semplice sostituzione regex.

Corrisponde a quello .+corrispondente all'intero input, quindi lo sostituisce con $*=(;)-.

Questa $*è una caratteristica unica in Retina: è l'operatore speciale di ripetizione del personaggio.

Ad esempio, 5$*xsarebbe diventato xxxxx.

Nel caso in cui l'argomento precedente sia assente, l'intera corrispondenza viene utilizzata come argomento predefinito.



5

Haskell, 25 byte

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

'='<$[1..n]è equivalente a replicate n '='.


5

Java 8, 52 byte

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

Suite di test. (Compila> Esegui)

Credits .

il modo tradizionale, 61 54 53 byte

7 byte grazie a Kevin Cruijssen.

1 byte grazie a Dom Hastings.

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

+1 Oh, e per quello tradizionale: for(int i=0;i<n;i++)può essere giocato a golf for(;n>0;n--), dal momento che non è necessario l'input per nient'altro che il for-loop.
Kevin Cruijssen,

Grazie @KevinCruijssen, a cura
Leaky Nun

Effettuando il test tramite il link fornito, sembra che sia possibile modificare il ciclo for in: for(;n-->0;)per salvare un altro byte!
Dom Hastings,

@DomHastings modificato con ringraziamenti
Leaky Nun


4

C, 38

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

Provalo su ideone.


1
Non più breve, ma più fresco: f(n){~-printf(n?"=":"=(:)-")||f(~-n);}.
orlp

f(n){for(;n;printf(n--?"=":"(:)-"));}per -1.
Erik the Outgolfer

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ - Questo non emette la testa.
owacoder,

@owacoder Beh, C non è la mia lingua principale ...
Erik the Outgolfer

1
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Ed è per questo che non dovresti pubblicare suggerimenti di golf non testati (specialmente se ti ci sarebbero voluti 5 secondi per testare il tuo suggerimento con il link fornito nella risposta).
Martin Ender,

4

05AB1E, 10 9 byte

'=×"ÿ(:)-

Spiegazione

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

Provalo online

1 byte salvato grazie ad Adnan.


'=×"ÿ(:)-per 9 byte :). Questo utilizza l'interpolazione di stringhe.
Adnan,

1
@Adnan: Aaah, quindi è quello che ÿfa :)
Emigna,

4

Javascript, 23 byte

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

1
Stavo per pubblicare esattamente quel codice! Sconfiggimi! Avere un
voto

Oggi ho imparato a conoscere le funzioni delle frecce . Grazie. Non sapevo che fosse una cosa
bobkingof12vs

Come si chiama quell'istanza della funzione? Ho appena provato n(3)e ricevuto un Uncaught ReferenceError: n is not definederrore ...
WallyWest

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

@eithedog Quindi la risposta non dovrebbe avere l'iniziale x=e cambiata in 25 caratteri?
WallyWest,

4

C #, 28 byte

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

Sono sempre interessato ai frammenti di lambda. come puoi farcela?
downrep_nation

@downrep_nation accetta un int e restituisce automaticamente la stringa perché è solo un'istruzione
TheLethalCoder

La risposta dovrebbe essere un programma completo o una funzione, non solo uno snippet. Quindi questa risposta sembra incompleta.
raznagul,

@raznagul Questa è una funzione anonima quindi è completa
TheLethalCoder

@TheLethalCoder: Forse provare un link online aiuterebbe a capirlo. ( csharppad.com )
raznagul,

4

Python , 24 byte.

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

input() ottiene input dall'utente

*, quando utilizzato su stringhe e un numero intero, crea una nuova stringa, che è composta da copie unite dell'originale. Ad esempio: "hello "*3output hello hello hello.

Moltiplicando =e input(), si ottiene una stringa della =lunghezza specificata dall'utente.

Usando +unisce due corde, in questo caso, il nostro corpo "=…="con la testa, "(:)-"per creare il serpente.

print genera il risultato.


3

GolfScript, 11 10 byte

~"="*"(:)-"

Moltiplica "=" per input e aggiunge la testa.

-1 grazie a Leaky Nun


3

Mathematica, 21 20 byte

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

Funzione anonima. Prende un numero n come input e restituisce un serpente di lunghezza n come output. "="~Table~#genera un elenco {"=", "=", ..., "="}di lunghezza n e <>"(:)-"concatena gli elementi dell'elenco e aggiunge "(:)-"alla stringa risultante.


1
golfable di un altro byte:"="~Table~#<>"(:)-"&
LLlAMnYP

3

R, 32 27 byte

Questa soluzione è piuttosto semplice, la repfunzione ripete il primo elemento ( "=") scan()volte, che è in realtà l'input dell'utente.

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

MODIFICA :

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

Risposta leggermente più breve, usando scan()direttamente.

In alternativa,

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

per un serpente non tritato ( 34 byte )


Direi che il sep=""è necessario qui, altrimenti il tuo aspetto di serpenti come quella che ha attraversato la ferrovia: = = = (:)-.
arte

Il serpente prodotto qui è effettivamente un po 'tritato, ma le spedizioni di OP dichiarano solo che la lunghezza del serpente è il numero di segni uguali davanti alla testa. Aggiungerò sepcomunque la nota a margine;)
Frédéric il

3

Lotto, 68 byte

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


2

Perl 6 ,  16 15  12 byte

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

Spiegazione:

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

Uso:

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

put snake 10;

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

2

JAISBaL , 9 byte

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

Testato con JAISBaL-0.0.7 (Il .jar compilato è stato appena spinto, ma la fonte è stata su git per un po ')


Usa un #nome prima della lingua per farlo sembrare come tutti gli altri.
Michael Klein,

@MichaelKlein okay
Socratic Phoenix

2

PowerShell v2 +, 19 byte

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

Programma completo. Accetta input $args[0], utilizza la moltiplicazione di stringhe per costruire il corpo, quindi concatenazione di stringhe per virare sulla testa.

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

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

Complimenti a te, sono arrivato fino al 26:"$("="*[int]$args[0])(:)-"
Chirishman

2

C, 46 45 43 byte

salvato 2 byte grazie a owacoder! salvato 3 byte grazie a rici!

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

Provalo su Ideone!


3
Il misterioso -->operatore colpisce ancora.
Leaky Nun,

La versione di 46 byte di @LeakyNun era senza operatore va, di quanto ricordassi l'operatore va);
betseg

1
È possibile rimuovere >0e salvare due byte.
owacoder,

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

2

Cheddar, 15 byte (non competitivo)

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

Una risposta semplice.


1

Sesos , 11 byte

hexdump:

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

Provalo 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 byte

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

Esempio;

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

Spiegazione;

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

Che cos'è -1(... );?
Adám,

Salvare un byte:{(x#"="),"(:)-"}
Adám

Grazie Adam. -1 Stampa sulla console. -1 "Ciao"; stamperà Hello
Chromozorz il

Ma la stampa non è implicita?
Adám,

Sì, ma include le doppie virgolette ... "==== (:) -" anziché; ===== (
:)

1

Perl, 16 + 1 ( -pflag) = 17 byte

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

Ha bisogno di -pbandiera, quindi corri con:

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

1

Minkolang 0,15 , 12 byte

"=(:)-"nD$O.

Provalo qui!

Spiegazione

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

Riceve input numerici dall'utente, quindi stampa il serpente.

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

1

Matlab / Octave, 22 byte

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

Questa è una funzione anonima.

Provalo su Ideone .

Spiegazione

Assumere n= 5.

1:nproduce il vettore riga [1 2 3 4 5].

~(1:n)annulla ogni voce, quindi dà [0 0 0 0 0].

...+61aggiunge 61ad ogni voce, quindi dà [61 61 61 61 61]. 61è il valore ASCII del carattere =.

[... '(:)-']lo concatena con la stringa '(:)-'. Questo si converte automaticamente [61 61 61 61 61]nella stringa '====='prima della concatenazione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.