Boş bir Go tahtasına bir taş yerleştirin


34

Ayrıca bakınız: Go panosunda bir hareket yapın .

Görev

Go, iki oyuncunun (Siyah ve Beyaz), 19 × 19'lık bir tahtadaki ızgara çizgilerinin kesişme noktalarına taş yerleştirdiği bir tahta oyunudur. Önce siyah hareket eder - örneğin, D4'te:

       koordinatlara git

Bu mücadelede D4girdi gibi bir Go kurulu koordinatını almalı ve verilen noktada oynanan ilk hamle ile bir ASCII kartı temsili vermelisiniz .

Sütun I olmadığına dikkat edin. Bu, tarihsel olarak, J ve L ile karışıklığı azaltmak içindir.

Bu çıktı, her biri 19 karakter içeren 19 satırdan oluşur. Üzerinde taş bulunan nokta işaretlenmiştir O. Kartındaki boş noktaları olarak gösterilmiştir .dokuz hariç yıldız noktalarının (en D4, D10, D16, K4, K10, K16, Q4, Q10, ve Q16), işaretlenmiş olan *.

Örneğin, F5bir girdi olarak verilen cevap, çıktınızın şöyle olması gerekir:

...................
...................
...................
...*.....*.....*...
...................
...................
...................
...................
...................
...*.....*.....*...
...................
...................
...................
...................
.....O.............
...*.....*.....*...
...................
...................
...................

Q16Girdi olarak verilen çıktı:

...................
...................
...................
...*.....*.....O...
...................
...................
...................
...................
...................
...*.....*.....*...
...................
...................
...................
...................
...................
...*.....*.....*...
...................
...................
...................

kurallar

  • Koordinatı argüman olarak alan bir fonksiyon yazabilir veya koordinatı komut satırından veya komutundan okuyan bir program yazabilirsiniz STDIN.

  • Girişi küçük harfli veya büyük harfli kabul etmeyi seçebilirsiniz, ancak cevabınızın ikisini birden tutması gerekmez.

  • Giriş her zamana1 veya T19asla bir dize + sayı veya iki dize gibi tek bir dizedir.

  • Tam bir program yazarsanız, cevabınız STDOUTisteğe bağlı olarak takip eden bir yeni satır izleyen bir dizge şeklinde basılmalıdır . Cevabınız bir fonksiyon ise, yazdırmak olabilir STDOUT, ya da  bir dize döndürür, veya  dizeleri (satır) bir dizi / listesini döndürür, ya  bir iki boyutlu bir dizi veya karakter yuvalanmış listesini döndürür.

  • Bu . Bayt cinsinden en kısa cevap kazanır.


Emin olmak için, "bir argüman olarak koordinat" demek, iki f("G", 14)doğru argüman alamayacağımız anlamına mı geliyor ?
FryAmTheEggman

8
20k için tebrikler !!
Luis Mendo

2
“Bu, tarihsel olarak, J ve L ile karışıklığı azaltmak için” Ama hem J hem de L gemidedir ??!
16'da 20

2
Evet. Ayrıca, elbette, eksik mektup muhtemelen her şeyden daha fazla kafa karışıklığı ve sürpriz yarattı…
Lynn

2
@Faltalize, J ve L alt kısımları ayrı yönlere döndüğünden oldukça farklı görünürler. J ve l'de olduğu gibi biri iner, diğeri artar. Ama ben ve j biraz
benzerim

Yanıtlar:


9

MATL , 33 bayt

'*O.'19: 6\4=&*Hj1&)Uw64-t8>-&(P)

Çevrimiçi deneyin!

açıklama

'*O.'    % Push string with needed characters. Will be indexed into
19:      % Push numeric vector [1 2 ... 19]
6\4=     % 1 for values that equal 4 mod 6, 0 for the rest
&*       % Multiply by transposed version of itself with broadcast. This gives
         % the 19×19 board with 0 instead of '.' and 1 instead of '*'
