หยุดพักเพื่อสร้างงู!


23

งูคลาสสิกของเราได้มีการพัฒนา inbalance ของฮอร์โมนการเจริญเติบโต เพื่อทำให้เรื่องแย่ลงหางของเขาก็ถูกแช่แข็ง! รับอินพุตทิศทางตามที่ระบุในFigure 1เขียนโปรแกรมเพื่อตรวจสอบที่เขาจะเติบโต

WASD

รูปที่ 1.อินพุตทิศทาง

ข้อกำหนดของโปรแกรม

  • อ่านการป้อนSTDINตัวอักษรโดยตัวอักษรบน
  • หลังจากที่ได้อ่านตัวอักษร, การส่งออกSTDOUTงูไป โปรดใส่บรรทัดว่างระหว่างแต่ละครั้งที่คุณพิมพ์งู
  • งูประกอบด้วย<>v^และหัว หัวของงูอาจจะเป็นตัวละครรอบใด ๆ ที่คุณเลือกเช่นo, 0, หรือO
  • การรวมกันของใด ๆ ที่wasdถูกต้องสำหรับการป้อนข้อมูล
  • โปรแกรมของคุณไม่ควรถือว่าอินพุตอยู่ในระยะเวลาที่แน่นอน
  • <>v^งูสามารถกองอยู่ด้านบนของตัวเองเขียนทับ ดูตัวอย่างสำหรับกลไกการเลี้ยงงู
  • ช่องว่างต่อท้ายไม่เป็นไร แต่งูของคุณจะต้องดูถูกต้อง

เกณฑ์การให้คะแนน

นี่คือรหัสกอล์ฟคะแนนของคุณคือจำนวนตัวอักษรในโปรแกรมของคุณ คะแนนต่ำสุดชนะ!

ตัวอย่างงู:

การป้อนข้อมูล: ddddssaassdddddww

เอาท์พุท:

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

การป้อนข้อมูล: dddsssaaawww

เอาท์พุท:

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

การป้อนข้อมูล: dddsssdddddasddddwww

เอาท์พุท:

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

การป้อนข้อมูล: dddwwdddssssaaaaaaaaawww

เอาท์พุท:

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

การป้อนข้อมูล: ddddssssaawwddddd

เอาท์พุท:

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

การป้อนข้อมูล: dddddssaawwwwddddd

เอาท์พุท:

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

การป้อนข้อมูล:

ddddaaaasssssdddddddddddwwwwwaaaasssssdddddddddddwwwwwwwwwwsssssaaaasssssdddddddwwwwwddddssaaaasssddddaaaassssssssssdddwwwwwwwddddswaaaassssddaasssaaaaaaaaaawwwwddddssssaaaaaaaaaaawwwwddddsssssssssaaaa

เอาท์พุท:

                  v
                  v
                  v
                  v
                  v
v<<<<  v<<<<  v<<<<  >>>>v
v      v   ^  v   ^  ^   v
v      v   ^  v   ^  v<<<<
v      v   ^  v   ^  v
v      v   ^  v   ^  v
>>>>>>>>>>>>>>>>>>>>>v<<<<
                     v
                     v
                     v  v<<<<
                     v  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
ดีมาก. แต่ ... WTH คือ "code gofl"?
John Dvorak

2
ฉันจะกำจัดโบนัสเพราะมันง่ายเกินไปที่จะสร้างงูและสตริงอินพุตของคุณเอง
Beta Decay

1
@JanDvorak ทำให้ฉันแย่
hmatt1

1
@BetaDecay เครื่องชั่งเครื่องบิน ในตัวอย่างโค้ดกอล์ฟมันเริ่มต้นที่มุมบนซ้ายของ c แต่เนื่องจาก d มีความสูงจึงเลื่อนลง
hmatt1

2
@chilemagic ขอบคุณ! หากทั้งสองเป็นที่ยอมรับได้คุณควรชี้แจงในคำถาม
Ingo Bürk

คำตอบ:


5

Ruby, 207 ตัวอักษร

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}

แลมบ์ดาสำหรับ aเขียนกลับเนื่องจากแถวที่ได้รับมอบหมายข้างต้นเขียนถึงไม่ได้อยู่บนกระดานอีกต่อไป)


11

ECMAScript 6 Javascript (399 401 431 )

