Beristirahatlah untuk membuat ular!

23

Ular klasik kami telah mengembangkan ketidakseimbangan hormon pertumbuhan . Lebih buruk lagi, ekornya membeku di tempat! Diberikan masukan terarah seperti yang ditentukan dalam Figure 1, menulis program untuk menentukan di mana ia akan tumbuh

WAS

Gambar 1. Input terarah.

Spesifikasi program

  • Baca input karakter dengan karakter aktif STDIN.
  • Setelah membaca karakter, output ular ke STDOUT. Harap sertakan garis kosong di antara setiap kali Anda mencetak ular.
  • Ular itu terdiri atas <>v^dan satu kepala. Kepala ular mungkin setiap karakter putaran yang Anda pilih, seperti o, 0, O, atau .
  • Kombinasi apa wasdpun valid untuk input.
  • Program Anda tidak boleh berasumsi bahwa input berada dalam jangka waktu tertentu.
  • Ular itu bisa bertumpuk, menimpa <>v^. Lihat contoh untuk mekanika pertumbuhan ular.
  • Mengejar ruang kosong tidak apa-apa, tetapi ular Anda harus terlihat benar.

Mencetak gol

Ini adalah . Skor Anda adalah jumlah karakter dalam program Anda. Menang skor terendah!

Contoh ular:

Memasukkan: ddddssaassdddddww

Keluaran:

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

Memasukkan: dddsssaaawww

Keluaran:

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

Memasukkan: dddsssdddddasddddwww

Keluaran:

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

Memasukkan: dddwwdddssssaaaaaaaaawww

Keluaran:

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

Memasukkan: ddddssssaawwddddd

Keluaran:

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

Memasukkan: dddddssaawwwwddddd

Keluaran:

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

Memasukkan:

ddddaaaasssssdddddddddddwwwwwaaaasssssdddddddddddwwwwwwwwwwsssssaaaasssssdddddddwwwwwddddssaaaasssddddaaaassssssssssdddwwwwwwwddddswaaaassssddaasssaaaaaaaaaawwwwddddssssaaaaaaaaaaawwwwddddsssssssssaaaa

Keluaran:

                  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
sumber
8
Sangat bagus. Tapi ... WTH adalah "kode gofl"?
John Dvorak
2
Saya akan menghilangkan bonus karena terlalu mudah untuk membuat ular dan string input Anda sendiri.
Beta Decay
1
@ JanDvorak rotfl bad saya.
hmatt1
1
@BetaDecay timbangan pesawat. Dalam contoh kode golf itu dimulai di kiri atas c, tetapi karena d lebih tinggi bergerak ke bawah.
hmatt1
2
@chememagic Terima kasih! Jika keduanya dapat diterima, Anda mungkin harus menjelaskan ini dalam pertanyaan.
Ingo Bürk

Jawaban:

5

Ruby, 207 karakter

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}

Tidak Disatukan:

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}

(lambda untuk amenulis kembali karena baris tugas di atas menulis tidak lagi di papan tulis)

John Dvorak
sumber
11

ECMAScript 6 Javascript (399 401 431 )

Harus dijalankan di browser yang mendukung ECMAScript 6 karena fungsi panah.

Berikut adalah biola yang telah diubah untuk berjalan di peramban (umum) apa pun dengan tidak menggunakan fungsi panah. Mereka juga mencetak ke textarea:

Versi 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 animasi:

Salah satu contoh OP:

masukkan deskripsi gambar di sini

Contoh dari Stretch Maniac :

masukkan deskripsi gambar di sini

Tidak disatukan

Berikut ini adalah (sedikit) versi ungolfed dari waktu sebelum saya mulai benar-benar bermain golf bawah:

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
sumber
Gifnya sangat keren. Apakah itu dibuat secara otomatis, dengan skrip yang Anda tulis?
AndoDaan
1
Terima kasih! Dengan kekuatan Google, saya hanya mencari cara membuat hadiah dari rekaman layar di Ubuntu. Hanya menggunakan perekam layar dan convert. Cukup mudah :)
Ingo Bürk
3
(gif, bukan hadiah)
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'

Pendekatan yang sama dengan jawaban saya sebelumnya, tetapi memposisikan kursor dengan benar sebelum dan sesudahnya. Saya cukup bangga dengan pendekatan penentuan posisi kursor - pada dasarnya, ia menjalankan ular secara terbalik, tanpa mencetak karakter.

