¡Tómate un descanso para hacer una serpiente!

23

Nuestra serpiente clásica ha desarrollado un desequilibrio de las hormonas de crecimiento . Para empeorar las cosas, su cola está congelada en su lugar. Dada la entrada direccional como se especifica en Figure 1, escriba un programa para determinar dónde crecerá.

wasd

Figura 1. Entrada direccional.

Especificaciones del programa

  • Lea la entrada carácter por carácter enSTDIN .
  • Después de leer un personaje, envíe la serpiente aSTDOUT . Incluya una línea en blanco entre cada vez que imprima una serpiente.
  • La serpiente consta de <>v^y una cabeza. La cabeza de la serpiente puede ser cualquier carácter ronda de su elección, tales como o, 0, O, o .
  • Cualquier combinación de wasdes válida para la entrada.
  • Su programa no debe asumir que la entrada está dentro de una cierta longitud.
  • La serpiente puede apilarse sobre sí misma, sobrescribiéndose <>v^. Vea ejemplos de mecánica de cultivo de serpientes.
  • El espacio en blanco al final está bien, pero tu serpiente debe verse correcta.

Tanteo

Este es el . Su puntaje es el número de caracteres en su programa. ¡La puntuación más baja gana!

Serpientes de ejemplo:

Entrada: ddddssaassdddddww

Salida:

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

Entrada: dddsssaaawww

Salida:

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

Entrada: dddsssdddddasddddwww

Salida:

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

Entrada: dddwwdddssssaaaaaaaaawww

Salida:

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

Entrada: ddddssssaawwddddd

Salida:

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

Entrada: dddddssaawwwwddddd

Salida:

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

Entrada:

ddddaaaasssssdddddddddddwwwwwaaaasssssdddddddddddwwwwwwwwwwsssssaaaasssssdddddddwwwwwddddssaaaasssddddaaaassssssssssdddwwwwwwwddddswaaaassssddaasssaaaaaaaaaawwwwddddssssaaaaaaaaaaawwwwddddsssssssssaaaa

Salida:

                  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<<<<
hmatt1
fuente
8
Muy agradable. Pero ... ¿WTH es un "código gofl"?
John Dvorak
2
Me desharía de la bonificación ya que es demasiado fácil crear tu propia serpiente y cadena de entrada.
Beta Decay
1
@ JanDvorak rotfl my bad.
hmatt1
1
@BetaDecay las escalas del avión. En el ejemplo del código de golf comenzó en la parte superior izquierda de la c, pero como la d es más alta, se mueve hacia abajo.
hmatt1
2
@chilemagic ¡Gracias! Si ambos son aceptables, probablemente debería aclarar esto en la pregunta.
Ingo Bürk

Respuestas:

5

Ruby, 207 caracteres

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}

Sin golf:

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}

(la lambda para aescribe de nuevo porque la fila en la que escribe la tarea anterior ya no está en el tablero)

John Dvorak
fuente
11

ECMAScript 6 Javascript (399 401 431 )

Tiene que ejecutarse en un navegador compatible con ECMAScript 6 debido a las funciones de flecha.

Aquí hay violines que se han modificado para ejecutarse en cualquier navegador (común) al no utilizar las funciones de flecha. También imprimen a untextarea lugar:

Versión de golf

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 animado:

Uno de los ejemplos del OP:

ingrese la descripción de la imagen aquí

El ejemplo de Stretch Maniac :

ingrese la descripción de la imagen aquí

Sin golf

