Bir yılan yapmak için bir mola verin!


23

Klasik yılanımız bir büyüme hormonu dengesizliği geliştirdi . Sorunları daha kötü hale getirmek için kuyruğu yerinden donmuş! Belirtildiği şekilde Figure 1, yönlü girdi verildiğinde , nerede büyüyeceğini belirlemek için bir program yazın.

wasd

Şekil 1. Yön girişi.

Program özellikleri

  • Giriş karakterini karakter üzerine oku STDIN.
  • Bir karakter, okuduktan sonra çıktı üretmesi için yılan STDOUT. Lütfen bir yılanı her yazdırdığınızda arasına boş bir satır ekleyin.
  • Yılan <>v^bir kafa oluşur . Yılanın başı herhangi yuvarlak sizin seçtiğiniz karakter gibi olabilir o, 0, Oveya .
  • Herhangi bir kombinasyonu wasdgiriş için geçerlidir.
  • Programınız, girişin belirli bir uzunlukta olduğunu varsaymamalıdır.
  • Yılan üstüne yazılabilir <>v^. Yılan yetiştirme mekaniği için örneklere bakın.
  • İzleyen boşluklar tamam, ama yılanın düzgün görünmeli.

puanlama

Bu . Puanınız, programınızdaki karakter sayısıdır. En düşük puan kazanır!

Örnek yılanlar:

Giriş: ddddssaassdddddww

Çıktı:

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

Giriş: dddsssaaawww

Çıktı:

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

Giriş: dddsssdddddasddddwww

Çıktı:

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

Giriş: dddwwdddssssaaaaaaaaawww

Çıktı:

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

Giriş: ddddssssaawwddddd

Çıktı:

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

Giriş: dddddssaawwwwddddd

Çıktı:

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

Giriş:

ddddaaaasssssdddddddddddwwwwwaaaasssssdddddddddddwwwwwwwwwwsssssaaaasssssdddddddwwwwwddddssaaaasssddddaaaassssssssssdddwwwwwwwddddswaaaassssddaasssaaaaaaaaaawwwwddddssssaaaaaaaaaaawwwwddddsssssssssaaaa

Çıktı:

                  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
Çok hoş. Ama ... WTH bir "kod gofl" mu?
John Dvorak

2
Kendi yılanınızı ve girdi dizginizi oluşturmak çok kolay olduğu için bonustan kurtulurdum.
Beta Çürüğü

1
@JanDvorak kötüye gitti.
hmatt1

1
@BetaDecay düzlem ölçekleri. Kod golf örneğinde c'nin sol üst köşesinde başladı, ancak d daha uzun olduğundan aşağı doğru hareket ediyor.
hmatt1

2
@chilemagic Teşekkürler! Her ikisi de kabul edilebilirse, muhtemelen soruyu açıklığa kavuşturmalısınız.
Ingo Bürk

Yanıtlar:


5

Yakut, 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}

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}

( ayukarıdaki atama yazılan satır artık tahtada olmadığı için lambda geri yazar)


11

ECMAScript 6 Javascript (399 401 431 )

Ok fonksiyonlarından dolayı ECMAScript 6'yı destekleyen bir tarayıcıda çalıştırılmalıdır.

İşte herhangi bir (genel) tarayıcıda ok işlevlerini kullanarak çalıştırılmak üzere değiştirilen kemanlar. Ayrıca textareabunun yerine:

Golf Sürümü

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

Animasyonlu GIF:

OP'nin örneklerinden biri:

görüntü tanımını buraya girin

Streç Maniac'tan örnek :

görüntü tanımını buraya girin

Ungolfed

İşte gerçekten aşağıya golf oynamaya başlamadan önce bir aradan (biraz) ungolfed versiyonu :

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

Gifler çok havalı. Yazdığınız bir komut dosyası tarafından otomatik olarak mı oluşturulur?
AndoDaan

1
Teşekkürler! Google’ın gücü ile Ubuntu’daki ekran kayıtlarından nasıl hediye alabileceğimi aradım. Sadece bir ekran kaydedici kullanır ve convert. Oldukça kolay :)
Ingo Bürk

3
(gif, armağan değil)
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'