H        % Push 2. This will correspond to 'O' (stone)
j        % Input string, such as 'Q16'
1&)      % Split into its first char ('Q') and then the rest ('16')
U        % Convert to number (16)
w        % Swap, to move 'Q' to top
64-      % Subtract 64. Thus 'A' gives 1, 'B' gives 2 etc
t8>-     % Duplicate. Subtract 1 if it exceeds 8. This corrects for missing 'I'
&(       % Fill a 2 at coordinates given by the number and the letter
P        % Flip upside down, because matrix coordinates start up, not down
)        % Index the string '*O.' with the 19×19 array containing 0,1,2.
         % Implicitly display

16

C, 212 195 193 181 171 132 103 98 bayt

@FryAmTheEggman sayesinde 1 bayt, @orlp sayesinde 5 bayt kaydedildi

f()Oynamak için pozisyon ile arayın (büyük harfle yazılmalıdır) ve sonuçta ortaya çıkan tahtayı yazdırır.

i;f(char*p){for(i=380;i--;)putchar(i%20?i^20*atoi(p+1)+64-*p+(*p>72)?i%6^4|i/20%6^3?46:42:79:10);}

İdeone üzerinde deneyin .


2
98 baytputchar(i%20?i^20*atoi(p+1)+64-*p+(*p>72)?i%6^4|i/20%6^3?46:42:79:10)
orlp

Teşekkürler. Bu modulo ifadesini azaltmanın bir yolunu arıyordum.
owacoder

9

C (gcc), 132 128 109

i;m;f(char*s){for(i=380;i--;putchar(m?m^84-*s+(*s>73)|(i/20+1)^atoi(s+1)?m%6^4|i/20%6^3?46:42:79:10))m=i%20;}

Ideone

Kartı STDOUT'a basan bir fonksiyon. Harf koordinatının büyük olmasını gerektirir. Bir döngüde yazdırma, önceki iç içe döngü yaklaşımından biraz daha kısa görünüyor.


7

MATLAB, 135 bayt

İlk girişimi, zekice bir şey, sadece başkalarının ne kadar iyi yapabileceğini görmek için:

function go(a)
b=repmat('.',19);
b(4:6:end,4:6:end)='*';
a=sscanf(a,'%c%d');
a(1)=a(1)-64;
if a(1)>8
a(1)=a(1)-1;
end
b(20-a(2),a(1))='0'

Kullanımı:

go('T19')

4
PPCG'ye Hoşgeldiniz! Baytları azaltmak için bazı öneriler: 1 karakterli bir işlev adı kullanın (veya ile bir komut dosyası a=input('');); yeni satırları kaldırın; değişiklik'*' için 42ve '0'için 48; yerine endgöre 19; mantıksal değeri doğrudan ifdal yerine çıkarın . Aslında, son beş satırın yerini değiştirebilirsinizb(20-a(2),a(1)-64-(a(1)>8))=48
Luis Mendo

Merhaba ve PPCG'ye hoş geldiniz. Yanılmıyorsam, kodunuz 137 bayt uzunluğunda ve 135 değil. (Sanırım çok önemli değil, ama sadece size bildirmek istedim)
Dada

7

Ruby, 93 91 bayt

Komut satırında girdi alır, örn $ ruby script.rb Q16.

19.downto(1){|c|puts ([*?A..?T]-[?I]).map{|d|d+c.to_s==$*[0]??O:"DKQ"[d]&&c%6==4??*:?.}*""}

Repl.it üzerinde test et (repl.it komut satırı argümanları almadığından orada bir lambdaya sarılmış: https://repl.it/CkvT/1

Ungolfed

19.downto(1) do |row|
  puts ([*?A..?T] - [?I]).map {|column|
    if column + row.to_s == ARGV[0]
      "O"
    elsif "DKQ"[column] && row % 6 == 4
      "*"
    else
      "."
    end
  }.join
}

Sanırım $><<yerine bir bayt kurtarabilirsin puts . Emin değilim.
Fon Monica'nın Davası

@QPaysTaxes Ne yazık ki, o zaman bir yere yeni bir satır eklemek zorunda kalacağım.
Ürdün

Ah evet Boşver
Fon Monica'nın Davası,

6

Gitmek, 319 286 bayt

