Fai una pausa per creare un serpente!


23

Il nostro classico serpente ha sviluppato uno squilibrio degli ormoni della crescita . A peggiorare le cose, la sua coda è congelata in posizione! Dato l'input direzionale come specificato in Figure 1, scrivere un programma per determinare dove crescerà.

WASD

Figura 1. Ingresso direzionale.

Specifiche del programma

  • Leggi il carattere di input per carattere su STDIN.
  • Dopo aver letto un personaggio, fai uscire il serpente su STDOUT. Si prega di includere una riga vuota tra ogni volta che si stampa un serpente.
  • Il serpente è costituito da <>v^e una testa. La testa del serpente può essere qualsiasi carattere turno di tua scelta, come ad esempio o, 0, O, o .
  • Qualsiasi combinazione di wasdè valida per l'input.
  • Il tuo programma non dovrebbe presumere che l'input sia entro una certa lunghezza.
  • Il serpente può impilarsi su se stesso, sovrascrivendolo <>v^. Vedi esempi per la meccanica della coltivazione del serpente.
  • Lo spazio bianco finale va bene, ma il tuo serpente deve apparire corretto.

punteggio

Questo è . Il tuo punteggio è il numero di caratteri nel tuo programma. Il punteggio più basso vince!

Serpenti di esempio:

Ingresso: ddddssaassdddddww

Produzione:

>>>>v
    v
  v<<  ☺
  v    ^
  >>>>>^

Ingresso: dddsssaaawww

Produzione:

☺>>v
^  v
^  v
^<<<

Ingresso: dddsssdddddasddddwww

Produzione:

>>>v
   v       ☺
   v       ^
   >>>>v<  ^
       >>>>^

Ingresso: dddwwdddssssaaaaaaaaawww

Produzione:

      >>>v
☺     ^  v
^  >>>^  v
^        v
^<<<<<<<<<

Ingresso: ddddssssaawwddddd

Produzione:

>>>>v
    v
  >>>>>☺
  ^ v
  ^<<

Ingresso: dddddssaawwwwddddd

Produzione:

   >>>>>☺
   ^
>>>^>v
   ^ v
   ^<<

Ingresso:

ddddaaaasssssdddddddddddwwwwwaaaasssssdddddddddddwwwwwwwwwwsssssaaaasssssdddddddwwwwwddddssaaaasssddddaaaassssssssssdddwwwwwwwddddswaaaassssddaasssaaaaaaaaaawwwwddddssssaaaaaaaaaaawwwwddddsssssssssaaaa

Produzione:

                  v
                  v
                  v
                  v
                  v
v<<<<  v<<<<  v<<<<  >>>>v
v      v   ^  v   ^  ^   v
v      v   ^  v   ^  v<<<<
v      v   ^  v   ^  v
v      v   ^  v   ^  v
>>>>>>>>>>>>>>>>>>>>>v<<<<
                     v
                     v
                     v  v<<<<
                     v  v   ^
                     v  v
       >>>>v  >>>>v  v  v
       ^   v  ^   v  v  v<<
       ^   v  ^   v  v  v
       ^   v  ^   v  v  v
       ^<<<v<<<<<<<<<<<<<
           v
           v
           v
           v
       O<<<<

8
Molto bella. Ma ... WTH è un "code gofl"?
John Dvorak,

2
Mi sbarazzerei del bonus in quanto è troppo facile creare il proprio serpente e la stringa di input.
Decadimento beta

1
@JanDvorak rotfl my my.
hmatt1,

1
@BetaDecay le scale del piano. Nell'esempio del codice golf è iniziato nella parte in alto a sinistra della c, ma poiché la d è più alta si sposta verso il basso.
hmatt1,

2
@chilemagic Grazie! Se entrambi sono accettabili, dovresti probabilmente chiarire questo nella domanda.
Ingo Bürk,

Risposte:


5

Rubino, 207 caratteri

b=[];x=y=0;gets.chars{|c|b[y]||=[];b[y][x]={?\n=>->{?0},?w=>->{y>0?y-=1:b=[[]]+b;?^},?a=>->{x>0?x-=1:b.map!{|r|[' ']+r};b[y][1]=?<},?s=>->{y+=1;?v},?d=>->{x+=1;?>}}[c][]};puts b.map{|r|r.map{|c|c||' '}.join}