ต้องทำงานในเบราว์เซอร์ที่รองรับ ECMAScript 6 เนื่องจากฟังก์ชั่นลูกศร

ต่อไปนี้เป็นปริศนาที่ถูกดัดแปลงให้ทำงานในเบราว์เซอร์ (ทั่วไป) ใด ๆ โดยไม่ใช้ฟังก์ชั่นลูกศร พวกเขายังพิมพ์ไปที่textarea:

เวอร์ชัน Golfed

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 เคลื่อนไหว:

หนึ่งในตัวอย่างของ OP:

ป้อนคำอธิบายรูปภาพที่นี่

ตัวอย่างจากStretch Maniac :

ป้อนคำอธิบายรูปภาพที่นี่

Ungolfed

นี่คือ (เล็กน้อย) รุ่น ungolfed จากบางครั้งก่อนที่ผมจะเริ่มต้นจริงๆเล่นกอล์ฟมันลง:

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

gifs เจ๋งมาก พวกเขาทำโดยอัตโนมัติโดยสคริปต์ที่คุณเขียน?
AndoDaan

1
ขอบคุณ! ด้วยพลังของ Google ฉันแค่ค้นหาวิธีทำของขวัญจากการบันทึกหน้าจอใน Ubuntu convertมันก็ใช้บันทึกหน้าจอและ
ค่อนข้าง

3
(gif ไม่ใช่ของขวัญ)
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'

เช่นเดียวกับคำตอบก่อนหน้าของฉัน แต่วางเคอร์เซอร์อย่างถูกต้องทั้งก่อนและหลัง ฉันค่อนข้างภูมิใจในวิธีการวางตำแหน่งเคอร์เซอร์ - โดยทั่วไปแล้วมันจะรันงูย้อนกลับ


1
คุณสามารถเพิ่มการโทรตัวอย่างได้หรือไม่ 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/$/@/'ไม่ได้ให้ผลลัพธ์ที่ถูกต้องสำหรับฉัน
Ingo Bürk

พรอมต์ของคุณหลังจากดำเนินการอาจเขียนทับส่วนหนึ่งของงู วางงูลงใน stdin โดยตรงแทนที่จะวางไปป์หรือเพิ่มสองสาม\nวินาทีหลังจาก@นั้นข้อความแจ้งของคุณจะไปที่อื่น
Sneftel

1
สิ่งนี้อาจล้มเหลวหากว่างูขึ้นหรือลงจากกระดาน
tomsmeding

@tomsmeding ใช่ฉันอาจขยายมันเพื่อจัดการกับมัน นอกเหนือจากภาษาฉันคิดว่าลำดับการควบคุม ANSI เป็นวิธีที่จะทำให้รหัสสั้นลง
Sneftel

3

Java - 646

อาจจะเป็นคนแรก!

ฉันพนันได้เลยว่าคุณจะเอาชนะมันได้

un (เรียงลำดับ) 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();}
    }
}

เล็กกว่า -

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

อินพุต - dddsssdddwwwwaaaaaaaassssssssddddddddddddddddddddddddd

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

อินพุต - dddsssddddddddddwww

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

ที่ชื่นชอบส่วนตัวของฉัน - 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");}}}}

"Ungolfed" ด้วย whitespace (สิ่งนี้จะไม่ถูกซิงค์กับเวอร์ชัน golfed):

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 ไบต์

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

ฉันตัดสินใจที่จะเก็บงูใน dict พร้อมพิกัดสำหรับคีย์ จากนั้นค้นหาและวนซ้ำในช่วงเอาต์พุตแทนการเว้นวรรคว่าง

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 สนามกอล์ฟแห่งแรกของฉัน :) ให้ฉันรู้ว่าคำตอบของฉันไม่เหมาะสมหรือไม่


การใช้Oแทนการช่วยให้คุณประหยัด 2 ไบต์ เป็นปลาเฮอริ่งแดง
Erik the Outgolfer

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ ไม่ได้ถูกนับเป็น 3 ไบต์
Martin Ender