import(."strconv"
."strings")
func g(c string)(s string){p:=SplitN(c,"",2)
n,_:=Atoi(p[1])
for i:=19;i>0;i--{
for j:= 'a';j<'t';j++{
if j=='i'{
}else if n==i&&ContainsRune(p[0],j){s+="o"
}else if((i==4||i==10||i==16)&&(j=='d'||j=='k'||j=='q')){s+="*"
}else{s+="."}}
s+="\n"}
return}

Muhtemelen golf oynamayı bıraktım.


Eğer yeniden adlandırarak 9 karakterleri kurtarabilecek partiçin p?
corsiKa

Go golf için ipuçları. Onları cevabınıza kendim uygulama özgürlüğümü aldım.
EMBLEM

"Dil seçimi için +1" yorumunun gönderinin kendisinden daha fazla olumlu olduğuna dikkat ettin mi? (Yorumların daha fazla oy hakkı olduğu ortaya çıkar, ancak böyle bir yorum için, bu beklenmeyen bir durumdur)
Dada

4

Ruby, 130 128 121 + 3 ( -nbayrak) = 124 bayt

Anahtarlı -piçin -nçünkü puts bbirden bayt kısadır$_=b*$/

~/(.)(.+)/
b=(1..19).map{?.*19}
(a=3,9,15).map{|i|a.map{|j|b[i][j]=?*}}
b[19-$2.to_i][([*?A..?T]-[?I]).index$1]=?o
puts b

İndeks mod 6'nın 3, 9 ve 15 kodlama yerine 3 olup olmadığını kontrol ederek byte tasarruf edebilir misiniz?
FryAmTheEggman

@FryAmTheEggman Olabilir, ama henüz böyle bir çözüm bulamadım.
Değer Mürekkebi

4

Python, 148 145 136 130 121 119 116 Bayt

@RootTwo sayesinde -3 Bayt

lambda x,r=range(19):[[".*o"[[i%6==j%6==3,2][j==ord(x[0])-(x>"I")-65and-~i==int(x[1:])]]for j in r]for i in r[::-1]]