Ungolfed:

b=[]  #board
x=y=0 #position
gets.each_char{|c|
  b[y] ||= []
  b[y][x] = {
    "\n" => lambda{0},
    "w"  => lambda{if y>0 then y-=1 else b=[[]]+b; "^"},
    "a"  => lambda{if x>0 then x-=1 else b.map!{|r|[' ']+r}; b[y][1]="<"},
    "s"  => lambda{y+=1; "v"},
    "d"  => lambda{x+=1; ">"}
  }[c].call}
puts b.map{|r|r.map{|c|c||' '}.join}

(il lambda per ariscrive perché la riga in cui scrive il compito sopra non è più nel tabellone)


11

ECMAScript 6 Javascript (399 401 431 )

Deve essere eseguito in un browser che supporta ECMAScript 6 a causa delle funzioni freccia.

Qui ci sono violini che sono stati modificati per essere eseguiti in qualsiasi browser (comune) non usando le funzioni freccia. Stampano anche su un textareainvece:

Versione golfizzata

i=prompt(),v=[],c=0,x=[0],y=[0],s='unshift',k='slice',t='sort',h=[0,-1,0,1,0]
while(c<i.length){m='wasd'.indexOf(i[c++]);v[s]('^<v>'[m]);x[s](x[0]+h[m]);y[s](y[0]+h[m+1])}f=(a,b)=>a-b
q=x[k]()[t](f)[0],e=x[k]()[t]((a,b)=>b-a)[0],w=y[k]()[t](f)[0],o=[]
while((i=y.pop())!=null){i-=w;j=x.pop()-q;t=(o[i]||Array(e+1-q).join(" ")).split("");t.splice(j,1,v.pop()||"@");o[i]=t.join("")}alert(o.join("\n"))

GIF animate:

Uno degli esempi del PO:

inserisci qui la descrizione dell'immagine

L'esempio di Stretch Maniac :

inserisci qui la descrizione dell'immagine

Ungolfed

Ecco una versione (leggermente) ungolfed di qualche tempo prima che iniziassi davvero a giocare a golf:

var input = prompt(),
    values = [],
    c = 0,
    x = [0],
    y = [0],
    s = 'unshift';
while (c < input.length) {
    var mapped = 'wasd'.indexOf(input[c++]);
    values[s]('^<v>'[mapped]);
    x[s](x[0]+[0, -1, 0, 1][mapped]);
    y[s](y[0]+[-1, 0, 1, 0][mapped]);
}

var minX = x.slice().sort(function (a,b){return a-b})[0];
var maxX = x.slice().sort(function (a,b){return b-a})[0];
var minY = y.slice().sort(function (a,b){return a-b})[0];

var output = [];
while((i=y.pop())!=null) {
    i-=minY;
    j=x.pop()-minX;
    t=(output[i]||Array(maxX+1-minX).join(" ")).split("");
    t.splice(j,1,values.pop()||"@");
    output[i]=t.join("");    
}

console.log(output.join("\n"));

Le gif sono molto interessanti. Sono fatti automaticamente, da uno script che hai scritto?
AndoDaan,

1
Grazie! Con la potenza di Google ho appena cercato come fare un regalo da una registrazione dello schermo in Ubuntu. Utilizza solo un registratore dello schermo e convert. Abbastanza facile :)
Ingo Bürk

3
(GIF, non regalo)
Ingo Bürk,

8

sed, 71