Aquí hay una versión (levemente) sin golf de algún momento antes de que realmente comenzara a jugar 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"));
Ingo Bürk
fuente
Los gifs son muy geniales. ¿Se hacen automáticamente, por un guión que has escrito?
AndoDaan
1
¡Gracias! Con el poder de Google, solo busqué cómo hacer un regalo desde una grabación de pantalla en Ubuntu. Simplemente usa una grabadora de pantalla y convert. Bastante fácil :)
Ingo Bürk
3
(gif, no 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'

El mismo enfoque que mi respuesta anterior, pero colocando el cursor correctamente antes y después. Estoy bastante orgulloso del enfoque del posicionamiento del cursor: básicamente, primero ejecuta la serpiente en reversa, sin imprimir caracteres.

Sneftel
fuente
1
¿Puedes agregar una llamada de ejemplo? 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/$/@/'no me da la salida correcta.
Ingo Bürk
Su mensaje después de la ejecución probablemente sobrescribirá parte de la serpiente. Pegue la serpiente directamente en stdin en lugar de tubería, o agregue unos \nsegundos después de esto @para que su mensaje vaya a otro lado.
Sneftel
1
Esto podría fallar si la serpiente sube o sale del tablero.
tomsmeding
@tomsmeding Sí, podría expandirlo para lidiar con eso. Sin embargo, aparte del lenguaje, realmente creo que las secuencias de control ANSI son el camino a seguir para un código más corto.
Sneftel
3

Java - 646

¡Bien podría ser el primero!

Apuesto a que todos pueden vencer esto.

un (tipo de) 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();}
    }
}

Más pequeño -

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<  ^
       >>>>^

mi favorito personal - 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^   
                              ^<<<                        >^  
Estiramiento maniaco
fuente
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 espacios en blanco (esto no se mantendrá sincronizado con la versión golfizada):

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");
            }
        }
    }
}
Mover
fuente
2

Python 3: 259 bytes

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

Decidí guardar la serpiente en un dict, con coordenadas para las llaves. Luego busque e itere sobre el rango de salida, sustituyendo espacios en blanco.

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

PD. Mi primer golf :) Avísame si mi respuesta es inapropiada

Gilly
fuente
Usar en Olugar de ahorra 2 bytes. Es un arenque rojo.
Erik the Outgolfer
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ no se contaba realmente como 3 bytes.
Martin Ender
@MartinEnder Debe ser , la codificación predeterminada es UTF-8. Tenía la sensación de que no se contaba. Tengo la sensación de que fue accidental y Gilly debe arreglarlo de inmediato.
Erik the Outgolfer
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Bueno, técnicamente, el respondedor es libre de usar cualquier codificación compatible con su intérprete (y estoy bastante seguro de que alguna página de códigos compatible con ASCII contiene ese carácter), pero eso no viene al caso. Estoy diciendo que el recuento de bytes ya es el mismo que el de usar O, por lo que no me preocuparía. Está claro por el código que todavía funcionaría para cualquier otro personaje, pero el uso le permite ejecutar convenientemente los casos de prueba desde el desafío sin cambios.
Martin Ender
@MartinEnder Python usa UTF-8, demostrado por su capacidad de soportar cadenas unicode. Para habilitar esta funcionalidad, la primera o segunda línea debe ser #coding=utf-8. Tenga en cuenta que #coding=utf-16no funciona. Por lo tanto, debe contarse como 3.
Erik the Outgolfer
2

Python 2.7 - 274 bytes

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)))

Versión sin golf

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)))
Adriaan Erasmus
fuente
2
¡Bienvenido a Programming Puzzles & Code Golf! De acuerdo con las reglas descritas en nuestro centro de ayuda , todas las soluciones a los desafíos deben ser un competidor serio para los criterios ganadores en uso. Por ejemplo, una entrada a un concurso de golf de código debe ser golfizada.
Dennis
1
He agregado el recuento de bytes para usted, pero hay muchos espacios innecesarios allí que es posible que desee eliminar.
Martin Ender
Gracias chicos, hice los cambios necesarios en mi primera entrada. Cualquier consejo adicional será muy apreciado.
Adriaan Erasmus
Yo realmente Jugamos al golf es .
Erik the Outgolfer
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Eso solo imprime SyntaxError: invalid syntax.
Dennis
2

05AB1E , 35 34 30 28 bytes

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

Usos 0 como cabeza de la serpiente.

-4 bytes gracias a @Grimy .