Önceki cevabım ile aynı yaklaşım, ancak imleci önce ve sonra doğru şekilde konumlandırmak. İmleç konumlandırma yaklaşımıyla gurur duyuyorum - temel olarak, önce yılanı karakterleri basmadan tersten çalıştırır.


1
Örnek bir çağrı ekleyebilir misiniz? 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/$/@/'benim için doğru çıktıyı vermiyor.
Ingo Bürk

Çalıştırdıktan sonra sormanız muhtemelen yılanın bir kısmının üzerine yazıyordur. Yılanı boru yerine doğrudan stdin içine yapıştırın veya istemenizin başka bir yere gitmesi için birkaç \nsaniye sonra ekleyin @.
Sneftel

1
Yılan tahtaya çıkarsa veya çıkarsa bu başarısız olabilir.
Ağustos'ta

@tomsmeding Evet, bununla baş etmek için genişletebilirim. Dil bir yana, ANSI kontrol dizilerinin gerçekten daha kısa kodlara gitmenin yolu olduğunu düşünüyorum.
Sneftel

3

Java - 646

İlk kişi sen ol!

Eminim hepiniz bunu yenebilirsiniz.

un (tür) 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();}
    }
}

Daha küçük -

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

giriş - dddsssdddwwwwaaaaaaaassssssssssddddddddddddddddddd

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

giriş - dddsssdddddasddddwww

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

benim kişisel favori - 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");}}}}

Boşluk ile "Ungolfed" (bu golf sürümüyle senkronize edilmeyecektir):

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 Bayt

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

Yılanı anahtarlar için koordinatlarla dikte tutmaya karar verdim. Ardından, boşluklar yerine, çıktı aralığını bulun ve yineleyin.

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. İlk Golfüm :) Cevabımın uygunsuz olup olmadığını bana bildirin


OBunun yerine kullanmak size 2 byte kazandırır. kırmızı bir ringa balığı.
Outgolfer Erik,

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ aslında 3 bayt olarak sayılmadı.
Martin Ender

@MartinEnder Öyle olmalı , varsayılan kodlama UTF-8. Sayılmadığını hissediyorum. Bunun tesadüf olduğunu ve hemen Gilly tarafından düzeltilmesi gerektiğini hissediyorum.
Outgolfer Erik,

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Teknik olarak, cevaplayıcı, tercümanı tarafından desteklenen herhangi bir kodlamayı kullanmakta özgürdür (ve bazı ASCII uyumlu kod sayfalarının bu karakteri içerdiğinden eminim), ancak konunun dışında. Bayt sayısının zaten kullanmakla aynı olduğunu söylüyorum O, bu yüzden endişelenmem. Yine de başka bir karakter için işe yarayacağı kodundan anlaşılır, ancak kullanımı test testlerini değişiklik yapmadan zorlu görevlerden kolayca çalıştırmanıza olanak tanır.
Martin Ender

@MartinEnder Python, unicode karakter dizilerini destekleme yeteneği ile kanıtlanan UTF-8'i kullanır. Bu işlevi etkinleştirmek için, ilk veya ikinci satır olmalıdır #coding=utf-8. Not #coding=utf-16çalışmıyor. Bu nedenle 3 olarak sayılmalıdır
Outgolfer Erik

2

Python 2,7 - 274 bayt

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 versiyonu

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
Programlama Bulmacaları ve Kod Golf'üne Hoşgeldiniz! Yardım merkezimizde belirtilen kurallara göre , zorluklara yönelik tüm çözümler kullanımdaki kazanan kriterler için ciddi bir rakip olmalıdır. Örneğin, bir kod golf yarışmasına bir giriş golfe atılmalıdır.
Dennis,

1
Sizin için bayt sayısını ekledim, ancak içinde kaldırmak isteyebileceğiniz çok fazla gereksiz alan var.
Martin Ender

Teşekkürler millet, ilk girişimde gerekli değişiklikleri yaptım. Herhangi bir ilave tavsiye çok takdir edilecektir.
Adriaan Erasmus


@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Bu sadece yazdırır SyntaxError: invalid syntax.
Dennis,

2

05AB1E , 35 34 30 28 bayt

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

0Yılanın başı olarak kullanır .

@Grimy sayesinde -4 bayt .

