Hãy nghỉ ngơi để làm một con rắn!


23

Con rắn cổ điển của chúng tôi đã phát triển một sự mất cân bằng của hormone tăng trưởng . Để làm cho vấn đề tồi tệ hơn, đuôi của anh ta bị đóng băng tại chỗ! Đưa ra đầu vào định hướng như được chỉ định trong Figure 1, viết chương trình để xác định nơi anh ta sẽ phát triển.

đã

Hình 1. Đầu vào định hướng.

Thông số kỹ thuật của chương trình

  • Đọc ký tự đầu vào theo ký tự trên STDIN.
  • Sau khi đọc một ký tự, xuất con rắn sang STDOUT. Vui lòng bao gồm một dòng trống ở giữa mỗi lần bạn in một con rắn.
  • Con rắn bao gồm <>v^và một cái đầu. Người đứng đầu của con rắn có thể là bất kỳ nhân vật vòng lựa chọn của bạn, chẳng hạn như o, 0, O, hoặc .
  • Bất kỳ sự kết hợp nào wasdlà hợp lệ cho đầu vào.
  • Chương trình của bạn không nên cho rằng đầu vào nằm trong một độ dài nhất định.
  • Con rắn có thể chồng lên nhau, ghi đè lên <>v^. Xem ví dụ cho cơ chế phát triển rắn.
  • Trailing khoảng trắng là được, nhưng con rắn của bạn phải nhìn chính xác.

Chấm điểm

Đây là . Điểm của bạn là số lượng nhân vật trong chương trình của bạn. Điểm số thấp nhất chiến thắng!

Ví dụ rắn:

Đầu vào: ddddssaassdddddww

Đầu ra:

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

Đầu vào: dddsssaaawww

Đầu ra:

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

Đầu vào: dddsssdddddasddddwww

Đầu ra:

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

Đầu vào: dddwwdddssssaaaaaaaaawww

Đầu ra:

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

Đầu vào: ddddssssaawwddddd

Đầu ra:

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

Đầu vào: dddddssaawwwwddddd

Đầu ra:

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

Đầu vào:

ddddaaaasssssdddddddddddwwwwwaaaasssssdddddddddddwwwwwwwwwwsssssaaaasssssdddddddwwwwwddddssaaaasssddddaaaassssssssssdddwwwwwwwddddswaaaassssddaasssaaaaaaaaaawwwwddddssssaaaaaaaaaaawwwwddddsssssssssaaaa

Đầu ra:

                  v
                  v
                  v
                  v
                  v
v<<<<  v<<<<  v<<<<  >>>>v
v      v   ^  v   ^  ^   v
v      v   ^  v   ^  v<<<<
v      v   ^  v   ^  v
v      v   ^  v   ^  v
>>>>>>>>>>>>>>>>>>>>>v<<<<
                     v
                     v
                     v  v<<<<
                     v  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
Rất đẹp. Nhưng ... WTH là một "mã gofl"?
John Dvorak

2
Tôi sẽ thoát khỏi phần thưởng vì quá dễ để tạo con rắn và chuỗi đầu vào của riêng bạn.
Beta Decay

1
@JanDvorak thối rữa cái xấu của tôi.
hmatt1

1
@BetaDecay quy mô máy bay. Trong ví dụ về mã golf, nó bắt đầu ở phía trên bên trái của c, nhưng vì d cao hơn nên nó di chuyển xuống.
hmatt1

2
@chilemagic Cảm ơn! Nếu cả hai đều được chấp nhận, có lẽ bạn nên làm rõ điều này trong câu hỏi.
Ingo Bürk

Câu trả lời:


5

Ruby, 207 ký tự

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}

Ung dung:

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 cho aghi lại vì hàng được gán ở trên không còn trên bảng)


11

ECMAScript 6 Javascript (399 401 431 )

Phải được chạy trong trình duyệt hỗ trợ ECMAScript 6 do các chức năng mũi tên.

Dưới đây là những câu đố đã được thay đổi để chạy trong bất kỳ trình duyệt (phổ biến) nào bằng cách không sử dụng các chức năng mũi tên. Họ cũng in ra để textareathay thế:

Phiên bản chơi gôn

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 hoạt hình:

Một trong những ví dụ của OP:

nhập mô tả hình ảnh ở đây

Ví dụ từ Stretch Maniac :

nhập mô tả hình ảnh ở đây

Bị đánh cắp

Đây là một phiên bản (hơi) không được chỉnh sửa từ lúc nào đó trước khi tôi bắt đầu thực sự chơi nó xuống:

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

Các gifs rất mát mẻ. Chúng được tạo tự động, bởi một kịch bản bạn đã viết?
AndoDaan