Sneftel
sumber
1
Bisakah Anda menambahkan contoh panggilan? 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/$/@/'tidak memberikan hasil yang benar untuk saya.
Ingo Bürk
Permintaan Anda setelah mengeksekusi mungkin menimpa bagian dari ular. Rekatkan ular langsung ke stdin alih-alih perpipaan, atau tambahkan beberapa \ns setelah perintah @Anda masuk ke tempat lain.
Sneftel
1
Ini mungkin gagal jika ular naik atau ke kiri papan.
tomsmeding
@tommeding Ya, saya mungkin mengembangkannya untuk menghadapinya. Selain bahasa, saya benar-benar berpikir urutan kontrol ANSI adalah cara untuk mencari kode yang lebih pendek.
Sneftel
3

Java - 646

Mungkin juga yang pertama!

Saya yakin Anda semua bisa mengalahkan ini.

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

Lebih kecil -

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

masukan - dddsssdddwwwwaaaaaaaassssssssssddddddddddddddddd

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

masukan - dddsssddddasddddwww

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

favorit pribadi saya - 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^   
                              ^<<<                        >^  
Regangkan Maniac
sumber
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");}}}}

"Tidak digabungkan" dengan spasi putih (ini tidak akan disinkronkan dengan versi 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");
            }
        }
    }
}
Bob
sumber
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()

Saya memutuskan untuk menyimpan ular di dalam dikt, dengan koordinat untuk kunci. Kemudian temukan dan ulangi rentang output, gantikan ruang kosong.

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. Golf pertama saya :) Beri tahu saya jika jawaban saya tidak tepat

Gilly
sumber
Menggunakan Obukannya menghemat 2 byte. adalah herring merah.
Erik the Outgolfer
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ sebenarnya tidak dihitung sebagai 3 byte.
Martin Ender
@ MartinEnder Pasti , pengkodean default adalah UTF-8. Saya punya perasaan itu tidak dihitung. Saya punya perasaan itu kebetulan dan harus segera diperbaiki oleh Gilly.
Erik the Outgolfer
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Yah secara teknis, penjawab bebas menggunakan pengodean apa pun yang didukung oleh penerjemah mereka (dan saya cukup yakin beberapa halaman kode yang kompatibel dengan ASCII berisi karakter itu) tapi itu intinya. Saya mengatakan jumlah byte sudah sama dengan menggunakan O, jadi saya tidak akan khawatir tentang hal itu. Jelas dari kode bahwa itu masih akan berfungsi untuk karakter lain tetapi menggunakan memungkinkan Anda dengan mudah menjalankan kasus uji dari tantangan tanpa perubahan.
Martin Ender
@MartinEnder Python menggunakan UTF-8, dibuktikan dengan kemampuannya untuk mendukung string unicode. Untuk mengaktifkan fungsi ini, baris pertama atau kedua harus #coding=utf-8. Catatan yang #coding=utf-16tidak berfungsi. Karenanya harus dihitung sebagai 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)))

Versi tidak disatukan

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
sumber
2
Selamat Datang di Programming Puzzles & Code Golf! Menurut aturan yang diuraikan di pusat bantuan kami , semua solusi untuk tantangan harus menjadi pesaing serius untuk kriteria kemenangan yang digunakan. Sebagai contoh, entri ke kontes golf kode harus golf.
Dennis
1
Saya menambahkan jumlah byte untuk Anda, tetapi ada cukup banyak ruang yang tidak perlu di sana yang mungkin ingin Anda hapus.
Martin Ender
Terima kasih teman-teman, saya membuat perubahan yang diperlukan pada entri pertama saya. Setiap saran tambahan akan sangat dihargai.
Adriaan Erasmus
Saya benar-benar bermain golf .
Erik the Outgolfer
@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Itu baru dicetak SyntaxError: invalid syntax.
Dennis
2

05AB1E , 35 34 30 28 byte

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

Digunakan 0sebagai kepala ular.

-4 byte terima kasih kepada @Grimy .

Cobalah secara online (tidak ada rangkaian uji untuk semua kasus uji sekaligus, karena tidak ada cara untuk mengatur ulang Kanvas, sehingga output akan tumpang tindih ..).

