Bu tic-tac-toe panosunu yazdır!


9

İşte bir tic-tac-toe kurulu:

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

Bir dizi hamle verildiğinde, kartı jetonlar açık olarak yazdırın.

Giriş, boşluklarla ayrılmış hareketler olarak alınır ve her hareket şu şekilde olur:

  • İlk olarak, giden belirteç
  • Ardından, üzerinde ilerlediği sütunun harfi
  • Son olarak, üzerinde hareket ettiği satır sayısı

Normal tic-tac-toe kurallarının önemli olmadığını unutmayın.

Ayrıca, harfleri ve sayıları yazdırmaya da gerek yoktur.

Örneğin, girdi Ob2 Xc2 Ob3 Xa1şu şekilde sonuçlanır:

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

Unutmayın, bu , böylece en az bayt içeren kod kazanır.

Liderler

İşte hem düzenli bir skor tablosu hem de kazananları dile göre gözden geçirmek için bir Yığın Parçacığı.

Yanıtınızın göründüğünden emin olmak için lütfen aşağıdaki Markdown şablonunu kullanarak yanıtınızı bir başlıkla başlatın:

# Language Name, N bytes

Ngönderiminizin büyüklüğü nerede . Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

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

Başlığınıza birden fazla sayı eklemek istiyorsanız (örneğin, puanınız iki dosyanın toplamı olduğu veya yorumlayıcı bayrak cezalarını ayrı olarak listelemek istediğiniz için), gerçek puanın başlıktaki son sayı olduğundan emin olun :

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

Dil adını, daha sonra skor tablosu snippet'inde görünecek bir bağlantı da yapabilirsiniz:

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


Yazma zorluklarından kaçınmak için bir şey hantal I / O formatlarıdır . Lütfen giriş biçiminizi yeterince esnek hale getirin. Bir dahaki sefere Sandbox'ı deneyin .
Outgolfer Erik

1
@EriktheGolfer hantal mı? Bu giriş biçimi sade ve açık
edc65

@ edc65 Yani, sadece bu değil, herhangi bir formatta girdi almak istiyorum, ama sanırım şimdi geç. Sanırım görsel olarak açık, ama hiç baş edemedim. Neden bazı ayırıcılar değil, boşluklar?
Outgolfer Erik

1
@EriktheGolfer beni yanlış anlamıyor, ancak süper ekstra ezoterik diliniz boş alanları işleyemiyorsa, çok kötü ... bu sefer başka bir şey kullanmanız gerekecek.
edc65

1
@ edc65 Örneğin, Sesos'ta giriş verilerinin yüklenmesi bile oldukça zor olacaktır. Ben gibi tamsayılar listesini (bir hamle için üç int) tercih ediyorum 1 2 3için Xb3(tam olarak olmak zorunda değildir).
Outgolfer Erik

Yanıtlar:


7

JavaScript (ES6), 136 133 129 bayt

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

Python (2.7), 188 180 bayt

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

Üçüncü satırda 's'den önceki boşlukları kaldırabilirsiniz
Daniel

Python golf hoş geldiniz! Python golf ipuçlarına bir göz atın . ;Girintiden tasarruf etmek için tüm kodlarınızı tek bir satıra koymanıza izin vererek ifadeleri ayırabilirsiniz .
xnor

for y in '123'-> for y in'123'. Ayrıca, xnor'ın söyledikleri: ;ayrı ifadeleri ayırmak için işlevinizi tek satırlık yapabilirsiniz . Tüm bu golf ipuçlarını kullanarak 6 bayt golf oynayabilirsiniz.
Outgolfer Erik

4

Python 2, 112 bayt

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

Satır indekslerine karşılık gelen dokuz satır yazdırılır r. Satır dizini bir döngüde 3ile 11arasında sayılır exec. Her satır, aşağıdakiler arasında geçiş yapan |üç 5 karakterli segmenti birleştiren dikey çizgilerden oluşur :

  • Beş boşluk
  • İki boşluk, bir oyuncu sembolü, sonra iki boşluk
  • Beş alt çizgi

r%3Son satırda alt çizgilerden ziyade boşluklar olması dışında, tür ile döngüye dönüştürülür r%11%3.

Geçerli hücre için oyuncu sembolünü bulmak için, satır sayısına bakar r/3ve sütun harfi cgelen "abc". Bunları iki karakterli bir dizgi yapmak için birleştiririz b3, dizgiyi giriş dizgisinde buluruz ve ardından sembolü ( Xveya O) bir dizini daha önce alırız. İki oyuncu da orada oynamamışsa, findvarsayılan değer olarak -1ayarlanır -2. Biz kesmek s[-2]olmak -biz girdi alırken iki karakter ekleyerek.


1

PHP, 187 Bayt

<?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;

Girişi dize olarak alır. Bir dizi kullanabilseydim $_GET[a]bunun yerine azaltılabilirexplode(" ",$_GET[a])

207 Bayt

<?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;

Bu 194 Bayt'ı oluşturmak için en basit fikir

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

Mathematica, 205 bayt

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

Yerleşikini kullanabilseydim bu çok daha kısa olurdu ... (92 bayt)

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

1

Java, 138 bayt

Düzenle:

  • -2 bayt kapalı. @Kevin Kruijssen sayesinde

Snippet:

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

Kod:

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]iki bayt tarafından golf olabiliro[a[1]-97][a[2]-48]=a[0]
Kevin Cruijssen

ama yanlış çıktı varsa, değil mi?
norganos

Hangi hata demek istiyorsun?
Roman Gräf

Çıktı formatı OP tarafından sorulanla aynı değil.
seshoumara

1

Toplu, 341 339 305 287 bayt

@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

Tutarlı çıktı alındığını varsayar. Düzenleme: Gereksiz alanları kaldırarak 2 bayt kaydedildi. Bir fordöngü kullanarak çıktı yazarak 34 bayt kaydedildi . Alt rutini ortadan kaldırarak 18 bayt kurtardı.


0

Autovim , 110 bayt (rakip değil)

Autovim sürüş testi ... Bu hemen hemen bir Vimscript cevabı. Rekabetçi değil çünkü Autovim hala geliştiriliyor.

ñ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…

Çalıştırmak için:

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

Ungolfed:

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

İlgi varsa takip edilecek açıklama :)


0

Groovy, 174 Bayt

{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}}

ungolfed:

{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 bayt

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

Çevrimiçi deneyin

Açıklama:

" -_ -_ - "_'-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.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.