Роздрукуйте цю дошку-тик-носок!


9

Ось дошка-тик-носок:

   a     b     c
      |     |     
1  -  |  -  |  -  
 _____|_____|_____
      |     |     
2  -  |  -  |  -  
 _____|_____|_____
      |     |     
3  -  |  -  |  -  
      |     |     

З урахуванням набору ходів, роздрукуйте дошку з жетонами.

Введення буде прийнято як ходи, розділені пробілами, причому кожен хід буде:

  • По-перше, маркер, який йде
  • Далі - графа стовпчика, по якій вона рухається
  • Останнє - номер рядка, по якому він рухається

Зауважте, що нормальні правила-тик-ноги не мають значення.

Також немає необхідності друкувати букви та цифри.

Наприклад, введення Ob2 Xc2 Ob3 Xa1призведе до

     |     |     
  X  |  -  |  -  
_____|_____|_____
     |     |     
  -  |  O  |  X  
_____|_____|_____
     |     |     
  -  |  O  |  -  
     |     |     

Пам'ятайте, це так , тому виграє код з найменшою кількістю байтів.

Табло лідерів

Ось фрагмент стека для створення як звичайного табло, так і огляду переможців за мовою.

Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон Markdown:

# Language Name, N bytes

де Nрозмір вашого подання. Якщо ви покращите свій рахунок, ви можете зберегти старі бали у заголовку, прокресливши їх. Наприклад:

# Ruby, <s>104</s> <s>101</s> 96 bytes

Якщо ви хочете включити у свій заголовок декілька чисел (наприклад, тому що ваш результат - це сума двох файлів або ви хочете окремо вказати штрафні санкції для перекладача), переконайтесь, що фактичний бал є останнім номером у заголовку:

# Perl, 43 + 2 (-p flag) = 45 bytes

Ви також можете зробити ім'я мови посиланням, яке потім з’явиться у фрагменті таблиць лідерів:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes


Що слід уникати при написанні завдань - громіздкі формати вводу / виводу . Будь ласка, зробіть ваш формат введення досить гнучким. Наступного разу спробуйте пісочницю .
Erik the Outgolfer

1
@EriktheGolfer громіздкий? Цей формат введення зрозумілий і очевидний
edc65

@ edc65 Я мав на увазі це, я хочу отримати введення в будь-якому форматі, не тільки в цьому, але, мабуть, вже пізно. Я думаю, ти маєш на увазі, що це візуально ясно, але я взагалі не міг впоратися. Чому наприклад пробіли, а не якийсь інший роздільник?
Erik the Outgolfer

1
@EriktheGolfer не сприйми мене неправильно, але якщо твоя надмірна езотерична мова не може обробити порожні пробіли, теж погано ... тож цього разу доведеться використовувати щось інше.
edc65

1
@ edc65 Наприклад, у Sesos було б досить важко навіть завантажувати вхідні дані. Я вважаю за краще список цілих чисел (три входи за один хід), як 1 2 3для Xb3(не повинен бути саме таким).
Erik the Outgolfer

Відповіді:


7

JavaScript (ES6), 136 133 129 байт

let f =

i=>eval("for(y=9,s='';y--;s+=`\n`)for(x=18;--x;)s+=x%6-3|y%3-1?' __|'[x%6?y/3:3]||' ':i[i.search('cba'[x/6|0]+(10-y)/3)-1]||'-'")

console.log(f("Ob2 Xc2 Ob3 Xa1"))


5

Пітон (2.7), 188 180 байт

def f(s):a,b=3*[' '*5],3*['_'*5];c,d,e=[['  '+dict((m[1:],m[0])for m in s.split(' ')).get(x+y,'-')+'  'for x in'abc']for y in'123'];print'\n'.join(map('|'.join,[a,c,b,a,d,b,a,e,a]))

У третьому рядку можна видалити пробіли перед 's
Даніель,

Ласкаво просимо в гольф пітона! Погляньте на поради щодо гольфу Python . Ви можете відокремити висловлювання, ;дозволяючи поставити весь код на один рядок, щоб заощадити на відступі.
xnor

