Langton'ın karınca ASCII sanatı.


22

Langton'un karınca yolunu çizin .

Açıklama

Düzlemdeki kareler siyah veya beyaz olarak çeşitli renklerle renklendirilir. Bir kareyi keyfi olarak "karınca" olarak tanımlarız. Karınca, attığı her adımda dört ana yönden herhangi birinde hareket edebilir. Karınca aşağıdaki kurallara göre hareket eder:

  • Beyaz bir karede, 90 ° sağa döndürün, karenin rengini çevirin, bir birim ileri doğru ilerleyin
  • Siyah bir karede, 90 ° sola döndürün, karenin rengini çevirin, bir birim ileri doğru ilerleyin

Özellikler

  • Giriş: 0 ile 725 arasında bir tamsayı (dahil).
  • Çıktı: N'nin adımındaki karıncaya ait "yolu" temsil eden 17'ye 17'lik bir ızgara

kurallar

  • Karınca sağa bakmaya başlar (saat 3).
  • Karınca şebekenin merkezinde başlar.
  • _#@Sırasıyla beyaz kareler, siyah kareler ve karınca kullanın .
  • Izgara başlangıçta tamamen beyazdır.
  • Tercüme edilmiş bir dil üzerinde eksiksiz bir program veya işlev yapabilirsiniz.
  • Stdin veya argüman girişi.

Örnekler

Güncelleme: davanın N = 450 çıkışı yanlış.

N = 0

_________________
_________________
_________________
_________________
_________________
_________________
_________________
_________________
________@________
_________________
_________________
_________________
_________________
_________________
_________________
_________________
_________________

N = 1

_________________
_________________
_________________
_________________
_________________
_________________
_________________
_________________
________#________
________@________
_________________
_________________
_________________
_________________
_________________
_________________
_________________

N = 450

_________________
_________________
___________##____
____##______##___
___#__##___##_#__
__###_#@#__#__#__
__#_#_#_#__#_#___
_____###___#_____
_____#___________
_____#__###______
___#_#_#__#_#_#__
__#__#_#____###__
__#_##__##___#___
___##______##____
____##___________
_________________
_________________

@Joey: yes "Komple program veya fonksiyon. Argüman veya stdin ile giriş.", Serbest :)
Eelvex 14:11

@Joey: Açık değilse üzgünüm: Tercüme edilmiş bir dilde bir fonksiyon veya tam bir program yapabilirsiniz. Stdin'den girdi alabilir veya bir argüman olarak sağlayabilirsiniz.
Eelvex

@Joey: 1. adımda karıncanın önce sağa döndüğünü (şimdi kuzeye bakacağını ) ve sonra ilerlediğini unutmayın. Bunu dikkate aldığına emin misin?
Eelvex

@Joey: Evet, demek güney önceki yorum at ve sağ son örneği farklı N içindi edilir: - / (örnekler bölümünde Güncellendi).
Eelvex

Yanıtlar:


10

GolfScript - 67 karakter

~17.'_'*n+*\153:|;{|/()[124^.2/6+:6.1&17*)\2&(*|+:|;]@++}*|/();'@'@

hallvabo'nun Python çözümü buna en çok benziyor, bu yüzden sadece temel farklılıkları tanımlayacağım.

Tahta bir dizi yerine bir dize olarak saklanır. Bu, tahtadaki bir değeri daha az karakterle (dizeler her zaman düz olduğu için) güncelleyebilmemiz ve böylece istenen çıktı biçimine getirmemiz kolaydır.

Karınca pozisyonu, d'nin yönü olduğu formül ((d&1)*17+1)*((d&2)-1)(yani .1&17*)\2&(*) ile arttırılır . Değişkeni kullanırız, 6böylece başlatmayı atlayabiliriz.


1
Awww, şimdi bir GolfScript noob gibi hissediyorum.
aaaaaaaaaaaa 19:11

:6- Çok hipster. Kodunuzu hata ayıklamaktan nefret ediyorum :-)
John Dvorak