Çevrimiçi deneyin (tüm test durumları için aynı anda test paketi yoktur, çünkü Kanvas'ı sıfırlamanın bir yolu yoktur, bu nedenle çıktılar üst üste gelir ..).

Açıklama:

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

Benim bu 05AB1E ucu bakın (bölümler Nasıl kompres dizeleri sözlükte parçası? İçin ve ne kadar büyük tamsayılar sıkıştırmak için? ) Anlamak için .•₃º•ise "adsw"ve ŽO^olup 6240.

Canvas yerleşiminin Λve onun üç argümanının kısa bir açıklaması için :

İlk argüman: uzunluk (lar): çizmek istediğimiz çizgilerin boyutları. Çakışmayı aklımızda tutmamız gerektiğinden, her karakter için 2 beden ve yılan başı için 1 ek kullanırız.
İkinci argüman: string (s): Görüntülemek istediğimiz karakterler. Bu durumda hangi karakterler, yılanın baş karakteriyle eklenmiş.
Üçüncü argüman: yön (ler): verilen uzunluktaki bu karakter çizgilerinin çizilmesi gereken yönler. Genel [0,7]olarak bu yönlere eşleştiren yönlere sahibiz :

7   0   1
    
6  X  2
    
5   4   3

6240[,,,]

Canvas yerleşimi hakkında daha ayrıntılı bir açıklama için bu 05AB1E ucuna bakın Λ.


1
Bir şeyi özlemiş olabilirim, ama hiç γde gerekli olduğunu sanmıyorum . Bu işe yarıyor gibi görünüyor.
Grimmy

@Grimy Teşekkürler, gerçekten; kafa için 2s ve 1 listesi ile güzel bir alternatif yaklaşım! Programınıza göre 2 bayt daha biriktirebildim.
Kevin Cruijssen

Teşekkürler! Şu anda 23 yaşındayım , ancak bu oldukça farklı bir yaklaşım, bu yüzden sizin için uygunsa cevabını kendim verebilirim.
Grimmy

@Grimy Gerçekten de benimkinden çok farklı bir yaklaşım, bu yüzden göndermekten çekinmeyin. Gerçekten de bazı unicode dönüşümler bekliyordum ve modulo transliterattan daha kısa hale getirebilirdi, ama bu tür sihirli tamsayı / string dönüşümleri konusunda oldukça dürüstüm. :)
Kevin Cruijssen

1

Perl - 394

En kısa değil, ama en azından Javascript, C # ve Java'yı geçiyor.

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 

Bazı püf noktaları:

  • Uyarılar ve kesin, korkaklığa izin vermek ve kullanılmadan önce değişken bildirmemek için açılmamış
  • Birkaç karakter kaydetmek için yağ virgül yerine ince virgül
  • Gerekli olmadığında değişkenler için başlangıç ​​değerleri ayarlamama
  • Mümkün olduğunda noktalı virgül bırakma
  • Kullanmaktan kaçınmak için olmayan dizileri ve karmaları referans olarak tanımlama ->
  • Genişlik, yükseklik değerlerinin doğru hesaplanması gerekmemek için gerekenden daha büyük olmasına izin verilmesi (ekstra kod alacaktır)

Acıyan şeyler:

  • Bir dizedeki karakter sayısını saymanın yerleşik bir yolu yoktur (yine de daha uzun olabilirdi)
  • Dahili min / max işlevi yok, bu nedenle kütüphane ithal etmek için 27 karakter harcaması gerekmiyor (kendimizi tanımlamaktan az)

1

C - 273 bayt - Etkileşimli Girdi ile!

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

Her karakter girildiğinde alan yazdırılır ve yılanın başı kenara yaklaşırsa büyür. Ne kadar taşınabilir olduğunu bilmiyorum - İnternet'teki biri getch () 'in Windows dışı platformlarda çalışmadığını söyledi. ASCII 1'in gülen surat gibi görünüp görünmeyeceğini söylemek zor.

Programın incelikle çıkmanın bir yolu olmadığı için golf versiyonu oldukça can sıkıcı bir durum. Control-C benim için çalışmıyor. Öte yandan, ungolfed versiyonu 'w', 'a', 's' veya 'd' dışında bir karakter girilirse sona erer.

Sözde "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 bayt

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

Çevrimiçi deneyin!

Açıklama:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.