뱀을 만들기 위해 휴식을 취하십시오!


23

우리의 고전적인 뱀은 성장 호르몬 의 균형을 개발했습니다 . 설상가상으로 그의 꼬리는 제자리에 고정됩니다! 에 지정된 방향성 입력이 주어지면 Figure 1어디에서 성장할 것인지 결정하는 프로그램을 작성하십시오.

낭비

그림 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는 "코드 고플"입니까?
John Dvorak

2
뱀과 입력 문자열을 너무 쉽게 만들 수 없기 때문에 보너스를 제거했습니다.
Beta Decay

1
@JanDvorak rotfl 내 나쁜.
hmatt1

1
@BetaDecay 비행기 비늘. 코드 골프 예제에서는 c의 왼쪽 상단에서 시작했지만 d가 더 크면 아래로 이동합니다.
hmatt1

2
@chilemagic 감사합니다! 둘 다 수용 가능한 경우 질문에서이를 명확히해야합니다.
Ingo Bürk

답변:


5

루비, 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}

언 골프 드 :

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 자바 스크립트 (399 (401) 431 )

화살표 기능으로 인해 ECMAScript 6을 지원하는 브라우저에서 실행해야합니다.

다음은 화살표 기능을 사용하지 않고 (일반적인) 브라우저에서 실행되도록 변경된 바이올린입니다. 또한 textarea대신 인쇄합니다 .

골프 버전

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 버전 내가 시작되기 전에입니다 정말 그것을 아래로 골프는 :

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

GIF는 매우 시원합니다. 작성한 스크립트에 의해 자동으로 만들어 집니까?
AndoDaan

1
감사! Google의 힘으로 우분투에서 화면 녹화로 선물을 만드는 방법을 찾았습니다. 스크린 레코더와을 사용합니다 convert. 아주 쉬운 :)
Ingo Bürk

3
(gif, not gift)
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

자바-646

첫 번째 것일 수도 있습니다!

나는 당신이 모두 이길 수 내기.

un (정렬 한) 골프

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

입력-dddsssdddwwwwaaaaaaaassssssssssddddddddddddddddd

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

입력-dddsssdddddasddddwww

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

내가 개인적으로 좋아하는 것-dwdwdwddaasassdddddwdwdwddsdswawaasassdddddddwdwdwddsdswawaasassddddwwwwwwwssssssdsddddwwwwddaassddaassddddsssdddwdwdwddaasasassddddwwwwssssssssasasaaawdwwdwddwwdddddddwdwdddddddddddsddsddddddddddddsdds

                    v                                          
                    v                                          
                    v                                          
                    v   v<<                                    
   v<<   v<<     v<<v   v                                      
  v<    v< ^<   v< ^v   v<<                        v<<     v<  
 >v    >v   ^  >v   >v  v                          v ^    v<^  
>^>>>>>^>>>>>>>^>>>>^>>>>>>>v    v<v               v ^    v ^  
                            v   v< v       v<<    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"(골프 버전과 동기화되지 않음) :

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

파이썬 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()

추신. 내 첫 골프 :) 내 대답이 부적절한 지 알려주세요


O대신에 사용 하면 2 바이트 가 절약됩니다. 붉은 청어입니다.
Outgolfer 에릭

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ 는 실제로 3 바이트로 계산되지 않았습니다.
Martin Ender

@MartinEnder 기본 인코딩은 UTF-8 이어야합니다 . 계산되지 않은 느낌이 들었습니다. 우연한 느낌이 들며 Gilly가 즉시 해결해야합니다.
Outgolfer Erik

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ 음, 기술적으로, 응답자는 자신의 인터프리터가 지원하는 모든 인코딩을 무료로 사용할 수 있습니다 (그리고 ASCII 호환 코드 페이지에 해당 문자가 포함되어 있다고 확신합니다). 바이트 수는 이미을 사용하는 것과 동일 O하므로 걱정하지 않아도됩니다. 코드에서 다른 문자에 대해서는 여전히 작동하지만 코드를 사용 하면 테스트 케이스를 변경하지 않고 편리하게 테스트 케이스를 실행할 수 있습니다.
Martin Ender