s/w/\^\x1B[D\x1B[A/g
s/a/<\x1B[2D/g
s/s/v\x1B[B\x1B[D/g
s/d/>/g
s/$/@/

Golfscript, 165 126

' '*"\33[":e{e'D'}:-{[e'C'+'<'--]]}:a{[-+'>']]}:d{[e'B'+'^'-e'A']]}:w{[e'A'+'v'-e'B']]}:s{][\[}:+7{;}*''\~[e'H'e'J']\'@'e'20H'

Stesso approccio della mia risposta precedente, ma posizionando correttamente il cursore prima e dopo. Sono abbastanza orgoglioso dell'approccio al posizionamento del cursore - in sostanza, prima fa girare il serpente al contrario, senza stampare i personaggi.


1
Puoi aggiungere una chiamata di esempio? echo "dddddssaawwwwddddd" | sed -e 's/w/\^\x1B[D\x1B[A/g' -e 's/a/<\x1B[2D/g' -e 's/s/v\x1B[S\x1B[D/g' -e 's/d/>/g' -e 's/$/@/'non dà l'output corretto per me.
Ingo Bürk,

Il tuo prompt dopo l'esecuzione probabilmente sovrascrive parte del serpente. Incolla il serpente direttamente nello stdin anziché nelle tubazioni, oppure aggiungi qualche \ns dopo che il @tuo prompt vada altrove.
Sneftel,

1
Questo potrebbe fallire se il serpente sale o lascia il tabellone.
tomsmeding

@tomsmeding Sì, potrei espanderlo per affrontarlo. A parte il linguaggio, tuttavia, penso davvero che le sequenze di controllo ANSI siano la strada da percorrere per un codice più breve.
Sneftel,

3

Java - 646

Potrebbe anche essere il primo!

Scommetto che tutti voi potete battere questo.

un (sorta di) golf

import java.util.*;
public class Snake{
    public static void main(String[]a) {
        int x,y,minX,minY,maxX,maxY;
        x=y=minX=maxX=minY=maxY=0;
        List<Integer>xs,ys=new ArrayList<Integer>();
        xs=new ArrayList<Integer>();
        List<Character>p=new ArrayList<Character>();
        for(int b=0;b<a[0].length();b++){
            int newX=x,newY=y;
            switch(a[0].charAt(b)){
            case'a':newX--;p.add('<');break;
            case's':newY++;p.add('v');break;
            case'd':newX++;p.add('>');break;
            case'w':newY--;p.add('^');break;
            }
            xs.add(x);ys.add(y);
            x=newX;y=newY;
            if(x<minX){minX=x;}
            if(x>maxX){maxX=x;}
            if(y<minY){minY=y;}
            if(y>maxY){maxY=y;}
        }
        char[][]c=new char[maxY-minY+1][maxX-minX+1];
        for(int i=0;i<xs.size();i++)c[ys.get(i)-minY][xs.get(i)-minX]=p.get(i);
        c[y-minY][x-minX]='@';
        for(char[]k:c){for(char l:k){System.out.print(l);}System.out.println();}
    }
}

Più piccoli -

import java.util.*;class S{public static void main(String[]a){int x,y,o,z,s,u;x=y=o=s=z=u=0;List<Integer>j,t=new ArrayList<Integer>();j=new ArrayList<Integer>();List<Character>p=new ArrayList<Character>();for(int b=0;b<a[0].length();b++){int e=x,r=y;switch(a[0].charAt(b)){case'a':e--;p.add('<');break;case's':r++;p.add('v');break;case'd':e++;p.add('>');break;case'w':r--;p.add('^');break;}j.add(x);t.add(y);x=e;y=r;if(x<o)o=x;if(x>s)s=x;if(y<z)z=y;if(y>u)u=y;}char[][]c=new char[u-z+1][s-o+1];for(int i=0;i<j.size();i++)c[t.get(i)-z][j.get(i)-o]=p.get(i);c[y-z][x-o]='@';for(char[]k:c){for(char l:k){System.out.print(l);}System.out.println();}}}

input - dddsssdddwwwwaaaaaaaassssssssssddddddddddddddddd

v<<<<<<<<         
v >>>v  ^         
v    v  ^         
v    v  ^         
v    >>>^         
v                 
v                 
v                 
v                 
v                 
>>>>>>>>>>>>>>>>>@

input - dddsssdddddasddddwww

>>>v        
   v       @
   v       ^
   >>>>v<  ^
       >>>>^

il mio preferito - dwdwdwddaasassdddddwdwdwddsdswawaasassdddddddwdwdwddsdswawaasassddddwwwwwwwssssssdsdddwwwwddaassddaassddddsssdddwdwdwddaasasassddddwwwwssssssssasasaaawdwwdwddwwdddddddwdwdwddsdswawaasassddddddddddwwdwwwwaasssassdsdddddddwdwdwwwwasasssssssssssdwwwwwwwddd

                    v                                          
                    v                                          
                    v                                          
                    v   v<<                                    
   v<<   v<<     v<<v   v                                      
  v<    v< ^<   v< ^v   v<<                        v<<     v<  
 >v    >v   ^  >v   >v  v                          v ^    v<^  
>^>>>>>^>>>>>>>^>>>>^>>>>>>>v    v<v               v ^    v ^  
                            v   v< v       v<<    v< ^    v ^  
                            v  v<  v      v< ^<   v >^    v>^  
                            >>>v   v     >v   ^   >v^     v>>>@
                               >>>>>>>>>>^>>>>>>>>>>>>>>>>v^   
                                  ^v                      v^   
                                >>^v                      v^   
                               >^  v                      v^   
                               ^  v<                      v^   
                              >^ v<                       v^   
                              ^<<<                        >^  

2

C # 607

namespace System{using B=Text.StringBuilder;class P{static void Main(){var f=new Collections.Generic.List<B>(){new B("O")};int w=1,r=0,c=0;for(Action R=()=>f[r].Append(' ',w-f[r].Length+1);1>0;){var key=Console.ReadKey(1>0).KeyChar;if(key=='w'){f[r][c]='^';if(--r<0)f.Insert(r=0,new B());R();f[r][c]='O';}if(key=='a'){f[r][c]='<';if(--c<0){foreach(var s in f)s.Insert(c=0,' ');w++;}R();f[r][c]='O';}if(key=='s'){f[r][c]='v';if(++r>f.Count-1)f.Add(new B());R();f[r][c]='O';}if(key=='d'){f[r][c]='>';if(++c>w++)foreach(var s in f)s.Append(' ');R();f[r][c]='O';}Console.WriteLine(string.Join("\n",f)+"\n");}}}}

"Ungolfed" con spazi bianchi (questo non sarà sincronizzato con la versione giocata a golf):

namespace System
{
    using B = Text.StringBuilder;
    class P
    {
        static void Main()
        {
            var f = new Collections.Generic.List<B>() { new B("O") };
            int w = 1, r = 0, c = 0;
            Action R = () => f[r].Append(' ', w - f[r].Length + 1);
            while (true)
            {
                char key = Console.ReadKey(1>0).KeyChar;
                if (key == 'w')
                {
                    f[r][c] = '^';
                    if (--r < 0) { f.Insert(0, new B()); r = 0; }
                    R();
                    f[r][c] = 'O';
                }
                if (key == 'a')
                {
                    f[r][c] = '<';
                    if (--c < 0)
                    {
                        foreach (var s in f)
                            s.Insert(0, ' ');
                        w++;
                        c = 0;
                    }
                    R();
                    f[r][c] = 'O';
                }
                if (key == 's')
                {
                    f[r][c] = 'v';
                    if (++r > f.Count - 1) f.Add(new B());
                    R();
                    f[r][c] = 'O';
                }
                if (key == 'd')
                {
                    f[r][c] = '>';
                    if (++c > w++)
                    {
                        foreach (var s in f)
                            s.Append(' ');
                    }
                    R();
                    f[r][c] = 'O';
                }

                Console.WriteLine(string.Join("\n", f) + "\n");
            }
        }
    }
}

2

Python 3: 259 byte

x=y=0
b,p,r={},(0,-1,0,1),range
while 1:
 d='wasd'.index(input());b[(x,y)]='^<v>'[d];x+=p[d];y-=p[~d];b[(x,y)]='☺';l,m=([k[i]for k in b]for i in(0,1))
 for j in r(min(m),max(m)+1):print(''.join(b[(i,j)]if(i,j)in b else' 'for i in r(min(l),max(l)+1)))
 print()

Ho deciso di conservare il serpente in un dict, con le coordinate per le chiavi. Quindi trovare e scorrere nell'intervallo di output, sostituendo gli spazi vuoti.

x = y = 0
board = {}
while 1:
    d = 'wasd'.index(input())
    board[(x, y)] = '^<v>'[d] # body
    x += (0, -1, 0, 1)[d]
    y -= list(reversed((0, -1, 0, 1)))[d]
    board[(x,y)] = '☺' # head

    xs, ys= ([coord[dim] for coord in board] for dim in(0, 1))
    for j in range(min(ys), max(ys)+1):
        print(''.join(board[(i,j)] if (i,j) in board else ' '
                      for i in range(min(xs), max(xs)+1)))
    print()

PS. Il mio primo Golf :) Fammi sapere se la mia risposta è inappropriata


L'utilizzo Oinvece di consente di risparmiare 2 byte. è un'aringa rossa.
Erik the Outgolfer

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ non è stato effettivamente conteggiato come 3 byte.
Martin Ender,

@MartinEnder Deve essere , la codifica predefinita è UTF-8. Avevo la sensazione che non fosse contato. Ho la sensazione che sia stato accidentale e deve essere risolto immediatamente da Gilly.
Erik the Outgolfer

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Beh, tecnicamente, il risponditore è libero di usare qualsiasi codifica supportata dal proprio interprete (e sono abbastanza sicuro che una pagina di codice compatibile con ASCII contenga quel carattere) ma questo è il punto. Sto dicendo che il conteggio dei byte è già lo stesso di quello dell'uso O, quindi non me ne preoccuperei. Dal codice emerge chiaramente che funzionerebbe comunque per qualsiasi altro personaggio, ma l'utilizzo consente di eseguire comodamente i casi di test dalla sfida senza modifiche.
Martin Ender,

@MartinEnder Python utilizza UTF-8, dimostrato dalla sua capacità di supportare stringhe unicode. Per abilitare questa funzionalità, deve essere la prima o la seconda riga #coding=utf-8. Si noti che #coding=utf-16non funziona. Quindi deve essere contato come 3.
Erik the Outgolfer

2

Python 2.7 - 274 byte

x,y,m,d,r=0,0,{},(0,-1,0,1),range
for c in raw_input():b='wasd'.index(c);m[(x,y)]='^<v>'[b];x+=d[b];y-=d[~b];m[(x,y)]='@';l,n=([k[h] for k in m] for h in (0, 1))
for j in range(min(n),max(n)+1):print(''.join(m[(i,j)] if (i,j) in m else ' 'for i in range(min(l),max(l)+1)))

Versione Ungolfed

x,y,matrix,delta = 0,0,{},(0, -1, 0, 1)    
for c in raw_input('Command: '):
    d = 'wasd'.index(c)
    matrix[(x, y)] = '^<v>'[d]
    x += delta[d]
    y -= list(reversed(delta))[d]
    matrix[(x, y)] = '@'    
xs, ys = ([xy[i] for xy in matrix] for i in (0, 1))
for j in range(min(ys), max(ys)+1):
    print(''.join(matrix[(i, j)] if (i, j) in matrix else ' '
                  for i in range(min(xs), max(xs)+1)))

2
Benvenuto in Programmazione di puzzle e codice golf! Secondo le regole delineate nel nostro centro assistenza , tutte le soluzioni alle sfide dovrebbero essere un serio contendente per i criteri vincenti in uso. Ad esempio, è necessario giocare a golf per partecipare a una gara di codice golf.
Dennis

1
Ho aggiunto il conteggio dei byte per te, ma ci sono molti spazi non necessari che potresti voler rimuovere.
Martin Ender,

Grazie ragazzi, ho apportato le modifiche necessarie alla mia prima iscrizione. Qualsiasi consiglio extra sarà molto apprezzato.
Adriaan Erasmus,


@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Che stampa SyntaxError: invalid syntax.
Dennis,

2

05AB1E , 35 34 30 28 byte

.•₃º•"<>v^"©‡0ªÐUĀ>sŽO^®XkèΛ

Utilizza 0come testa di serpente.

-4 byte grazie a @Grimy .

Provalo online (nessuna suite di test per tutti i casi di test contemporaneamente, perché non c'è modo di resettare il Canvas, quindi le uscite si sovrappongono ..).

Spiegazione:

.•₃º•          # Push compressed string "adsw"
     "<>v^"    # Push string "<>v^"
           ©   # Save it in variable `r` (without popping)
              # Transliterate the (implicit) input-string,
               # replacing all "adsw" with "<>v^" respectively
               #  i.e. "ddddssaassdddddww" → ">>>>vv<<vv>>>>>^^"
0ª             # Convert the string to a list of characters, and append a 0 (for the head)
               #  → [">",">",">",">","v","v","<","<","v","v",">",">",">",">",">","^","^","0"]
  Ð            # Triplicate this list of characters
   U           # Pop and store one of the three lists in variable `X`
   Ā           # Trutify each character ("0" remains 0; everything else becomes 1)
    >          # And then increase each integer by 1
               #  → [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1]
  s            # Swap the two lists on the stack
      ®Xk      # Get the index of each character of variable `X` in variable `r` ("<>v^")
               #  i.e. [">",">",">",">","v","v","<","<","v","v",">",">",">",">",">","^","^","0"]
               #   → [1,1,1,1,2,2,0,0,2,2,1,1,1,1,1,3,3,-1]
   ŽO^   è     # And use those to index into the compressed number 6240
               #  → [2,2,2,2,4,4,6,6,4,4,2,2,2,2,2,0,0,0]
Λ              # Use the Canvas builtin with these three lists

Vedi questo mio suggerimento 05AB1E (sezioni Come comprimere le stringhe che non fanno parte del dizionario? E Come comprimere numeri interi grandi? ) Per capire perché .•₃º•è "adsw"ed ŽO^è6240 .

Per quanto riguarda una breve spiegazione dell'integrato Canvas Λe dei suoi tre argomenti:

Primo argomento: lunghezza / i: le dimensioni delle linee che vogliamo disegnare. Dato che dobbiamo tenere a mente le sovrapposizioni, usiamo la dimensione 2 per ogni personaggio e un ulteriore 1 per la testa del serpente.
Secondo argomento: stringhe: i caratteri che vogliamo visualizzare. Quali sono i personaggi in questo caso, aggiunti al personaggio principale del serpente.
Terzo argomento: direzione (i): le direzioni in cui devono essere tracciate queste linee di caratteri della lunghezza data. In generale abbiamo le direzioni [0,7]che mappano a queste direzioni:

7   0   1
    
6  X  2
    
5   4   3

Ecco perché abbiamo il numero intero 6240per le direzioni[,,,] rispettivamente.

Vedi questo mio suggerimento 05AB1E per una spiegazione più dettagliata sull'integrazione di Canvas Λ.


1
Potrei aver perso qualcosa, ma non credo γsia necessario affatto. Questo sembra funzionare bene.
Grimmy

@Grimy Grazie, lo fa davvero; simpatico approccio alternativo con l'elenco dei 2 e 1 per la testa! E sono stato in grado di salvare altri 2 byte in base al tuo programma.
Kevin Cruijssen,

Grazie! Sono attualmente a 23 anni , anche se questo è un approccio significativamente diverso, quindi potrei farlo da solo se va bene per te.
Grimmy

@Grimy Questo è davvero un approccio piuttosto diverso dal mio, quindi sentiti libero di pubblicarlo. In effetti mi aspettavo un po 'di conversione unicode e il modulo potrebbe renderlo più breve del traslitterato, ma sinceramente sono abbastanza male con quel tipo di conversioni di numeri interi / stringhe magiche. :)
Kevin Cruijssen il

1

Perl - 394

Non il più breve, ma batte almeno Javascript, C # e Java.

use List::Util qw(min max);sub c{()=$_[0]=~/$_[1]/g}%l=(a,['<',-1,0],d,['>',1,0],w,['^',0,-1],s=>['v',0,1]);($s,$x,$y,$w,$h)=($ARGV[0],0,0,max(c($s,a),c($s,d)),max(c($s,w),c($s,'s')));@s=split'',$s;map$x=min($x,$i+=$l{$_}[1]),@s;$i=0;map$y=min($y,$i+=$l{$_}[2]),@s;$x=abs $x;$y=abs $y;map{$m[$y][$x]=$l{$_}[0];$x+=$l{$_}[1];$y+=$l{$_}[2]}@s;$m[$y][$x]='o';map{map{print$_||' '}@$_;print"\n"}@m 

Alcuni trucchi:

  • Avvisi e rigidi non attivati ​​per consentire le password e non dichiarare le variabili prima di usarle
  • Virgole sottili invece di virgole grasse per salvare alcuni personaggi
  • Non impostare i valori iniziali per le variabili quando non è necessario
  • Tralasciando i punti e virgola, quando possibile
  • La definizione di array e hash non è un riferimento per evitare di dover usare ->
  • Consentire larghezza, altezza più grandi del necessario per evitare di calcolarli con precisione (che richiederebbe un codice aggiuntivo)

Cose che fanno male:

  • Nessun modo integrato per contare il numero di caratteri in una stringa (potrebbe essere stato comunque più lungo)
  • Nessuna funzione min / max integrata, quindi è necessario sprecare 27 caratteri per importare la libreria che lo fa (meno che definire la nostra)

1

C - 273 byte - con input interattivo!

#define F for(i=w*w
*g,*G,x,i,j,w,W,u;main(w){putch(1);F;j=-~getch();g=G){if(!(x%w&&~-~x%w&&x/w&&x/w^~-w)){W=w+6;G=calloc(W*W,4);F-1;u=i%w+i/w*W-~W*3,i==x?x=u:8,i;)G[u]=g[i--];free(g);w=W;}G[x]="<^X>v"[j%=7];G[x+=1-G[x]%3+W*(!!j-j/2)]=1;F;i;)putch(i--%W?G[i]?G[i]:32:10);}}