anonim lambda işlevi, "A1" (büyük harfler) formunun girişini alır ve karakter listelerinin bir listesini çıkarır (len == Python'da 1 string)


".*oo"[2*(j==ord(x[0])-(x[0]>"I")-65and int(x[1:])==i+1)+(i%6==j%6==3)]Bunun yerine 8 bayttan "o"if...else"*"if...else"."
tasarruf

Ayrıca, 3 bayttan daha fazla tasarruf etmek (x>'I')yerine kullanabileceğinizi düşünüyorum (x[0]>'I').
RootTwo,

@RootTwo Teşekkürler, o zamandan beri daha kısa bir çözüm bulduğum için ilk öneri artık kullanışlı değil. İkincisi şimdi açık görünüyor ve neden bunu daha önce düşünmediğimi sorguluyor.
KarlKastor

4

> <> , 98 96 bayt

'_U'i-:b)-0\
+*a$%cv?(0:i<
{*+{4*\+
+4gf-o>1-:?!;:{:}=3*&::aa+%::0=2*&+&6%1-}-aa+,6%{*9=&
=9^^

Not bir olduğunu 0x14ilk sonra ilk satırda 've bir 0x19arasında 9ve birinci ^son satırın. Çevrimiçi deneyin!

Giriş şekilde eşleştirilir A-Thaline 1-19(hayali "satır" sütununu gösteren 0 ile) ve tamsayı satır numarası 1 ile indirildiği program yapar 0 379 aşağı, gider olarak alt satır bir char seçerek bir halkadan ( kod kutusuna tam anlamıyla yeni bir satır giremediğiniz gerçeğini hesaba katarak 15 ile dengeleyin). Yeni satırlar kontrol edilir i % 20 == 0ve yıldız noktaları kontrol edilir ((i%20-1)%6)*((i/20)%6) == 9.


4

F #, 241 237 225 216 214 211 bayt

let G(c:string)=for k=1 to 380 do printf(if k%20=0 then"\n"elif"_ABCDEFGHJKLMNOPQRST".IndexOf c.[0]=k%20&&19-k/20=int(c.Substring 1)then"o"elif(k%20=4||k%20=10||k%20=16)&&(k/20=3||k/20=9||k/20=15)then"*"else".")

Bunu biraz zor ... Acaba daha kısa sürede yapılabilir mi?

Düzenleme: bir hata düzeltildi, numara eklendi, bazı yerlerde başka numara çıkarıldı, bir şekilde aynı sayı ile sonuçlandı. Daha sonra etrafındaki numaraları karıştırmayı deneyebilirsin .

Düzen2: Sezgisel olarak, koşullardan birini heceleyerek daha fazla bayt kurtardı.

Düzenleme 3: Başka bir hata düzeltildi: Son sıradaki parçalar için şimdi çalışmalı ve ben de iken iki bayttan tasarruf etmeyi başardım.

Çevrimiçi deneyin


Oh sorun buydu. Komik, iki kere
bakmadığım


3

Perl, 132 bayt

@Dom Hastings sayesinde -3 bayt

@v=eval"[('.')x19],"x19;@{$v[$_]}[@t]=("*")x3for@t=(3,9,15);pop=~/\d+/;$v[19-$&][($t=ord$`)-65-($t>73)]=O;map{say}map{join"",@$_}@v;

Komut satırı girişi alır. İhtiyaç -M5.010tu run. Örneğin :

$ cat go_board.pl
@v=eval"[('.')x19],"x19;@{$v[$_]}[@t]=("*")x3for@t=(3,9,15);pop=~/\d+/;$v[19-$&][($t=ord$`)-65-($t>73)]=O;map{say}map{join"",@$_}@v;
$ perl -M5.010 go_board.pl Q16

Bunun daha kısa olabileceğini düşünüyorum, ama nasıl olduğunu çözemedim ... lütfen yaparsanız bana bildirin


Daha fazla sihirli değişkenin tekrar güzel kullanımı! Bunu doğru bir şekilde test etmedim, ancak @v=([(".")x18])x18;listeyi başlatmak için birkaç tane daha tasarruf edebileceğinizi düşünüyorum ... Bundan daha iyi bir yol olabilir, ama şu anda bir terminalde değilim! Sanırım, @{...}genişletmeyi değiştirmeyi $v[$_]->[@t]yeniden düzenleme oklarıyla da değiştirebilirsiniz: yine de denenmedi! Ayrıca kod değişikliklerini
Dom Hastings

1
@HomHastings Elbette umursamıyorum, aksine, sizi iyileştirmeler önermek için teşvik ediyorum! @v=([(".")x19])x19çalışmaz (btw'den önce denedim), çünkü yalnızca bir diziref yaratıyor ve diziyi değil 19 kez kopyalıyor, dizide değil (yani sonunda 19 kez kopyalanan sadece 1 satır var). Değiştirme @{..}ya işe görünmüyor önerildiği gibi. Sanırım bunun nedeni bir dilim üzerinde çalışıyorum ve sadece bir element değil. Başka bir öneriniz varsa, önermekten çekinmeyin! :)
Dada

1
Kahretsin, tabii ki aynı olurdu ... Ben kullanımına başardınız evaliçin -3 olsa: @v=eval"[('*')x19],"x19;. Ve arrayref ile% 100 haklısın ... 1D dizisi kullanmak ve dizini bu şekilde çözmek mümkün olabilir mi? Daha sonra bununla oynayabilir!
Dom Hastings

@DomHastings -3 bayt için teşekkürler. Belki de bir 1D dizisi ile denemek için bir şey. Yakında deneyeceğim
Dada

3

Toplu, 322 310 308 bayt

@echo off
set/pi=
set/aa=0,b=1,c=2,d=3,e=4,f=5,g=6,h=7,j=8,k=9,l=10,m=11,n=12,o=13,p=14,q=15,r=16,s=17,t=18,x=%i:~1%-1,y=%i:~,1%,z=y+1
for /l %%r in (18,-1,0)do call:l %%r
exit/b
:l
set s=...*.....*.....*...
call set t=%%s:~%1,1%%
if %x%==%1 call set s=%%s:~,%y%%%o%%s:~%z%%%
call echo %%s:.*=.%t%%%

Açıklama: Stdin'de taşın istenmesiyle başlar. Daha sonra, olası her sütun için değişkenleri ayarlar, böylece taşın ilk karakterini ykoordinatı almak için bir değişken olarak değerlendirebilir . xKoordinattan 1 çıkarır, çünkü 1 indekslidir ve biz 0 indeksli istiyoruz ve z=y+1daha sonra ihtiyaç duyulacağı gibi hesaplıyoruz . Ardından, rher satır için 18'den 0'a kadar döngüler . Dizeyi alır ...*.....*.....*...ve karakteri rdaha sonra kullanmak üzere th konumunda çıkarır . Açık xinci sıranın, yinci karakteri bir değiştirilir o. Son olarak, .*s bir .artı ile daha önce çıkarılan karakterle değiştirilir; bu, 4, 10 ve 16 satırlarındaki bir ameliyat değildir, ancak bunu başarmanın en kısa yoludur. (Kullanmak zorundayım.* değiştirilmesi nedeniyle *Toplu görünüşe göre yasaktır.)


2

PowerShell v2 +, 157 152 bayt

$x,$y=[char[]]$args[0];$a=,0*19;0..18|%{$a[$_]=,'.'*19};3,9,15|%{$i=$_;3,9,15|%{$a[$_][$i]='*'}};$a[-join$y-1][$x-65-($x-gt73)]='O';$a[18..0]|%{-join$_}

(Ben virgül operatörü ile garip bir aksaklıkla karşılaştı düşünüyorum, bu yüzden dizi inşaat olması gerektiğinden biraz daha uzun)

Girdiyi büyük harfli bir dize olarak alır $args[0], onu bir karakter dizisi olarak atar, ilk harfini $xve kalan harfleri içine kaydeder $y. Bu, girişi harf / sayıya etkili bir şekilde böler.

Daha sonra çok boyutlu dizimizi kurarız $a . Bu boyuttaki bir dizi önceden doldurmak 19ile 0virgülle operatörü kullanılarak s. Daha sonra tekrar virgül işlecini kullanarak, 0..18her bir öğeyi $a[$_]eşit aralıklarla eşitlemek için döngü kurarız. (NB - Teoride, bunun yoğunlaştırılması gerekir $a=,(,'.'*19)*19, ancak bu indeksleme ödevi ile tam olarak çalışmıyor gibi görünüyor ... Tüm sütunların ayarlanması için yaralandım *)

Sonra, iki kere dönüyoruz 3,9,15 karşılık gelen öğeleri ayarlamak için* . Daha sonra taşı yerleştirmek için doğru noktada indeksleriz O. Bunu yapmak için, biz çıkarmak 65dan $x(yani ASCII "A" 65, ve biz sizsiniz, sıfır endeksli) ve eğer bir Boole-to-int döküm kullanarak ek bir çıkarır $xdaha büyük73 (yani ASCII "I" ).

Şimdi çıktımız tersine döndü (yani sol üst A1 ), bu yüzden diziyi tersine çevirmemiz gerekir $a[18..0]. Sonunda, -joinbir dizge oluşturmak için her satırı birlikte ediniyoruz.


2

> <> , 124 bayt

C cevabımla aynı yaklaşımı kullanır. Giriş, büyük bir harf ve ardından ondalık bir sayı olmalıdır.

88*i:&-&'I')+0 v
*a&-'0'v!?)0:i&<+
+**2a&~/*a'&'&
:;!?:-1<o'O'v!?=&:&
{*?!v'*'o63.>:6%4=}:a4*+'x'%aa*)
*2a:/  av?%
.37o<'.'<

Çevrimiçi deneyin!

Açıklama:

88*i:&-&'I')+0 v         'Push 64-<first input char>+(<first input char> > 'I')
*a&-'0'v!?)0:i&<+        'Set register to 0, parse decimal integer into register.
+**2a&~/*a'&'&           'Pop the -1 (EOF) from stack, multiply register by 20.
                         'Add result of first line to register.
                         'Push 380 onto stack.
:;!?:-1<o'O'v!?=&:&      'Main loop, while top of stack is not 0.
                         'Subtract 1 from top of stack (loop counter)
                         'If current index is the playing piece index, print 'O'
{*?!v'*'o63.>:6%4=}:a4*+'x'%aa*) 
                         'If (index%6)=4 and (index+40)%120>100, print '*'
*2a:/  av?%              'If (index%20)=0, print newline
.37o<'.'<                'Otherwise, print '.'

1

JavaScript, 138 bayt

s=>[...t="...*.....*.....*..."].map((c,i)=>t.replace(/\*/g,c).replace(/./g,(c,j)=>x-j|19-i-s.slice(1)?c:'o'),x=parseInt(s[0],36)*.944-9|0)