Penjelasan:

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

Lihat tip tambang 05AB1E ini (bagian Bagaimana mengompresi string bukan bagian dari kamus? Dan Bagaimana mengompresi bilangan bulat besar? ) Untuk memahami mengapa .•₃º•ini "adsw"dan ŽO^sekarang 6240.

Adapun penjelasan singkat tentang Canvas builtin Λdan tiga argumennya:

Argumen pertama: length (s): ukuran garis yang ingin kita gambar. Karena kita harus ingat tumpang tindih, kita menggunakan ukuran 2 untuk setiap karakter, dan 1 tambahan untuk kepala ular.
Argumen kedua: string: karakter yang ingin kita tampilkan. Yang merupakan karakter dalam kasus ini, ditambahkan dengan karakter kepala ular.
Argumen ketiga: direction (s): arah garis karakter ini dari panjang yang diberikan harus ditarik. Secara umum kita memiliki arah [0,7]yang memetakan ke arah ini:

7   0   1
    
6  X  2
    
5   4   3

6240[,,,]

Lihat tip tambang 05AB1E ini untuk penjelasan lebih terperinci tentang kanvas bawaan Λ.

Kevin Cruijssen
sumber
1
Saya mungkin telah melewatkan sesuatu, tetapi saya pikir tidak γdiperlukan sama sekali. Ini sepertinya bekerja dengan baik.
Grimmy
@Grimy Terima kasih, memang benar; pendekatan alternatif yang bagus dengan daftar 2s dan 1 untuk kepala! Dan saya sudah bisa menghemat 2 byte lagi berdasarkan program Anda.
Kevin Cruijssen
Terima kasih! Saya saat ini berusia 23 tahun , meskipun itu pendekatan yang sangat berbeda, jadi saya bisa membuat jawabannya sendiri jika itu baik-baik saja oleh Anda.
Grimmy
@ Grimy Itu memang pendekatan yang sangat berbeda dari saya, jadi jangan ragu untuk mempostingnya. Saya memang agak mengharapkan beberapa konversi unicode dan modulo mungkin membuat ini lebih pendek daripada transliterate, tapi saya cukup jujur ​​dengan konversi integer / string sulap. :)
Kevin Cruijssen
1

Perl - 394

Bukan yang terpendek, tapi itu mengalahkan Javascript, C # dan Java setidaknya.

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 

Beberapa trik:

  • Peringatan dan ketat tidak dihidupkan untuk mengizinkan kata kunci dan tidak mendeklarasikan variabel sebelum menggunakannya
  • Koma tipis, bukan koma tebal untuk menghemat beberapa karakter
  • Tidak menetapkan nilai awal untuk variabel bila tidak perlu
  • Meninggalkan semi-titik dua jika memungkinkan
  • Menentukan array dan hash bukan sebagai referensi untuk menghindari keharusan menggunakan ->
  • Mengizinkan lebar, tinggi lebih besar dari yang diperlukan untuk menghindari keharusan menghitungnya secara akurat (yang akan membutuhkan kode tambahan)

Hal-hal yang menyakitkan:

  • Tidak ada cara bawaan untuk menghitung jumlah karakter dalam string (toh mungkin lebih lama)
  • Tidak ada fungsi min / maks bawaan, sehingga perlu membuang 27 karakter untuk mengimpor perpustakaan yang melakukannya (kurang mendefinisikan kita sendiri)
mcreenan
sumber
1

C - 273 byte - dengan Input Interaktif!

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

Bidang dicetak setiap kali karakter dimasukkan dan tumbuh jika kepala ular mendekati tepi. Saya tidak tahu seberapa portabelnya - seseorang di Internet mengatakan getch () tidak berfungsi pada platform non-Windows. Sulit mengatakan apakah ASCII 1 akan terlihat seperti wajah yang tersenyum.

Versi golfnya cukup menjengkelkan karena tidak ada cara untuk keluar dari program dengan anggun. Control-C tidak bekerja untuk saya. Di sisi lain, versi yang tidak disatukan berakhir jika karakter selain 'w', 'a', 's', atau 'd' dimasukkan.

Apa yang disebut "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
sumber
1

05AB1E , 23 byte

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

Cobalah online!

Penjelasan:

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

Grimmy
sumber