Pruébalo en línea (no hay un conjunto de pruebas para todos los casos de prueba a la vez, porque no hay forma de restablecer el lienzo, por lo que las salidas se superpondrían ...).

Explicación:

.•₃º•          # 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

Vea esta sugerencia mía 05AB1E (secciones ¿Cómo comprimir cadenas que no forman parte del diccionario? Y ¿Cómo comprimir enteros grandes? ) Para comprender por qué .•₃º•es "adsw"y ŽO^es6240 .

En cuanto a una breve explicación del lienzo incorporado Λy sus tres argumentos:

Primer argumento: longitud (s): el tamaño de las líneas que queremos dibujar. Como tenemos que tener en cuenta la superposición, utilizamos el tamaño 2 para cada personaje y un 1 adicional para la cabeza de la serpiente.
Segundo argumento: cadena (s): los caracteres que queremos mostrar. Cuáles son los personajes en este caso, junto con el personaje principal de la serpiente.
Tercer argumento: dirección (s): las direcciones en las que se deben dibujar estas líneas de caracteres de la longitud dada. En general, tenemos las direcciones [0,7]que se asignan a estas direcciones:

7   0   1
    
6  X  2
    
5   4   3

Por eso tenemos el número entero 6240para las direcciones[,,,] respectivamente.

Consulte este consejo mío de 05AB1E para obtener una explicación más detallada sobre el lienzo incorporado Λ.

Kevin Cruijssen
fuente
1
Puede que me haya perdido algo, pero no creo que γsea ​​necesario en absoluto. Esto parece funcionar bien.
Grimmy
@ Grimy Gracias, de hecho lo hace; ¡Un buen enfoque alternativo con la lista de 2s y 1 para la cabeza! Y he podido guardar 2 bytes más basados ​​en su programa.
Kevin Cruijssen
¡Gracias! Actualmente tengo 23 años , aunque ese es un enfoque significativamente diferente, por lo que podría darle su propia respuesta si está bien para usted.
Grimmy
@Grimy Ese es un enfoque bastante diferente al mío, así que siéntete libre de publicarlo. De hecho, esperaba un poco de conversión y módulo Unicode podría hacer esto más corto que la transliteración, pero honestamente soy bastante malo con ese tipo de conversiones de enteros / cadenas mágicas. :)
Kevin Cruijssen
1

Perl - 394

No es el más corto, pero supera a Javascript, C # y Java al menos.

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 

Algunos trucos:

  • Advertencias y estrictas no activadas para permitir palabras desnudas y no declarar variables antes de usarlas
  • Comas finas en lugar de comas gruesas para salvar algunos personajes
  • No establecer valores iniciales para variables cuando no es necesario
  • Dejando fuera de punto y coma cuando sea posible
  • Definir matrices y hashes no como referencias para evitar tener que usar ->
  • Permitir que el ancho y la altura sean más grandes de lo necesario para evitar tener que calcularlos con precisión (lo que requeriría un código adicional)

Cosas que duelen:

  • No hay forma integrada de contar el número de caracteres en una cadena (de todos modos, podría haber sido más largo)
  • Sin funciones mínimas / máximas incorporadas, por lo tanto, es necesario desperdiciar 27 caracteres para importar la biblioteca que lo hace (menos que definir la nuestra)
mcreenan
fuente
1

C - 273 bytes - con entrada interactiva!

#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);}}

El campo se imprime cada vez que se ingresa un personaje y crece si la cabeza de la serpiente se acerca al borde. No sé cuán portátil es: alguien en Internet dijo que getch () no funciona en plataformas que no son de Windows. Es difícil decir si ASCII 1 se verá como una cara sonriente tampoco.

La versión de golf es bastante molesta ya que no hay forma de salir con gracia del programa. Control-C no funciona para mí. Por otro lado, la versión no protegida termina si se ingresa un carácter que no sea 'w', 'a', 's' o 'd'.

Los llamados "no golfistas":

#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;
}
Feersum
fuente
1

05AB1E , 23 bytes

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

Pruébalo en línea!

Explicación:

                      # 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!

Mugriento
fuente