1
Cảm ơn! Với sức mạnh của Google, tôi chỉ tìm kiếm cách tạo một món quà từ bản ghi màn hình trong Ubuntu. Nó chỉ sử dụng một máy ghi màn hình và convert. Khá dễ dàng :)
Ingo Bürk

3
(gif, không phải quà tặng)
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/$/@/

Golf, 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'

Cách tiếp cận tương tự như câu trả lời trước của tôi, nhưng định vị chính xác con trỏ trước và sau. Tôi khá tự hào về cách tiếp cận định vị con trỏ - về cơ bản, lần đầu tiên nó chạy con rắn ngược lại, mà không in ra các ký tự.


1
Bạn có thể thêm một cuộc gọi ví dụ? 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/$/@/'không cung cấp đầu ra chính xác cho tôi.
Ingo Bürk

Lời nhắc của bạn sau khi thực hiện có lẽ là ghi đè lên một phần của con rắn. Dán con rắn trực tiếp vào stdin thay vì đường ống, hoặc thêm một vài \ngiây sau khi @dấu nhắc của bạn đi nơi khác.
Sneftel

1
Điều này có thể thất bại nếu con rắn đi lên hoặc rời khỏi bảng.
tomsmeding

@tomsmeding Vâng, tôi có thể mở rộng nó để đối phó với điều đó. Mặc dù vậy, ngôn ngữ sang một bên, tôi thực sự nghĩ rằng các chuỗi điều khiển ANSI là cách để đi đến mã ngắn hơn.
Sneftel

3

Java - 646

Cũng có thể là người đầu tiên!

Tôi đặt cược tất cả các bạn có thể đánh bại điều này.

un (sắp xếp) chơi gôn

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

Nhỏ hơn -

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

đầu vào - dddsssdddwwwwaaaaaaaassssssssssdddddddddddddddddd

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

đầu vào - dddsssdddddasddddwww

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

một đời

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

2

C # 607

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

"Ungolfed" với khoảng trắng (điều này sẽ không được giữ đồng bộ với phiên bản được đánh gôn):

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

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

2

Python 3: 259 byte

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

Tôi quyết định lưu trữ con rắn trong một dict, với tọa độ cho các phím. Sau đó tìm và lặp lại trong phạm vi đầu ra, thay thế khoảng trắng.

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

Tái bút Golf đầu tiên của tôi :) Hãy cho tôi biết nếu câu trả lời của tôi không phù hợp


Sử dụng Othay vì tiết kiệm cho bạn 2 byte. là một cá trích đỏ.
Erik các Outgolfer

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ không thực sự được tính là 3 byte.
Martin Ender

@MartinEnder Phải là , mã hóa mặc định là UTF-8. Tôi có cảm giác nó không được tính. Tôi có cảm giác đó là sự tình cờ và phải được Gilly sửa chữa ngay lập tức.
Erik the Outgolfer

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Về mặt kỹ thuật, người trả lời có thể tự do sử dụng bất kỳ mã hóa nào được hỗ trợ bởi trình thông dịch của họ (và tôi khá chắc chắn một số trang mã tương thích ASCII có chứa ký tự đó) nhưng bên cạnh đó. Tôi đang nói rằng số byte đã giống như khi sử dụng O, vì vậy tôi sẽ không lo lắng về nó. Rõ ràng từ mã rằng nó vẫn sẽ hoạt động cho bất kỳ nhân vật nào khác, nhưng việc sử dụng cho phép bạn thuận tiện chạy các trường hợp thử nghiệm từ thử thách mà không thay đổi.
Martin Ender

@MartinEnder Python sử dụng UTF-8, được chứng minh bằng khả năng hỗ trợ chuỗi unicode. Để kích hoạt chức năng này, dòng đầu tiên hoặc thứ hai phải là #coding=utf-8. Lưu ý rằng #coding=utf-16không hoạt động. Do đó phải được tính là 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)))

Phiên bản ung dung

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
Chào mừng bạn đến với Câu đố lập trình & Code Golf! Theo các quy tắc được nêu trong trung tâm trợ giúp của chúng tôi , tất cả các giải pháp cho các thách thức phải là một ứng cử viên nghiêm trọng cho các tiêu chí chiến thắng được sử dụng. Ví dụ, một mục tham gia một cuộc thi golf mã cần phải được đánh gôn.
Dennis

1
Tôi đã thêm số byte cho bạn, nhưng có khá nhiều khoảng trống không cần thiết trong đó bạn có thể muốn xóa.
Martin Ender

Cảm ơn các bạn, tôi đã thực hiện những thay đổi cần thiết cho mục đầu tiên của tôi. Bất kỳ lời khuyên thêm sẽ được đánh giá rất cao.
Adriaan Erasmus


@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Mà chỉ in SyntaxError: invalid syntax.
Dennis

2

05AB1E , 35 34 30 28 byte

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

Sử dụng 0như đầu của con rắn.

