Machen Sie eine Pause, um eine Schlange zu machen!

23

Unsere klassische Schlange hat ein Ungleichgewicht von Wachstumshormonen entwickelt . Um die Sache noch schlimmer zu machen, ist sein Schwanz eingefroren! Figure 1Schreiben Sie bei richtungsgebundener Eingabe wie in angegeben ein Programm, um zu bestimmen, wo er wachsen wird.

wasd

Abbildung 1. Directional Input.

Programmspezifikationen

  • Lesen Sie die Eingabe zeichenweise ein STDIN.
  • Nachdem Sie ein Zeichen gelesen haben, geben Sie die Schlange an aus STDOUT. Bitte fügen Sie zwischen jedem Ausdruck einer Schlange eine Leerzeile ein.
  • Die Schlange besteht aus <>v^und einem Kopf. Der Kopf der Schlange kann jede Runde Charakter Ihrer Wahl sein, wie o, 0, Ooder .
  • Jede Kombination von wasdist für die Eingabe gültig.
  • Ihr Programm sollte nicht davon ausgehen, dass die Eingabe innerhalb einer bestimmten Länge liegt.
  • Die Schlange kann sich überschreiben <>v^. Beispiele für die Mechanik des Schlangenwachstums.
  • Nachgestellte Leerzeichen sind in Ordnung, aber Ihre Schlange muss korrekt aussehen.

Wertung

Das ist . Ihre Punktzahl ist die Anzahl der Zeichen in Ihrem Programm. Die niedrigste Punktzahl gewinnt!

Beispiel Schlangen:

Eingang: ddddssaassdddddww

Ausgabe:

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

Eingang: dddsssaaawww

Ausgabe:

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

Eingang: dddsssdddddasddddwww

Ausgabe:

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

Eingang: dddwwdddssssaaaaaaaaawww

Ausgabe:

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

Eingang: ddddssssaawwddddd

Ausgabe:

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

Eingang: dddddssaawwwwddddd

Ausgabe:

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

Eingang:

ddddaaaasssssdddddddddddwwwwwaaaasssssdddddddddddwwwwwwwwwwsssssaaaasssssdddddddwwwwwddddssaaaasssddddaaaassssssssssdddwwwwwwwddddswaaaassssddaasssaaaaaaaaaawwwwddddssssaaaaaaaaaaawwwwddddsssssssssaaaa

Ausgabe:

                  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
quelle
8
Sehr schön. Aber ... WTH ist ein "Code Gofl"?
John Dvorak
2
Ich würde den Bonus loswerden, da es viel zu einfach ist, eine eigene Schlange und einen eigenen Eingabestring zu erstellen.
Beta Decay
1
@JanDvorak rotfl mein schlechtes.
hmatt1
1
@BetaDecay das Flugzeug skaliert. Im Codegolf-Beispiel hat es oben links am c begonnen, aber da das d höher ist, bewegt es sich nach unten.
hmatt1
2
@chilemagic Danke! Wenn beides akzeptabel ist, sollten Sie dies wahrscheinlich in der Frage klären.
Ingo Bürk

Antworten:

5

Ruby, 207 Zeichen

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}

(Das Lambda für aschreibt zurück, weil die Zeile, in die die obige Zuweisung schreibt, nicht mehr auf dem Board ist.)

John Dvorak
quelle
11

ECMAScript 6 Javascript (399 401 431 )

Muss aufgrund der Pfeilfunktionen in einem Browser ausgeführt werden, der ECMAScript 6 unterstützt.

Hier sind Fiddles, die so geändert wurden, dass sie in jedem (gängigen) Browser ohne Verwendung von Pfeilfunktionen ausgeführt werden können. Sie drucken textareastattdessen auch auf a :

Golf Version

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

Animiertes GIF:

Eines der Beispiele des OP:

Bildbeschreibung hier eingeben

Das Beispiel von Stretch Maniac :

Bildbeschreibung hier eingeben

Ungolfed

Hier ist eine (etwas) ungolfed Version von irgendwann, bevor ich angefangen habe, richtig Golf zu spielen:

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
quelle
Die Gifs sind sehr cool. Werden sie automatisch von einem Skript erstellt, das Sie geschrieben haben?
AndoDaan
1
Vielen Dank! Mit der Kraft von Google habe ich gerade nachgeschlagen, wie man aus einer Bildschirmaufnahme in Ubuntu ein Geschenk macht. Es wird nur ein Bildschirmschreiber verwendet und convert. Ziemlich einfach :)
Ingo Bürk
3
(GIF, kein Geschenk)
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'