@MartinEnder Python은 유니 코드 문자열을 지원하는 능력으로 입증 된 UTF-8을 사용합니다. 이 기능을 사용하려면 첫 번째 또는 두 번째 행이이어야합니다 #coding=utf-8. 참고 #coding=utf-16작동하지 않습니다. 그러므로 3으로 계산되어야합니다.
Outgolfer Erik

2

파이썬 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
프로그래밍 퍼즐 및 코드 골프에 오신 것을 환영합니다! 도움말 센터에 요약 된 규칙에 따라 도전 과제에 대한 모든 솔루션은 사용중인 우승 기준에 대한 심각한 경쟁자 여야합니다. 예를 들어, 코드 골프 대회에 참가하려면 골프를해야합니다.
Dennis

1
바이트 수를 추가했지만 제거하려는 불필요한 공간이 많이 있습니다.
Martin Ender

고마워, 나는 첫 번째 항목에 필요한 변경을했습니다. 추가 조언이 있으면 대단히 감사하겠습니다.
Adriaan Erasmus


@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ 그냥 인쇄합니다 SyntaxError: invalid syntax.
Dennis

2

05AB1E , 35 34 30 28 바이트

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

0뱀의 머리로 사용합니다 .

@Grimy 덕분에 -4 바이트 .

온라인으로 사용해보십시오 (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 내장 Λ및 세 가지 인수 에 대한 간단한 설명은 다음 과 같습니다.

첫 번째 인수 : length (s) : 그리려는 선의 크기입니다. 겹치는 점을 명심해야하기 때문에 모든 캐릭터에 크기 2를 사용하고 뱀 머리에 1을 추가로 사용합니다.
두 번째 인수 : 문자열 (들) : 우리는 표시 할 문자. 이 경우 뱀의 머리 문자가 추가 된 문자는 무엇입니까?
세 번째 논증 : direction (s) : 주어진 길이의 문자 라인이 그려 져야하는 방향. 일반적으로 우리는 [0,7]다음과 같은 방향으로 매핑됩니다 :

7   0   1
    
6  X  2
    
5   4   3

6240[,,,]

Canvas 내장에 대한 자세한 설명은이 05AB1E 팁을 참조하십시오 Λ.


1
뭔가를 놓쳤을 수도 있지만 전혀 필요하지 않다고 생각 γ합니다. 이것은 잘 작동하는 것 같습니다.
그리미

@Grimy 고마워요. 머리를위한 2와 1의 목록으로 멋진 대안 접근! 그리고 프로그램을 기반으로 2 바이트를 더 절약 할 수있었습니다.
Kevin Cruijssen

감사! 나는 현재 23 세이지 만 , 그것은 상당히 다른 접근법이지만, 그것이 당신이 괜찮다면 자체 답변을 만들 수 있습니다.
그리미

@Grimy 실제로 저와는 다른 접근 방식이므로 자유롭게 게시하십시오. 나는 실제로 일부 유니 코드 변환을 기대하고 있었고 모듈로가 이것을 음역보다 짧게 만들지 모릅니다. 그러나 나는 그런 종류의 마법 정수 / 문자열 변환에 대해 솔직히 꽤 나쁩니다. :)
Kevin Cruijssen

1

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

몇 가지 트릭 :

  • 사용하기 전에 베어 워드를 허용하고 변수를 선언하지 않도록 경고 및 엄격하지 않음
  • 몇 개의 문자를 저장하기 위해 뚱뚱한 쉼표 대신 얇은 쉼표
  • 필요하지 않을 때 변수의 초기 값을 설정하지 않음
  • 가능하면 세미콜론을 버리십시오
  • 사용하지 않기 위해 참조가 아닌 배열 및 해시 정의->
  • 너비, 높이를 정확하게 계산하지 않기 위해 필요한 것보다 큰 너비, 높이 허용 (추가 코드 필요)

다친 것 :

  • 문자열에서 문자 수를 계산하는 기본 제공 방법이 없습니다 (어쨌든 더 길어질 수 있음)
  • 내장 된 최소 / 최대 기능이 없으므로 라이브러리를 가져 오기 위해 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이 웃는 얼굴처럼 보일지 말하기 어렵다.

골프 버전은 프로그램을 정상적으로 종료 할 수있는 방법이 없기 때문에 상당히 성가시다. Control-C가 작동하지 않습니다. 반면 'w', 'a', 's'또는 'd'이외의 문자를 입력하면 ungolfed 버전이 종료됩니다.

소위 "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.