Il campo viene stampato ogni volta che un personaggio viene inserito e cresce se la testa del serpente si avvicina al bordo. Non so quanto sia portatile - qualcuno su Internet ha detto che getch () non funziona su piattaforme non Windows. Difficile dire se ASCII 1 sembrerà una faccina sorridente.

La versione golfata è piuttosto fastidiosa in quanto non c'è modo di uscire con grazia dal programma. Control-C non funziona per me. D'altra parte, la versione non golfata termina se viene inserito un carattere diverso da "w", "a", "s" o "d".

I cosiddetti "ungolfed":

#define SMILEYFACE 1
int main()
{
    int o;
    int w = 1;
    int *g = 0, *g2;
    int c, n;
    int x = 0;
    for( putch(SMILEYFACE);c = getch(); ) {
        if(c!='w'&&c!='a'&&c!='s'&&c!='d')
            return 1;
        if(!(x%w) | !(~-~x%w) | !(x/w)  | !(x/w-~-w) ) {
            int wnew = w + 4;
            int off = 2;
            g2 = calloc(wnew*wnew,sizeof(int));
            for(n = w*w; --n; )
                g2[ n%w+off + (n/w+off)*wnew ] = g[n];
            free(g);
            g = g2;
            x = (x/w+off)*wnew + x%w + off;
            w = wnew;
        }
        int i = -~c%7;
        g[x] = "<^X>v"[i];
        int dx = 1-g[x]%3 + w * (!!i-i/2);
        x += dx;
        g[x] = SMILEYFACE;
        for(o = w*w; o; )
            putch(o--%w?g[o]?g[o]:32:10);


    }
    return 0;
}

1

05AB1E , 23 byte

Ç7%DÉ+D"^>>v"ºsè0ªDĀ>rΛ

Provalo online!

Spiegazione:

                      # implicit input (eg: "wasd")
Ç                     # codepoints (eg: [119, 97, 115, 100])
 7%                   # modulo 7 (eg: [0, 6, 3, 2])
   DÉ+                # plus itself modulo 2 (eg: [0, 6, 4, 2])
# This is the list of directions that will be passed to 05AB1E's canvas function, Λ.
# 0 means up, 6 left, 4 right, 2 down.

 "^>>v"º              # "^>>v", horizontally mirrored (namely "^>>vv<<^")
D       sè            # index into this with a copy of the list of directions
          0ª          # append "0"
# This is the list of strings that will be drawn.

D                     # duplicate the list of strings
 Ā                    # truthify (maps letters to 1, 0 stays 0)
  >                   # increment each
# This is the list of lengths to draw.

r                     # reverse the stack because Λ takes arguments in the opposite order
 Λ                    # draw!

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.