for y in '123'-> for y in'123'. Крім того, що сказав xnor: ви можете зробити свою функцію однолінійною, використовуючи ;для розділення заяви. Використовуючи всі ці поради щодо гольфу, ви можете грати в 6 байт.
Ерік Аутгольфер

4

Python 2, 112 байт

s=input()+'- '
r=3;exec"print'|'.join([' '*5,'  %s  '%s[s.find(c+`r/3`)-1],'_'*5][r%11%3]for c in'abc');r+=1;"*9

Дев'ять рядків друкуються відповідно до індексів рядків r. Індекс рядки відраховується вгору від , 3щоб 11в execпетлі. Кожен рядок складається з вертикальних ліній, що |з'єднують три сегменти з 5 символів, які цикли між:

  • П’ять пробілів
  • Два пробіли, символ гравця, потім два пробіли
  • П'ять підкреслень

Тип робиться для циклу з r%3, за винятком того, що в останньому рядку є пробіли, а не підкреслення, досягнуті з r%11%3.

Щоб знайти символ програвача для поточної комірки, ми подивимось номер рядка r/3та літеру стовпця cз "abc". Ми об'єднуємо їх, щоб створити дво символьний рядок типу b3, знаходимо його індекс у вхідному рядку, а потім приймаємо символ ( Xабо O) на один індекс раніше. Якщо жоден гравець не грав там, за findзамовчуванням буде те, до -1чого зменшується -2. Ми зламаємо s[-2]це -, додаючи два символи, коли ми беремо введення.


1

PHP, 187 байт

<?for(;$i++<162;)$s.=$i%18?($i%6?($i<144&&$i%54>36?"_":($i<144&&$i%54>18&&$i%6==3?"-":" ")):"|"):"\n";foreach(explode(" ",$_GET[a])as$t)$s[20+6*(1+($t[1]<=>b))+54*($t[2]-1)]=$t[0];echo$s;

Приймає дані як рядок. Якщо я можу використовувати масив, його можна зменшити до, $_GET[a]а неexplode(" ",$_GET[a])

207 байт

<?foreach(explode(" ",$_GET[a])as$t)$a[(1+($t[1]<=>b))+3*($t[2]-1)]=$t[0];for(;$i++<162;)$s.=$i%18?($i%6?($i<144&&$i%54>36?"_":" "):"|"):"\n";for(;$x<9;)$s[18+54*(($x/3)^0)+2+6*($x%3)]=$a[+$x++]??"-";echo$s;

Найпростіша ідея створити це 194 байт

<?for(;++$i<10;)$s.=($i==9||$i%3?($i%3==2?"  -  |  -  |  -  ":"     |     |     "):"_____|_____|_____")."\n";foreach(explode(" ",$_GET[a])as$t)$s[20+6*(1+($t[1]<=>b))+54*($t[2]-1)]=$t[0];echo$s;

1

Математика, 205 байт