Bir dizi dizeyi döndürür. Açıklama:

s=>[...                         Parameter
 t="...*.....*.....*..."        Pattern of lines 4, 10 and 16
].map((c,i)=>                   Loop 19 times
 t.replace(/\*/g,c)             Change the `*` to `.` on other lines
  .replace(/./g,(c,j)=>         Loop over each character
   x-j|19-i-s.slice(1)?c:'o'),  Change to o at the appropriate position
 x=parseInt(s[0],36)*.944-9|0)  Compute the column number from the letter

Bir dizge dizisi sadece istenen çıktıya uymuyor join. Ayrıca D5 için yanlış sıraya ve yanlış sütuna o yerleştirir (ilk test durumu).
Konijn

@tomdemuyt Bir dizge dizisine dönüş değeri olarak izin verilir. Ancak, satırlarımı ve sütunlarımı karıştırmam mümkün, bu yüzden iki kez kontrol edeceğim.
Neil

Hmm, gerçekten dizge dizisi
Konijn

1

R, 169 161 bayt

f=function(p){S=substr;N=rep(".",114);N[61+6*0:2]="*";M=matrix(N,19,19);M[(S(p,2,3):1)[1],which(LETTERS[-9]==S(p,1,1))]="O";for(i in 19:1)cat(M[i,],"\n",sep="")}