@MartinEnder ต้องเป็นค่าเริ่มต้นการเข้ารหัสคือ UTF-8 ฉันรู้สึกว่ามันไม่ได้นับ ฉันรู้สึกว่ามันเป็นอุบัติเหตุและต้องแก้ไขโดย Gilly ทันที
Erik the Outgolfer

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀในทางเทคนิคแล้วผู้ตอบมีอิสระในการใช้การเข้ารหัสใด ๆ ที่สนับสนุนโดยล่ามของพวกเขา (และฉันค่อนข้างแน่ใจว่าหน้ารหัสที่เข้ากันได้กับ ASCII บางตัวมีอักขระนั้น) แต่นั่นอยู่ด้านข้าง ฉันกำลังบอกว่าจำนวนไบต์นั้นเป็นแบบเดียวกับที่ใช้Oดังนั้นฉันจะไม่กังวลเกี่ยวกับมัน เห็นได้ชัดจากรหัสว่ามันจะยังคงใช้ได้กับตัวละครอื่น ๆ แต่การใช้ช่วยให้คุณสามารถเรียกใช้กรณีทดสอบจากความท้าทายโดยไม่มีการเปลี่ยนแปลง
Martin Ender

@MartinEnder Python ใช้ UTF-8 ซึ่งพิสูจน์แล้วจากความสามารถในการรองรับสตริง Unicode #coding=utf-8ต้องการเปิดใช้งานฟังก์ชั่นนี้บรรทัดแรกหรือครั้งที่สองจะต้อง โปรดทราบว่า#coding=utf-16ไม่ทำงาน ดังนั้นจะต้องนับเป็น 3
Erik the Outgolfer

2

Python 2.7 - 274 ไบต์

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

เวอร์ชันที่ไม่ดี

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
ยินดีต้อนรับสู่ Programming Puzzles & Code Golf! ตามกฎที่ระบุไว้ในศูนย์ช่วยเหลือของเราการแก้ปัญหาความท้าทายทั้งหมดควรเป็นคู่แข่งที่ร้ายแรงสำหรับเกณฑ์การชนะที่ใช้งาน ตัวอย่างเช่นรายการการแข่งขันกอล์ฟรหัสจะต้องมีการตีกอล์ฟ
Dennis

1
ฉันได้เพิ่มจำนวนไบต์สำหรับคุณ แต่มีช่องว่างที่ไม่จำเป็นจำนวนมากซึ่งคุณอาจต้องการลบออก
Martin Ender

ขอบคุณพวกฉันทำการเปลี่ยนแปลงที่จำเป็นในรายการแรกของฉัน คำแนะนำพิเศษใด ๆ จะได้รับการชื่นชมอย่างมาก
Adriaan Erasmus

ผมแข็งแรงเล่นกอล์ฟจริงๆ
Erik the Outgolfer

@ SyntaxError: invalid syntaxEʀɪᴋᴛʜᴇGᴏʟғᴇʀที่เพิ่งพิมพ์
Dennis

2

05AB1E , 35 34 30 28 ไบต์

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

ใช้0เป็นหัวงู

-4 ไบต์ขอบคุณที่@Grimy

ลองใช้ออนไลน์ (ไม่มีชุดทดสอบสำหรับกรณีทดสอบทั้งหมดในคราวเดียวเนื่องจากไม่มีวิธีรีเซ็ต Canvas ดังนั้นผลลัพธ์จะทับซ้อนกัน .. )

คำอธิบาย:

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

ดูเคล็ดลับของฉันที่ 05AB1E นี้ (ส่วนวิธีการบีบอัดสตริงที่ไม่ได้เป็นส่วนหนึ่งของพจนานุกรมและวิธีบีบอัดจำนวนเต็มขนาดใหญ่ )เพื่อให้เข้าใจว่าเพราะ.•₃º•อะไร"adsw"และŽO^เป็นอย่างไร6240เป็น

สำหรับคำอธิบายสั้น ๆ ของ Canvas builtin Λและอาร์กิวเมนต์สามข้อ:

อาร์กิวเมนต์แรก: ความยาว:ขนาดของเส้นที่เราต้องการวาด เนื่องจากเราต้องคำนึงถึงการทับซ้อนกันเราจึงใช้ขนาด 2 สำหรับตัวละครทุกตัวและอีก 1 ตัวสำหรับหัวงู
อาร์กิวเมนต์ที่สอง: string (s):ตัวละครที่เราต้องการแสดง ซึ่งเป็นตัวละครในกรณีนี้ผนวกเข้ากับหัวตัวละครของงู
อาร์กิวเมนต์ที่สาม: ทิศทาง (s):เส้นทางเหล่านี้อักขระบรรทัดของความยาวที่กำหนดควรวาดในโดยทั่วไปเรามีทิศทาง[0,7]ที่แมปไปยังทิศทางเหล่านี้:

7   0   1
    
6  X  2
    
5   4   3

6240[,,,]

ดู 05AB1E นี้เคล็ดลับของฉันสำหรับคำอธิบายรายละเอียดเพิ่มเติมเกี่ยวกับ Λbuiltin


1
ฉันอาจจะพลาดบางสิ่งบางอย่าง แต่ฉันไม่คิดว่าγจำเป็น นี้ดูเหมือนจะทำงานได้ดี
Grimmy

@Grimy ขอบคุณแน่นอนมันไม่; วิธีการทางเลือกที่ดีกับรายการ 2 และ 1 สำหรับหัว! และฉันสามารถบันทึกได้อีก 2 ไบต์ตามโปรแกรมของคุณ
Kevin Cruijssen

ขอบคุณ! ขณะนี้ฉันอายุ 23แต่เป็นวิธีที่แตกต่างกันมากดังนั้นฉันอาจทำให้เป็นคำตอบของตัวเองถ้าคุณไม่เป็นไร
Grimmy

@Grimy แน่นอนว่ามันเป็นวิธีการที่แตกต่างจากของฉันดังนั้นอย่าลังเลที่จะโพสต์ แน่นอนว่าฉันคาดหวังว่าการแปลง Unicode และ modulo อาจทำให้สั้นกว่าตัวแปล แต่ฉันค่อนข้างแย่ทีเดียวกับการแปลงจำนวนเต็ม / สตริงของเวทย์มนตร์ :)
Kevin Cruijssen

1

Perl - 394

ไม่ใช่สั้นที่สุด แต่มันจะเต้นอย่างน้อย Javascript, C # และ 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 

เทคนิคบางอย่าง:

  • คำเตือนและเข้มงวดไม่เปิดใช้เพื่ออนุญาตให้ barewords และไม่ประกาศตัวแปรก่อนใช้
  • เครื่องหมายจุลภาคบางแทนเครื่องหมายจุลภาคไขมันเพื่อบันทึกอักขระสองสามตัว
  • ไม่ได้ตั้งค่าเริ่มต้นสำหรับตัวแปรเมื่อไม่จำเป็น
  • ออกจากกึ่งทวิภาคเมื่อเป็นไปได้
  • การกำหนดอาร์เรย์และแฮชไม่อ้างอิงเพื่อหลีกเลี่ยงการใช้ ->
  • การอนุญาตให้มีความกว้างความสูงมากกว่าที่จำเป็นเพื่อหลีกเลี่ยงการคำนวณอย่างถูกต้อง (ซึ่งต้องใช้รหัสเพิ่มเติม)

สิ่งที่เจ็บ:

  • ไม่มีวิธีในการนับจำนวนอักขระในสตริง (อาจนานกว่านั้น)
  • ไม่มีฟังก์ชั่นขั้นต่ำ / สูงสุดในตัวดังนั้นต้องเสีย 27 ตัวอักษรเพื่อนำเข้าไลบรารีที่ทำ (น้อยกว่าการกำหนดของเราเอง)

1

C - 273 ไบต์ - พร้อมอินพุตแบบโต้ตอบ!

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

ฟิลด์จะถูกพิมพ์ทุกครั้งที่มีการป้อนตัวอักษรและเติบโตขึ้นถ้าหัวของงูใกล้กับขอบ ฉันไม่รู้ว่ามันพกพาได้อย่างไร - ใครบางคนบนอินเทอร์เน็ตบอกว่า getch () ไม่ทำงานบนแพลตฟอร์มที่ไม่ใช่ Windows ยากที่จะบอกว่า ASCII 1 จะมีหน้าตายิ้มหรือไม่

เวอร์ชัน golfed ค่อนข้างน่ารำคาญเนื่องจากไม่มีทางที่จะออกจากโปรแกรมอย่างงดงาม Control-C ไม่ทำงานสำหรับฉัน ในทางกลับกันเวอร์ชันที่ไม่ได้ลงนามจะสิ้นสุดลงหากมีการป้อนอักขระอื่นที่ไม่ใช่ 'w', 'a', 's' หรือ 'd'

สิ่งที่เรียกว่า "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 ไบต์

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

ลองออนไลน์!

คำอธิบาย:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.