StringReplacePart[a="     |     |     
";b="  -  |  -  |  -  
";c="_____|_____|_____
";{a,b,c,a,b,c,a,b,a}<>"",##]&@@Transpose[{#,{#,#}&[54LetterNumber@#2+6FromDigits@#3-39]}&@@@Characters/@StringSplit@#]&

Це було б набагато коротше, якби я міг використовувати вбудований ... (92 байти)

Grid@SparseArray[{LetterNumber@#2,FromDigits@#3}->#&@@@Characters/@StringSplit@#,{3,3},"-"]&

1

Java, 138 байт

Редагувати:

  • -2 байт вимкнено Дякуємо @Kevin Kruijssen

Знімок:

m->{char[][]o=new char[3][3];for(char[]a:m)o[a[1]-'a'][a[2]-'0']=a[0];for(char[]a:o)System.out.println(a[0]+'|'+a[1]+'|'+a[2]+"\n-----");}

Код:

public static void tictactoe(char[][]moves){
  char[][]o=new char[3][3];
  for(char[]a:moves){
    o[a[1]-79][a[2]-48]=a[0];
  }
  for(char[]a:o){
    System.out.println(a[0]+'|'+a[1]+'|'+a[2]+"\n-----");
  }
}

o[a[1]-'a'][a[2]-'0']=a[0]можна покататись на два байти доo[a[1]-97][a[2]-48]=a[0]
Кевін Круїссен

але якщо неправильний вихід, чи не так?
норганос

Яку помилку ви маєте на увазі?
Роман Ґраф

Вихідний формат не такий, як задається ОП.
seshoumara

1

Пакетна, 341 339 305 287 байт

@for %%a in (a1 a2 a3 b1 b2 b3 c1 c2 c3)do @set %%a=-
@for %%a in (%*)do @set s=%%a&call call set %%s:~1%%=%%s:~0,1%%
@set s="     |     |     "
@for %%l in (%s% "  %a1%  |  %b1%  |  %c1%" %s: =_% %s% "  %a2%  |  %b2%  |  %c2%" %s: =_% %s% "  %a3%  |  %b3%  |  %c3%" %s%)do @echo %%~l

Передбачає послідовний вихід. Редагувати: збережено 2 байти, видаливши зайві пробіли. Збережено 34 байти, записавши висновок за допомогою forциклу. Збережено 18 байт, усунувши підпрограму.


0

Автовім , 110 байт (не конкурує)

Тестовий водіння Autovim ... Це майже відповідь Vimscript. Не конкурує, тому що Autovim ще розвивається.

ñ5i ␛a|␛ÿp3hr-phv0r_⌥v$kkyPPy2jPP$⌥vG$xGđkÿjp
…nsplit(@m)
ñğ0(@n[2]*3-2)j((char2nr(@n[1])-96)*6-4)lr(@n[0])
e…

Щоб запустити його:

./bin/autovim run tictactoe.autovim -ni -@m "Ob2 Xc2 Ob3 Xa1"

Безголівки:

execute "normal 5i \<esc>a|\<esc>yyp3hr-phv0r_\<c-v>$kkyPPy2jPP$\<c-v>G$xGddkyyjp"
for @n in split(@m)
execute "normal gg0".(@n[2]*3-2)."j".((char2nr(@n[1])-96)*6-4)."lr".(@n[0]).""
endfor

Пояснення слід, якщо є інтерес :)


0

Гроовий, 174 байт

{s->def r=0,o,t=[:];s.split(' ').each{t[it[1..2]]=it[0]};9.times{y->o='';17.times{x->o+=x%6==5?'|':y in [2,5]?'_':x%6==2&&y%3==1?t['abc'[r++%3]+(y+2)/3]?:'-':' '};println o}}

неозорений:

{s->
    def r=0, o, t=[:];
    s.split(' ').each{
        t[it[1..2]]=it[0]
    };
    9.times{y->
        o='';
        17.times{x->
            o+= x%6==5 ? '|' : y in [2,5]? '_' : x%6==2 && y%3==1 ? t['abc'[r++%3]+(y+2)/3]?:'-' : ' '
        };
        println o
    }
}

0

CJam, 62 байти

" -_ -_ - "_'-Ser_+_@\]3*sqS/{)~\)'a-F*@+3*G+\t}/9/5/'|9*a*zN*

Спробуйте в Інтернеті

Пояснення:

" -_ -_ - "_'-Ser_+_@\]3*s e# Build a 135 character string representing the 
                           e# columns of the board (top to bottom, left to right)
qS/{)~\)'a-F*@+3*G+\t}/    e# Process the input, put the tokens (O,X) in the string
                           e# The tokens have to placed at indexes 
                           e# [19 22 25 64 67 70 109 112 115]
                           e# This is done with the formula 3*(15x+y)+16,
                           e# where x is the code point of the column letter 
                           e# (minus 'a') and y is the row number.
9/5/'|9*a*zN*              e# Split into its parts, add the column separators, zip 
                           e# and join with newlines.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.