Gleicher Ansatz wie meine vorherige Antwort, aber Cursor vor und nachher richtig positionieren. Ich bin ziemlich stolz auf den Ansatz der Cursorpositionierung - im Grunde läuft die Schlange zuerst rückwärts, ohne Zeichen auszudrucken.

Sneftel
quelle
1
Können Sie einen Beispielaufruf hinzufügen? 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/$/@/'gibt nicht die richtige Ausgabe für mich.
Ingo Bürk
Ihre Eingabeaufforderung überschreibt nach der Ausführung wahrscheinlich einen Teil der Schlange. Fügen Sie die Schlange direkt in stdin ein, anstatt sie weiterzuleiten, oder fügen Sie einige \nSekunden nach dem ein, @damit Ihre Aufforderung an eine andere Stelle wechselt.
Sneftel
1
Dies kann fehlschlagen, wenn die Schlange nach oben oder links vom Brett geht.
Tomsmeding
@tomsmeding Ja, ich könnte es erweitern, um damit umzugehen. Abgesehen von der Sprache denke ich jedoch, dass ANSI-Steuersequenzen der richtige Weg für kürzeren Code sind.
Sneftel
3

Java - 646

Könnte auch der erste sein!

Ich wette, Sie alle können das schlagen.

un (irgendwie) golfed

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

Kleiner -

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

eingabe - dddsssdddwwwwaaaaaaassssssssssddddddddddddddddd

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

Eingabe - dddsssdddddasddddwww

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

mein persönlicher Favorit - 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^   
                              ^<<<                        >^  
Stretch Maniac
quelle
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" mit Leerzeichen (dies wird nicht mit der Golfversion synchronisiert):

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");
            }
        }
    }
}
Bob
quelle
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()

Ich beschloss, die Schlange in einem Diktat mit Koordinaten für die Schlüssel aufzubewahren. Suchen Sie dann den Ausgabebereich, und durchlaufen Sie ihn. Ersetzen Sie dabei Leerzeichen.

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. Mein erster Golf :) Lassen Sie mich wissen, wenn meine Antwort unangemessen ist

Gilly
quelle
Mit Ostatt sparen Sie 2 Bytes. ist ein roter Hering.
Erik der Outgolfer
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ wurde eigentlich nicht als 3 Byte gezählt.
Martin Ender
@MartinEnder Es muss sein , die Standardkodierung ist UTF-8. Ich hatte das Gefühl, dass es nicht gezählt wurde. Ich habe das Gefühl, es war ein Zufall und muss sofort von Gilly behoben werden.
Erik der Outgolfer
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Technisch gesehen kann der Antwortende jede vom Interpreter unterstützte Codierung verwenden (und ich bin mir ziemlich sicher, dass eine ASCII-kompatible Codepage dieses Zeichen enthält), aber das ist nicht der springende Punkt. Ich sage, die Anzahl der Bytes ist bereits die gleiche wie bei der Verwendung O, daher würde ich mir darüber keine Sorgen machen. Aus dem Code geht hervor, dass es immer noch für jedes andere Zeichen funktionieren würde, aber mit können Sie die Testfälle der Challenge bequem und ohne Änderungen ausführen.
Martin Ender
@MartinEnder Python verwendet UTF-8, was sich in der Unterstützung von Unicode-Strings zeigt. Um diese Funktionalität zu aktivieren, muss die erste oder zweite Zeile sein #coding=utf-8. Beachten Sie, dass #coding=utf-16dies nicht funktioniert. Daher muss als 3. gezählt werden
Erik der 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)))

Ungolfed-Version

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
quelle
2
Willkommen bei Programming Puzzles & Code Golf! Gemäß den Regeln in unserer Hilfe sollten alle Lösungen für Herausforderungen ein ernstzunehmender Anwärter auf die verwendeten Gewinnkriterien sein. Beispielsweise muss eine Teilnahme an einem Codegolfwettbewerb golfen werden.
Dennis
1
Ich habe die Byteanzahl für Sie hinzugefügt, aber es gibt eine Menge unnötiger Leerzeichen, die Sie möglicherweise entfernen möchten.
Martin Ender
Danke Jungs, ich habe die notwendigen Änderungen an meinem ersten Eintrag vorgenommen. Jeder zusätzliche Rat wird sehr geschätzt.
Adriaan Erasmus
Ich habe wirklich Golf gespielt .
Erik der Outgolfer
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Das druckt einfach SyntaxError: invalid syntax.
Dennis
2

05AB1E , 35 34 30 28 Bytes

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

Verwendet 0als Kopf der Schlange.

-4 Bytes dank @Grimy .

Probieren Sie es online aus (keine Testsuite für alle Testfälle gleichzeitig, da der Canvas-Bereich nicht zurückgesetzt werden kann und sich die Ausgaben überlappen würden.).