Girintiler ve yeni satırlarla:

f=function(p){
    S=substr
    N=rep(".",114) # 6 lines of dots
    N[61+6*0:2]="*" # Place the hoshis
    M=matrix(N,19,19) # Make the 19x19 board using vector recycling
    M[(S(p,2,3):1)[1],  #grab and force coerce the row number to integer
      which(LETTERS[-9]==S(p,1,1))]="O" #Place the first stone
    for(i in 19:1) cat(M[i,],"\n",sep="")
}

Kullanımı:

> f("A19")
O..................
...................
...................
...*.....*.....*...
...................
...................
...................
...................
...................
...*.....*.....*...
...................
...................
...................
...................
...................
...*.....*.....*...
...................
...................
...................
> f("D4")
...................
...................
...................
...*.....*.....*...
...................
...................
...................
...................
...................
...*.....*.....*...
...................
...................
...................
...................
...................
...O.....*.....*...
...................
...................
...................
> f("K10")
...................
...................
...................
...*.....*.....*...
...................
...................
...................
...................
...................
...*.....O.....*...
...................
...................
...................
...................
...................
...*.....*.....*...
...................
...................
...................

1

Lua, 187 Bayt

function g(i)i:gsub("(%a+)(%d+)",function(a,b)q=string.byte(a)-64 r=b+0 end)for x=1,19 do s=""for y=1,19 do s=s..(x+y*19==r+q*19 and"o"or(x-4)%6+(y-4)%6==0 and"*"or"-")end print(s)end end

Bu özel proje için 187 hakkında kendimi kötü hissetmiyorum. Lua hala Golf için çok tıknaz çıkıyor, ama bununla ne kadar ileri gidebileceğimle gurur duyuyorum.


1

PHP, 280 268 263 261 255 218 216 bayt

<?php $a=ucfirst($argv[1]);$x=substr($a,0,1);$y=substr($a,1);$s=['DKQ',4,16,10];$i=85;while(64<$i--){$j=0;while($j++<20){echo($x==chr($i)&&$y==$j)?'O':((strpos($s[0],chr($i))>-1&&in_array($j,$s))?'*':'.');}echo"\n";}

Benim ilk golf.

Kullanımı:
Bir PHP dosyası olarak kaydedin ve php filename.php coordinateörneğin tarafından arayınphp go.php k13

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.