9

Yakut 1.9, 104 karakter

f=->z{l=[*[r=1]*17,2]*17;c=152;z.times{c+=r=(r*r>1?r/18:-r*18)*l[c]*=-1};l[c]=0;l.map{|a|putc"@_
#"[a]}}

Fonksiyon argümanı ile giriş.

  • (146 -> 142) Çizgisel m
  • (142 -> 140) r*r>1Bunun yerine kontrol edinr.abs>1
  • (142 -> 128) String#scanÇıktıyı üretmek için kullanın . Bir Değişti ==için>
  • (128 -> 125) Eski değişken kaldırıldı
  • (125 -> 122) String#trKoşullu ile değiştirin
  • (122 -> 122) Şimdi güncellenmiş örneklerle aynı çıktıyı oluşturuyor
  • (122 -> 111) Karıncaların yolunu oluştururken karakter yerine ints kullanın.
  • (111 -> 109) Parantezlerden tasarruf etmek için bazı ifadeleri yeniden sıralayın.
  • (109 -> 108) Kod şimdi bir fonksiyondur
  • (108 -> 104) Her karakteri ayrı ayrı yazdır

Fonksiyonlar edilir izin verdi.
Eelvex

@Eelvex: İşlev bir dize döndürmek zorunda mı yoksa çıktı mı gerekiyor?
Ventero

çıktı.
Eelvex

6

Python, 123

n = girişi ()
d = X = 152
g = (17 * [95] + [10]) * 17
n: d + = g [x] / 2; g [x] ^ = 124; x + = (1, -18, -1,18) [d% 4]; n- = 1
g [x] = 64
baskı "% C" * 306% tuple (g)

Http://golf.shinh.org/p.rb?Langtons+Ant adresinden Python çözümümün küçük bir elden geçirmesi .


5

GolfScript 96 94 89

En sevdiğim nefret dili, bir kısmı yarı okunabilir sorta-bytecode ile geri döndü.

89 versiyonunda nihayet @ çıkış döngüsüne entegre etmeyi başardım.

~289[0:c]*145:b;{.b>\b<)!..c++(4%:c[1 17-1-17]=b+:b;@++}@*{{(b(:b!.++'_#@@'1/=\}17*n\}17*

94 versiyon:

~306[0:c]*152:b;{.b<\b>(!..c++(4%:c[1 18-1-18]=b+:b;\++}@*{{('_#'1/=\}17*(;n\}17*].b<\b>(;'@'\

Yorumlananlar:

               #Initialization.
~                  #Parse input.
306[0:c]*          #Make array of 306 0s, set c to 0 in the middle of that operation.
152:b;             #Set b to 152, remove 152 from the stack.
                   #b is a value for the ant's position, c for its rotation.

               #Run the algorithm.
{                  #Start of block.
    .b<\b>(        #Split the array at index b into before, after and value at b.
    !..            #Not the value and make 2 copies of it.
    c++            #Add the 2 copies to c.
    (4%:c          #Subtract 1, modulus by 4 and save the result to c.
    [1 18-1-18]=   #Define an array and take element number c.
    b+:b;          #Add b to the value, save result to b, remove result from stack.
    \++            #Reform the array.
}@*                #Switch the input to the top of the stack and run the block input times.

               #Convert array of 1s and 0s to the correct characters.
{                  #Start of block.
    {              #Start of block.
        ('_#'1/=   #Take the first array element, convert it to either '_' or '#'.
        \          #Switch the array to the top of the stack.
    }17*           #Execute block 17 times.
    (;n\           #Discard the 18th element of the line, write a lineshift.
}17*               #Execute block 17 times.

               #Insert the @.
]                  #Put everything in an array.
.b<\b>(            #Split the array at index b into before, after and value at b.
;'@'\              #Ditch the value at b, write a @ and shift it into place.

Düzenleme, büyük bir sürüm de yapabilirim, işte 59 * 59 ve 10500 yineleme:

~59:a.*[0:c]*1741:b;{.b>\b<)!..c++(4%:c[1 a-1-59]=b+:b;@++}@*{{(b(:b!.++'_#@@'1/=\}a*n\}a*

.

___________________________________________________________
___________________________________________________________
_________________________##__##____________________________
________________________#__@_###___________________________
_______________________###__#_#_#__________________________
_______________________#####_#__##_________________________
________________________#___##_##_#________________________
_________________________###___#__##_______________________
__________________________#___##_##_#______________________
___________________________###___#__##_____________________
____________________________#___##_##_#__##________________
_____________________________###___#__##__##_______________
______________________________#___##_##__##___#____________
________________________####___###___#___#__###____________
_______________________#____#___#___##_####___#____________
______________________###____#___#_#______#_##_#___________
______________________###____#_##_____#_##__#_##___________
_______________________#____#___##_#_#_____##______________
_______________________#_#______#_#####__#___#_____________
______________________#___#####__________##_######_________
______________________###__##__#_##_#_#_#___##_#_##________
____________________##__#_#######_#___#__###____##_#_______
___________________#__#__######_##___#__#_##___#___#_______
__________________#____#_#_##_#__######_#######___#________
__________________#_####_##_#_####____##__##_#_##_#________
___________________#____####___#__#_######_##____###_______
______________________#___#_##_#_###_#__##__##___###_______
_________________________#######____#__##_##_#_____#_______
_________________####__##_##__####_##_##_##__#_____#_______
________________#____#_#___###_##_###____#_####____#_______
_______________###_______###_#_#_#####____#_#______#_______
_______________#_#___###_####_##_#___##_###_##_____#_______
_____________________##_##__####____####_#_#_#_____#_______
________________#____#__##___###__###_____###______#_______
________________##___##_###_####__#______###___##__#_______
________________##_#_####_____#___#__#_##_###_##___#_______
_______________####_##___##_####__#_#__#__#__###___#_______
_______________#_##_###__#_#_##_#_#_____#_#_____#_#________
___________________#_#__#____##_##__#_#__###_##____________
___________________##_#____#__#####_#____#____#__#_#_______
__________________#_##_#__#____##_##_#__###______###_______
________________#_#___#__#__#__#__###___##__##____#________
_______________###_#_#####_######_###_#######_#_##_________
_______________#_#_#____#####___##__#####_#####____________
_________________#__##___#______#__#_##__###_###___________
______________####___#####_#########___#_#_________________
_________##____#__#_____###_#_#___#_###__###_______________
________#__#__####_##___###_##___###_##_____##_____________
_______###____#_##_#_#####___#____#__#__##_###_____________
_______#_#####_#_#___##__##_____#____#___#__#______________
___________######_####__##_#___#__##__#_#_##_______________
_________##______#_###_##__####___#___###__________________
__________#__#_#####__#___#_##___#__#__#___________________
__________##_###_#######_____#_____#_##____________________
_________#_#__##_##______#___##____#_______________________
________#__#_####________###__##__#________________________
________#_##_###____________##__##_________________________
_________##________________________________________________
__________##_______________________________________________

5

Windows PowerShell, 119 118

for($p,$n,$g=144,+"$args"+,1*289;$n--){$d+=$g[$p]*=-1
$p+='B0@R'[$d%4]-65}$g[$p]=0
-join'@_#'[$g]-replace'.{17}',"$&
"

4

PHP, 350 309 307 312 174 161 166 159 159 151 149 147 144 143

<?$p=144;while($i=$argv[1]--){$g[$p]=$a=2-$g[$p];$d+=--$a;$p+=(1-($d&2))*(1+16*($d&1));}while($i++<288)echo$i%17?$i!=$p?$g[$i]?"#": _:"@":"\n";

Ungolfed

$p = 144; // Set initial pointer

while($i = $argv[1]--){ // Ends at -1
    $g[$p] = $a = 2 - $g[$p]; // Either returns true (2) or false(0)

    $d += --$a; // Adds 1 (2-1) or removes 1 (0-1) from the direction

    $p += (1 - ($d & 2)) * (1 + 16 * ($d & 1));
}

while($i++ < 288)
    echo $i % 17? $i != $p? $g[$i]? "#" : @_ : "@" : "\n"; // Prints the correct character

350 -> 309: Doğru çıktıyı gösterecek şekilde for () döngülerine sahip çeşitli sıkıştırma teknikleri.
309 -> 307: () Döngü için bir while () döngüsüne dönüştürülen ana.
307 -> 312: argv kullanmak için değiştirmeyi unuttum.
312 -> 174: Başka bir cevaba göre kodlanmıştır.
174 -> 161: Artık dizinin tamamı varsayılan değil.
161 -> 166: Argv tekrar kazandı.
166 -> 159: argv [1] 'i yeniden tanımlamaya gerek yok.
159 -> 151: Artık hiçbir şey varsayılan değil, PHP bunu otomatik olarak yapıyor.
151 -> 149: Bir parantez kümesi kaldırıldı, işlem sırası ihtiyacı ortadan kaldırdı.
149 -> 147: () döngü için son kısaltıldı, kaşlı teller gerekli değil.
147 -> 144:Son () döngü artık bir while () döngüdür.
144 -> 143: Bir karakter kaydetmek için geçici bir değişken kullandı.


Izgara ve yön numaramı kullandığını ve kodundan 138 karakter çıkardığını gördüm, güzel!
PatrickvL

4

C, 166 162

İşte Delphi yaklaşımımın C'ye çevrilmesi, C'nin ne kadar küçük olabileceğini gösteren bir çevirisi. Şartlı yeni hat numarasını fR0DDY'den ödünç aldım (teşekkür ederim dostum!):

g[289]={0},a=144,d,i,N;main(){scanf("%d",&N);while(N--)g[a]=2-g[a],d+=g[a]-1,a+=(1-(d&2))*(1+d%2*16);for(g[a]=1;i<289;)printf("%s%c",i++%17?"":"\n","_@#"[g[i]]);}

Girintili, yorumlu sürüm şöyle görünür:

g[289]={0}, // g: The grid is initially completely white. (size=17*17=289)
a=144, // a: Ant position starts at the center of the grid (=8*17+8=144)
d, // Assume 0=d: Ant start 'd'irection faces right (=0, see below)
i,
N;
main(){
  scanf("%d",&N);
  while(N--)
    // Flip the color of the square:
    g[a]=2-g[a],
    // Turn 90° right if at an '_' space, 90° left otherwise :
    d+=g[a]-1,
    // Move one unit forward;
    //   For this, determine the step size, using the two least significant bits of d.
    //   This gives the following relation :
    //     00 = 0 =  90° = right =   1
    //     01 = 1 = 180° = down  =  17
    //     10 = 2 = 270° = left  = - 1
    //     11 = 3 =   0° = up    = -17
    //   (d and 2) gives 0 or 2, translate that to 1 or -1
    //   (d and 1) gives 0 or 1, translate that to 1 or 17
    //   Multiply the two to get an offset 1, 17, -1 or -17 :
    a+=(1-(d&2))*(1+d%2*16);
  // Place the ant and print the grid :
  for(g[a]=1;i<289;)
    printf("%s%c",i++%17?"":"\n","_@#"[g[i]]); // 0 > '_', 1='@', 2 > '#'
}

+1. Püf noktalarını seviyorum "_@#"[g[i]]vea+=(1-(d&2))*(1+(16*(d&1)))
fR0DDY

(1+d%2*16)birkaç karakter kaydeder.
Nabb

@ Nabb: Gerçekten, bu 4 karakter kaydeder, öneri için teşekkürler!
PatrickvL

4

Delphi, 217

var g,a:PByte;i,d,Word;begin g:=AllocMem(306);a:=g+153;Read(i);for n:=1to i do begin a^:=2-a^;d:=d-1+a^;a:=a+(1-2and d)*(1+17*(1and d))end;a^:=1;for n:=1to 306do if n mod 18=0then WriteLn else Write('_@#'[1+g[n]])end.

Girintili ve yorumlanmış kod şöyle yazıyor:

var
  g,a:PByte;
  i,d,n:Int32;
begin
  g:=AllocMem(306); // g: The grid is initially completely white. (size=18*17=306)
  // Assume 0=d: Ant start 'd'irection faces right (=0, see below)
  a:=g+153; // a: Ant position starts at the center of the grid (=8*18+9=153)
  Read(i);
  for n:=1to i do
  begin
    // Flip the color of the square;
    a^:=2-a^;
    // Turn 90° right if at an '_' space, 90° left otherwise;
    d:=d-1+a^;
    // Move one unit forward;
    //   For this, determine the step size, using the two least significant bits of d.
    //   This gives the following relation :
    //     00 = 0 =  90° = right =   1
    //     01 = 1 = 180° = down  =  18
    //     10 = 2 = 270° = left  = - 1
    //     11 = 3 =   0° = up    = -18
    //   (d and 2) gives 0 or 2, translate that to 1 or -1
    //   (d and 1) gives 0 or 1, translate that to 1 or 18
    //   Multiply the two to get an offset 1, 18, -1 or -18 :
    a:=a+(1-2and d)*(1+17*(1and d))
  end;
  // Place the ant and print the grid :
  a^:=1; // 0 > '_', 1='@', 2 > '#'
  for i:=1to 306do
    if i mod 18=0then // we insert & abuse column 0 for newlines only (saves a begin+end pair)
      WriteLn
    else
      Write('_@#'[1+g[i]])
end.

Giriş:

450

Çıktı :

_________________
_________________
___________##____
____##______##___
___#__##___##_#__
__###_#@#__#__#__
__#_#_#_#__#_#___
_____###___#_____
_____#___________
_____#__###______
___#_#_#__#_#_#__
__#__#_#____###__
__#_##__##___#___
___##______##____
____##___________
_________________
_________________

@Patrick: Örnek yanlıştı, lütfen güncellemeleri kontrol et. (ve adım 451'i çıkardınız :)).
Eelvex

@Eelvex: Teşekkürler. 'N = 0' davasını 4 karakter karşılığında düzelttim ... şimdi tekrar kazanmalıyım! ;-)
PatrickvL

@Eelvex: PS: 3 saat önce sadece mütevazi bir hata ile hatamı tespit etmek için +1 hayır benim hatam olabilir? ;)
PatrickvL

@Patrick: <200 ama bekliyordum ... tamam ... :)
Eelvex

@Eelvex: LOL, oraya varmak ... (
238'e

3

C 195 Karakterler

x=144,T,p=1,i,N[289]={0},a[]={-17,1,17,-1};c(t){p=(p+t+4)%4;x+=a[p];}main(){scanf("%d",&T);while(T--)N[x]=(N[x]+1)%2,c(N[x]?1:-1);for(;i<289;i++)printf("%s%c",i%17?"":"\n",i-x?N[i]?'#':'_':'@');}

http://www.ideone.com/Dw3xW

Bunu 725 için aldım.

_________________
_________________
___________##____
____##______##___
___#___##__##_#__
__###____#_#__#__
__#_#_#__#_#_#___
______###____#__@
_______###__#__#_
_____#_#____#___#
___#_#_#_##____#_
__#__#_#_#_#_###_
__#_##_#_____####
___##_#____#_####
____###___####_#_
_______#__#__##__
________####_____

p+=t+4;x+=a[p%4];Bunun yerine kullanmak p=(p+t+4)%4;x+=a[p];üç karakter kaydeder.
Joey

3

sed, 481 karakter

#n
1{s/.*/_________________/;h;H;H;H;G;G;G;G;s/^\(.\{152\}\)_/\1@/;s/$/;r/;ta;};x;:a;/;r/br;/;d/bd;/;l/bl;/;u/bu;:w;y/rdlu/dlur/;bz;:b;y/rdlu/urdl/;bz;:r;s/@\(.\{17\}\)_/#\1@/;tw;s/@\(.\{17\}\)#/#\1!/;tw;s/_\(.\{17\}\)!/@\1_/;tb;s/#\(.\{17\}\)!/!\1_/;tb;:d;s/_@/@#/;tw;s/#@/!#/;tw;s/!_/_@/;tb;s/!#/_!/;tb;:l;s/_\(.\{17\}\)@/@\1#/;tw;s/#\(.\{17\}\)@/!\1#/;tw;s/!\(.\{17\}\)_/_\1@/;tb;s/!\(.\{17\}\)#/_\1!/;tb;:u;s/@_/#@/;tw;s/@#/#!/;tw;s/_!/@_/;tb;s/#!/!_/;tb;:z;h;${s/!/@/;s/;.//p}

İlk çizgiyi kaldırarak ve çalıştırarak 478 karaktere düşürülebilir -n

Giriş için N satır gerektirir, örn. olarak çalıştırıldığında

seq 450 | sed -f ant.sed

çıktılar:

_________________
_________________
___________##____
____##______##___
___#__##___##_#__
__###_#@#__#__#__
__#_#_#_#__#_#___
_____###___#_____
_____#___________
_____#__###______
___#_#_#__#_#_#__
__#__#_#____###__
__#_##__##___#___
___##______##____
____##___________
_________________
_________________

3

Perl, 110 karakter

$p=144;$p+=(1,-17,-1,17)[($d+=($f[$p]^=2)+1)%4]for 1..<>;$f[$p]=1;print$_%17?'':$/,qw(_ @ #)[$f[$_]]for 0..288

Sayı, STDIN'in ilk satırından okunur. Girişin geri kalanı yoksayılır.

Biraz daha okunaklı:

$p=144;
$p += (1,-17,-1,17)[($d+=($f[$p]^=2)+1) % 4] for 1..<>;
$f[$p]=1;
print $_%17 ? '' : $/, qw(_ @ #)[$f[$_]] for 0..288

Düzenlemeler

  • (112 → 111)$d Modulo-4 değeri ile güncelleme yapmaya gerek yok .

  • (111 → 110) Artık $dartışın satır içi olabilir

Zeyilname (109 karakter)

Özel bir N=0başarısızlık durumundan memnunsanız ( @karınca için karakter çıkarmazsa) , bir karakterden daha kısa olabiliriz . Diğer tüm girişler doğru çalışıyor:

$p+=(1,-17,-1,17)[($d+=($f{$p+0}^=2)+1)%4]for 1..<>;$f{$p}=1;print$_%17-9?'':$/,qw(_ @ #)[$f{$_}]for-144..144

Farklılıklar, şimdi %fyerine kullanmak yerine @fnegatif endeksleri kullanabilmemiz ve -144..144bunun yerine yinelememizdir 0..288. Başlatmak zorunda kalmaz $p.


1

Mathematica, 94 karakter

a@_=d=1;a@Nest[#+(d*=(a@#*=-1)I)&,9-9I,Input[]]=0;Grid@Array["@"[_,"#"][[a[#2-# I]]]&,17{1,1}]

1

> <>, 122 bayt

Küçük bir iş parçacığı yanlışlığı riski altında, <>> 'ya cevap yazmanın ilginç bir zorluk olacağını düşündüm ...

1&f8r\
1-:?!\r:@@:@$:@@:@g:2*1+&+4%:&}1$-@p{:3$-5gaa*-$@+@5gaa*-+r
2}p70\~
a7+=?\:@@:@g4+5go$1+:
o053.>~1+:64*=?;a
dedc_#@

Bu program yürütmeden önce yığında bulunması gereken hesaplamaların sayısını bekler.

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.