-4 byte nhờ @Grimy .

Dùng thử trực tuyến (không có bộ kiểm tra cho tất cả các trường hợp thử nghiệm cùng một lúc, vì không có cách nào để đặt lại Canvas, vì vậy các kết quả đầu ra sẽ chồng lấp ..).

Giải trình:

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

Xem mẹo 05AB1E này của tôi (phần Cách nén chuỗi không phải là một phần của từ điển?Làm thế nào để nén số nguyên lớn? ) Để hiểu tại sao .•₃º•"adsw"ŽO^6240.

Đối với một lời giải thích ngắn gọn về nội dung Canvas Λvà ba đối số của nó:

Đối số đầu tiên: length (s): kích thước của các dòng chúng ta muốn vẽ. Vì chúng tôi phải ghi nhớ chồng chéo, chúng tôi sử dụng kích thước 2 cho mỗi ký tự và thêm 1 cho đầu rắn.
Đối số thứ hai: chuỗi (s): các ký tự chúng ta muốn hiển thị. Đó là những nhân vật trong trường hợp này, được gắn thêm nhân vật đầu của con rắn.
Đối số thứ ba: hướng (s): các hướng mà các dòng ký tự có độ dài đã cho nên được vẽ. Nói chung, chúng ta có các hướng [0,7]ánh xạ tới các hướng này:

7   0   1
    
6  X  2
    
5   4   3

Đó là lý do tại sao chúng ta có số nguyên 6240 cho các hướng[,,,] tương ứng.

Xem mẹo 05AB1E này của tôi để được giải thích chi tiết hơn về nội dung Canvas Λ.


1
Tôi có thể đã bỏ lỡ điều gì đó, nhưng tôi không nghĩ γlà cần thiết chút nào. Điều này dường như chỉ hoạt động tốt.
Grimmy

@Grimy Cảm ơn, nó thực sự làm; phương pháp thay thế tốt đẹp với danh sách 2s và 1 cho người đứng đầu! Và tôi đã có thể lưu thêm 2 byte dựa trên chương trình của bạn.
Kevin Cruijssen

Cảm ơn! Tôi hiện đang ở tuổi 23 , mặc dù đó là một cách tiếp cận khác biệt đáng kể, vì vậy tôi có thể biến nó thành câu trả lời của riêng mình nếu điều đó tốt với bạn.
Grimmy

@Grimy Đó thực sự là một cách tiếp cận hoàn toàn khác với tôi, vì vậy hãy đăng nó. Tôi thực sự mong đợi một số chuyển đổi unicode và modulo có thể làm cho nó ngắn hơn phiên âm, nhưng tôi thực sự khá tệ với các loại chuyển đổi số nguyên / chuỗi ma thuật đó. :)
Kevin Cruijssen

1

Perl - 394

Không phải là ngắn nhất, nhưng nó ít nhất đánh bại Javascript, C # và 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 

Một số thủ thuật:

  • Cảnh báo và nghiêm ngặt không được bật để cho phép barewords và không khai báo các biến trước khi sử dụng chúng
  • Dấu phẩy mỏng thay vì dấu phẩy béo để lưu một vài ký tự
  • Không đặt giá trị ban đầu cho các biến khi không cần thiết
  • Rời khỏi bán đại tràng khi có thể
  • Xác định mảng và giá trị băm không phải là tham chiếu để tránh phải sử dụng ->
  • Cho phép chiều rộng, chiều cao lớn hơn mức cần thiết để tránh phải tính toán chúng một cách chính xác (sẽ mất thêm mã)

Những điều gây tổn thương:

  • Không có cách tích hợp nào để đếm số lượng ký tự trong một chuỗi (dù sao có thể dài hơn)
  • Không có chức năng tối thiểu / tối đa tích hợp, do đó cần lãng phí 27 ký tự để nhập thư viện thực hiện việc đó (ít hơn xác định hàm của chúng tôi)

1

C - 273 byte - với đầu vào tương tác!

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

Trường được in mỗi khi một nhân vật được nhập và phát triển nếu đầu của con rắn ở gần rìa. Tôi không biết mức độ di động của nó - một người nào đó trên Internet cho biết getch () không hoạt động trên các nền tảng không phải Windows. Thật khó để nói liệu ASCII 1 sẽ trông giống như một khuôn mặt cười.

Phiên bản chơi golf khá khó chịu vì không có cách nào để duyên dáng thoát khỏi chương trình. Control-C không hoạt động với tôi. Mặt khác, phiên bản không được kết thúc sẽ chấm dứt nếu một ký tự không phải là 'w', 'a', 's' hoặc 'd' được nhập vào.

Cái gọi là "vô căn cứ":

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


    }
    return 0;
}

1

05AB1E , 23 byte

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

Hãy thử trực tuyến!

Giải trình:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.