Перервіться, щоб зробити змію!


23

Наша класична змія виробила дисбаланс гормонів росту . Що ще гірше, його хвіст застиг на місці! З урахуванням спрямованого введення, як зазначено в 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 - це "код gofl"?
Джон Дворак

2
Я б позбувся бонусу, оскільки створити власну змію та рядок для введення дуже легко.
Бета-розпад

1
@JanDvorak rotfl моя погана.
hmatt1

1
@BetaDecay площина масштабує. У прикладі коду для гольфу він почався в лівій верхній частині c, але оскільки d вище, він рухається вниз.
hmatt1

2
@chilemagic Дякую! Якщо обидва прийнятні, напевно, слід уточнити це у питанні.
Інго Бюрк

Відповіді:


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 Javascript (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:

Один із прикладів ОП:

введіть тут опис зображення

Приклад від Stretch Maniac :

введіть тут опис зображення

Безумовно

Ось (злегка) версія, що не займається гольфом, колись я почав по- справжньому гольфу:

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

Гіфки дуже круті. Чи робляться вони автоматично, за написаним вами сценарієм?
AndoDaan

1
Спасибі! З потужністю Google я просто роздивився, як зробити подарунок із екранного запису в Ubuntu. Він просто використовує магнітофон і convert. Досить просто :)
Ingo Bürk

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/$/@/

Гольфскрипт, 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/$/@/'не дає правильного результату для мене.
Інго Бюрк

Ваш запит після виконання, ймовірно, замінює частину змії. Вставте змію прямо в 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();}}}

вхід - dddsssdddwwwwaaaaaaasssssssssssdddddddddddddddddd

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

вхід - dddsssdddddasdddwww

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

"Без вогонь" з пробілом (це не буде синхронізуватися з гольф-версією):

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

Я вирішив зберігати змію в дикті, з координатами для ключів. Потім знайдіть і повторіть вихідний діапазон, замінивши порожні пробіли.

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 байти. - червона оселедець.
Ерік Аутгольфер

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ насправді не рахувались як 3 байти.
Мартін Ендер

@MartinEnder Це повинно бути , кодування за замовчуванням - UTF-8. У мене було відчуття, що це не рахується. У мене є відчуття, що це було випадково, і Гіллі повинна негайно виправити.
Ерік Аутгольфер

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Щоправда, технічно відповідач вільний використовувати будь-яке кодування, що підтримується їх інтерпретатором (і я впевнений, що на кодовій сторінці, сумісній ASCII, міститься цей символ), але це не до речі. Я кажу, що кількість байтів вже така ж, як і при використанні O, тому я б не турбувався про це. З коду видно, що він все одно буде працювати для будь-якого іншого символу, але за допомогою цього ви можете зручно запускати тестові випадки із завдання без змін.
Мартін Ендер

@MartinEnder Python використовує UTF-8, що підтверджується його здатністю підтримувати рядки Unicode. Щоб увімкнути цю функціональність, перший або другий рядок повинен бути#coding=utf-8 . Зверніть увагу, що #coding=utf-16це не працює. Звідси треба рахувати як 3.
Ерік Аутгольфер

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
Ласкаво просимо до головоломки програмування та коду для гольфу! Відповідно до правил, викладених у нашому довідковому центрі , усі рішення викликів повинні бути серйозним претендентом на виграшні критерії, які використовуються. Наприклад, для участі у змаганні з кодом з гольфу потрібно пройти гольф.
Денніс

1
Мені додано кількість байтів для вас, але там є досить багато зайвих пробілів, які ви, можливо, захочете видалити.
Мартін Ендер

Дякую, хлопці, я внесла необхідні зміни до свого першого вступу. Будь-які додаткові поради будуть дуже вдячні.
Адріан Еразм


@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Це просто друкує SyntaxError: invalid syntax.
Денніс

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 .

Що стосується короткого пояснення полотна вбудованого Λ та трьох його аргументів:

Перший аргумент: довжина (и): розміри ліній, які ми хочемо намалювати. Оскільки ми маємо пам’ятати про перекриття, ми використовуємо розмір 2 для кожного персонажа та додатковий 1 для голови змії.
Другий аргумент: рядок (и): символи, які ми хочемо відобразити. Які символи в цьому випадку додаються з головою-символом змії.
Третій аргумент: напрям (и): напрямки, в які слід накреслити ці символьні лінії заданої довжини. Загалом у нас є напрямки, [0,7]які відображають ці напрямки:

7   0   1
    
6  X  2
    
5   4   3

Тому ми маємо ціле число 6240для напрямків[,,,] відповідно.

Дивіться цей мінський наконечник 05AB1E для більш детального пояснення про вбудований полотно Λ.


1
Я, можливо, щось пропустив, але я не думаю, що γце взагалі потрібно. Це, здається, працює просто чудово.
Grimmy

@Grimy Спасибі, це дійсно так; приємний альтернативний підхід зі списком 2 і 1 для голови! І мені вдалося зберегти ще 2 байти на основі вашої програми.
Kevin Cruijssen

Спасибі! Мені зараз 23 роки , хоча це суттєво інший підхід, тому я можу зробити свою відповідь, якщо ви це добре.
Grimmy

@Grimy Це дійсно зовсім інший підхід, ніж мій, тому сміливо публікуйте його. Я дійсно сподівався, що деяка конверсія unicode і модуль може зробити це коротшим, ніж транслітерат, але я справді дуже поганий з тими магічними цілочисловими / рядковими перетвореннями. :)
Кевін Круїссен

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 

Деякі хитрощі:

  • Попередження та суворості не ввімкнено, щоб дозволити бареври та не оголосити змінні перед їх використанням
  • Тонкі коми замість жирних комів, щоб зберегти кілька символів
  • Не встановлення початкових значень змінних, коли це не потрібно
  • По можливості залишаючи напівколонки
  • Визначаючи масиви та хеші не як посилання, щоб уникнути необхідності використання ->
  • Дозволити ширину, висоту бути більшою, ніж потрібно, щоб уникнути необхідності їх точного обчислення (що займе додатковий код)

Те, що болить:

  • Немає вбудованого способу підрахунку кількості символів у рядку (можливо, все одно було довше)
  • Немає вбудованих функцій min / max, тому не потрібно витрачати 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'.

Так звані "неозорені":

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.