Erläuterung:

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

Sehen Sie sich meinen Tipp 05AB1E an (Abschnitte So komprimieren Sie Zeichenfolgen, die nicht Teil des Wörterbuchs sind, und So komprimieren Sie große Ganzzahlen ), um zu verstehen, warum dies so .•₃º•ist "adsw"und ŽO^ist 6240.

Zur kurzen Erläuterung des Canvas-Buildins Λund seiner drei Argumente:

Erstes Argument: Länge (n): Die Größe der Linien, die wir zeichnen möchten. Da wir Überlappungen berücksichtigen müssen, verwenden wir Größe 2 für jedes Zeichen und eine zusätzliche 1 für den Kopf der Schlange.
Zweites Argument: Zeichenfolge (n): Die Zeichen, die wir anzeigen möchten. Welches sind in diesem Fall die Zeichen, denen das Kopfzeichen der Schlange angehängt ist?
Drittes Argument: Richtung (en): Die Richtungen, in die diese Zeichenlinien der angegebenen Länge gezeichnet werden sollen. Im Allgemeinen haben wir die Richtungen, [0,7]die diesen Richtungen entsprechen:

7   0   1
    
6  X  2
    
5   4   3

6240[,,,]

In diesem meiner Tipps zu 05AB1E finden Sie eine detailliertere Erläuterung der Canvas-Funktion Λ.

Kevin Cruijssen
quelle
1
Vielleicht habe ich etwas verpasst, aber ich glaube nicht, dass γes überhaupt nötig ist. Dies scheint gut zu funktionieren.
Grimmy
@ Grimy Danke, das tut es in der Tat; netter alternativer Ansatz mit der Liste von 2s und 1 für den Kopf! Und ich konnte 2 weitere Bytes basierend auf Ihrem Programm speichern.
Kevin Cruijssen
Vielen Dank! Ich bin zur Zeit 23 Jahre alt, obwohl das ein signifikant anderer Ansatz ist, also könnte ich es mir zu einer eigenen Antwort machen, wenn es Ihnen recht ist.
Grimmy
@Grimy Das ist in der Tat ein ganz anderer Ansatz als meiner, also zögern Sie nicht, ihn zu posten. Ich hatte in der Tat ein bisschen eine Unicode-Konvertierung erwartet und Modulo könnte dies kürzer machen als das Transliterat, aber ich bin ehrlich gesagt ziemlich schlecht mit solchen magischen Integer / String-Konvertierungen. :)
Kevin Cruijssen
1

Perl - 394

Nicht die kürzeste, aber sie schlägt mindestens Javascript, C # und 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 

Einige Tricks:

  • Warnungen und strikte nicht aktiviert, um Barewords zuzulassen und Variablen nicht zu deklarieren, bevor sie verwendet werden
  • Dünne Kommas anstelle von fetten Kommas, um ein paar Zeichen zu speichern
  • Keine Anfangswerte für Variablen festlegen, wenn dies nicht erforderlich ist
  • Wenn möglich Semikolons weglassen
  • Definieren Sie Arrays und Hashes nicht als Referenzen, um die Verwendung von -> zu vermeiden
  • Zulassen, dass Breite und Höhe größer als erforderlich sind, um zu vermeiden, dass sie genau berechnet werden müssen (was zusätzlichen Code erfordern würde)

Dinge, die weh tun:

  • Keine eingebaute Möglichkeit, die Anzahl der Zeichen in einer Zeichenfolge zu zählen (hätte ohnehin länger dauern können)
  • Keine eingebauten Min / Max-Funktionen, daher müssen 27 Zeichen verschwendet werden, um die Bibliothek zu importieren, die dies tut (weniger als das Definieren unserer eigenen)
Mcreenan
quelle
1

C - 273 Bytes - mit interaktiver Eingabe!

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

Das Feld wird bei jeder Eingabe eines Zeichens gedruckt und wächst, wenn sich der Kopf der Schlange dem Rand nähert. Ich weiß nicht, wie portabel es ist - jemand im Internet hat gesagt, getch () funktioniert nicht auf Nicht-Windows-Plattformen. Schwer zu sagen, ob ASCII 1 auch wie ein Smiley aussieht.

Die Golfversion ist ziemlich nervig, da es keine Möglichkeit gibt, das Programm ordnungsgemäß zu beenden. Control-C funktioniert bei mir nicht. Auf der anderen Seite endet die ungolfed Version, wenn ein anderes Zeichen als 'w', 'a', 's' oder 'd' eingegeben wird.

So genannte "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;
}
Feersum
quelle
1

05AB1E , 23 Bytes

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

Probieren Sie es online!

Erläuterung:

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

Grimmig
quelle