Seni semut Langton ASCII.

22

Gambarlah jalan semut Langton .

Deskripsi

Kotak di pesawat berwarna beragam baik hitam atau putih. Kami secara sewenang-wenang mengidentifikasi satu kotak sebagai "semut". Semut dapat melakukan perjalanan dalam salah satu dari empat arah mata angin pada setiap langkah yang diambilnya. Semut bergerak menurut aturan di bawah ini:

  • Di kotak putih, putar 90 ° ke kanan, balikkan warna kotak, maju satu unit
  • Di kotak hitam, belok kiri 90 °, balikkan warna kotak, maju satu unit

Spesifikasi

  • Input: bilangan bulat N antara 0 dan 725 (inklusif).
  • Keluaran: kisi 17 x 17 yang mewakili "jalur" semut pada langkah N.

Aturan

  • Semut mulai menghadap ke kanan (jam 3).
  • Semut mulai di tengah grid.
  • Gunakan _#@untuk kotak putih, kotak hitam dan semut.
  • Grid awalnya sepenuhnya putih.
  • Anda dapat membuat program lengkap atau fungsi pada bahasa yang ditafsirkan.
  • Masukan dengan stdin atau argumen.

Contohnya

Pembaruan: keluaran case = 450 salah.

N = 0

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

N = 1

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

N = 450

_________________
_________________
___________##____
____##______##___
___#__##___##_#__
__###_#@#__#__#__
__#_#_#_#__#_#___
_____###___#_____
_____#___________
_____#__###______
___#_#_#__#_#_#__
__#__#_#____###__
__#_##__##___#___
___##______##____
____##___________
_________________
_________________
Eelvex
sumber
@ Joey: ya "Selesaikan program atau fungsi. Masukan dengan argumen atau stdin.", Freestyle :)
Eelvex
@ Joey: Maaf jika itu tidak jelas: Anda dapat membuat fungsi pada bahasa yang ditafsirkan atau program lengkap. Anda dapat mengambil input dari stdin atau memberikannya sebagai argumen.
Eelvex
@ Joey: Perhatikan bahwa pada langkah 1 semut pertama berbelok ke kanan (sekarang menghadap ke utara) dan kemudian maju. Apakah Anda yakin Anda mempertimbangkannya?
Eelvex
@ Joey: Ya, maksud saya selatan di komentar sebelumnya dan Anda benar, contoh terakhir adalah untuk N berbeda: - / (Diperbarui bagian contoh).
Eelvex

Jawaban:

10

GolfScript - 67 karakter

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

solusi Python hallvabo adalah yang paling mirip dengan ini, jadi saya hanya akan menjelaskan perbedaan utama.

Papan disimpan sebagai string bukan array. Ini agar kita dapat memperbarui nilai di papan tulis dengan karakter yang lebih sedikit (karena string selalu datar), dan mendapatkannya ke format output yang diinginkan mudah.

Posisi semut bertambah dengan rumus ((d&1)*17+1)*((d&2)-1)(yaitu .1&17*)\2&(*), di mana d adalah arah. Kami menggunakan variabel 6sehingga kami dapat melewati inisialisasi.

Nabb
sumber
1
Awww, sekarang saya merasa seperti noob GolfScript.
aaaaaaaaaaaa
:6- sangat hipster. Saya benci debugging kode Anda :-)
John Dvorak
9

Ruby 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]}}

Input melalui argumen fungsi.

  • (146 -> 142) Bergaris m
  • (142 -> 140) Periksa r*r>1alih - alihr.abs>1
  • (142 -> 128) Gunakan String#scanuntuk menghasilkan output. Mengubah ==ke>
  • (128 -> 125) Dihapus variabel usang
  • (125 -> 122) Ganti String#trdengan bersyarat
  • (122 -> 122) Sekarang menghasilkan output yang sama dengan contoh yang diperbarui
  • (122 -> 111) Gunakan ints alih-alih karakter saat membuat jalur semut.
  • (111 -> 109) Susun ulang beberapa ekspresi untuk menyimpan tanda kurung
  • (109 -> 108) Kode sekarang menjadi fungsi
  • (108 -> 104) Cetak setiap karakter satu per satu
Ventero
sumber
Fungsi yang diizinkan.
Eelvex
@Eelvex: Apakah fungsi harus mengembalikan sebuah string, atau apakah harus mengeluarkannya?
Ventero
keluaran.
Eelvex
6

Python, 123

n = input ()
d = x = 152
g = (17 * [95] + [10]) * 17
sementara n: d + = g [x] / 2; g [x] ^ = 124; x + = (1, -18, -1,18) [d% 4]; n- = 1
g [x] = 64
cetak "% c" * 306% tuple (g)

Hanya sedikit pengerjaan ulang solusi Python saya dari http://golf.shinh.org/p.rb?Langtons+Ant .

hallvabo
sumber
5

GolfScript 96 94 89

Bahasa kebencian favorit saya adalah kembali dengan sekelompok bytecode semi-readable.

Versi 89, saya akhirnya berhasil mengintegrasikan @ ke loop output.

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

Versi 94:

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

Berkomentar:

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

Edit, saya mungkin juga membuat versi besar, begini 59 * 59 dan 10500 iterasi:

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

.

___________________________________________________________
___________________________________________________________
_________________________##__##____________________________
________________________#__@_###___________________________
_______________________###__#_#_#__________________________
_______________________#####_#__##_________________________
________________________#___##_##_#________________________
_________________________###___#__##_______________________
__________________________#___##_##_#______________________
___________________________###___#__##_____________________
____________________________#___##_##_#__##________________
_____________________________###___#__##__##_______________
______________________________#___##_##__##___#____________
________________________####___###___#___#__###____________
_______________________#____#___#___##_####___#____________
______________________###____#___#_#______#_##_#___________
______________________###____#_##_____#_##__#_##___________
_______________________#____#___##_#_#_____##______________
_______________________#_#______#_#####__#___#_____________
______________________#___#####__________##_######_________
______________________###__##__#_##_#_#_#___##_#_##________
____________________##__#_#######_#___#__###____##_#_______
___________________#__#__######_##___#__#_##___#___#_______
__________________#____#_#_##_#__######_#######___#________
__________________#_####_##_#_####____##__##_#_##_#________
___________________#____####___#__#_######_##____###_______
______________________#___#_##_#_###_#__##__##___###_______
_________________________#######____#__##_##_#_____#_______
_________________####__##_##__####_##_##_##__#_____#_______
________________#____#_#___###_##_###____#_####____#_______
_______________###_______###_#_#_#####____#_#______#_______
_______________#_#___###_####_##_#___##_###_##_____#_______
_____________________##_##__####____####_#_#_#_____#_______
________________#____#__##___###__###_____###______#_______
________________##___##_###_####__#______###___##__#_______
________________##_#_####_____#___#__#_##_###_##___#_______
_______________####_##___##_####__#_#__#__#__###___#_______
_______________#_##_###__#_#_##_#_#_____#_#_____#_#________
___________________#_#__#____##_##__#_#__###_##____________
___________________##_#____#__#####_#____#____#__#_#_______
__________________#_##_#__#____##_##_#__###______###_______
________________#_#___#__#__#__#__###___##__##____#________
_______________###_#_#####_######_###_#######_#_##_________
_______________#_#_#____#####___##__#####_#####____________
_________________#__##___#______#__#_##__###_###___________
______________####___#####_#########___#_#_________________
_________##____#__#_____###_#_#___#_###__###_______________
________#__#__####_##___###_##___###_##_____##_____________
_______###____#_##_#_#####___#____#__#__##_###_____________
_______#_#####_#_#___##__##_____#____#___#__#______________
___________######_####__##_#___#__##__#_#_##_______________
_________##______#_###_##__####___#___###__________________
__________#__#_#####__#___#_##___#__#__#___________________
__________##_###_#######_____#_____#_##____________________
_________#_#__##_##______#___##____#_______________________
________#__#_####________###__##__#________________________
________#_##_###____________##__##_________________________
_________##________________________________________________
__________##_______________________________________________
aaaaaaaaaaaa
sumber
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}',"$&
"
Joey
sumber
4

PHP, 350 309 307 312 174 161 166 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";

Tidak disatukan

$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: Berbagai teknik kompresi dengan for () loop, juga diperbarui untuk menampilkan output yang benar.
309 -> 307: Konversi main untuk () loop ke while ().
307 -> 312: Lupa mengubahnya untuk menggunakan argv.
312 -> 174: Diprogram ulang berdasarkan jawaban lain.
174 -> 161: Tidak lagi default seluruh array.
161 -> 166: Argv menang lagi.
166 -> 159: Tidak perlu mendefinisikan ulang argv [1].
159 -> 151: Tidak lagi default apa pun, PHP melakukannya secara otomatis.
151 -> 149: Menghapus satu set tanda kurung, urutan operasi menghilangkan kebutuhan.
149 -> 147: Perpendek yang terakhir untuk () loop, kawat gigi tidak diperlukan.
147 -> 144:Terakhir untuk () loop sekarang adalah loop sementara ().
144 -> 143: Menggunakan variabel sementara untuk menyimpan karakter.

Kevin Brown
sumber
Saya melihat Anda menggunakan trik kisi & arah saya, dan itu menghapus 138 karakter dari kode Anda, bagus!
PatrickvL
4

C, 166 162

Di sini terjemahan dari pendekatan Delphi saya ke C, memamerkan betapa kompaknya C. Saya meminjam trik newline bersyarat dari fR0DDY (terima kasih sobat!):

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

Versi indentasi dan komentar terlihat seperti ini:

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 > '#'
}
PatrickvL
sumber
+1. Saya suka triknya "_@#"[g[i]]dana+=(1-(d&2))*(1+(16*(d&1)))
fR0DDY
(1+d%2*16)menghemat beberapa karakter.
Nabb
@Nabb: Memang, itu menghemat 4 karakter, terima kasih atas sarannya!
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.

Kode indentasi & komentar berbunyi seperti ini:

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.

Memasukkan:

450

Keluaran:

_________________
_________________
___________##____
____##______##___
___#__##___##_#__
__###_#@#__#__#__
__#_#_#_#__#_#___
_____###___#_____
_____#___________
_____#__###______
___#_#_#__#_#_#__
__#__#_#____###__
__#_##__##___#___
___##______##____
____##___________
_________________
_________________
PatrickvL
sumber
@ Patrick: contohnya salah, silakan periksa pembaruan. (dan sepertinya Anda menampilkan langkah 451 :)).
Eelvex
@Eelvex: Terima kasih. Saya memperbaiki case 'N = 0' dengan biaya 4 chars ... sekarang saya harus memenangkannya kembali! ;-)
PatrickvL
@Eelvex: PS: Tidak +1 untuk mengetahui kesalahan Anda 3 jam yang lalu hanya dengan komentar sederhana, itu bisa salah saya? ;)
PatrickvL
@ Patrick: Saya menunggu <200 tetapi ok ... :)
Eelvex
@Eelvex: LOL, menuju ke sana ... (sudah turun ke 238)
PatrickvL
3

C 195 Karakter

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

Saya mendapatkan ini untuk 725.

_________________
_________________
___________##____
____##______##___
___#___##__##_#__
__###____#_#__#__
__#_#_#__#_#_#___
______###____#__@
_______###__#__#_
_____#_#____#___#
___#_#_#_##____#_
__#__#_#_#_#_###_
__#_##_#_____####
___##_#____#_####
____###___####_#_
_______#__#__##__
________####_____
fR0DDY
sumber
Menggunakan p+=t+4;x+=a[p%4];alih-alih p=(p+t+4)%4;x+=a[p];menyimpan tiga karakter.
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}

Dapat dikurangi menjadi 478 karakter dengan menghapus baris pertama dan berjalan dengan -n

Membutuhkan N baris untuk input, mis. saat dijalankan sebagai

seq 450 | sed -f ant.sed

output:

_________________
_________________
___________##____
____##______##___
___#__##___##_#__
__###_#@#__#__#__
__#_#_#_#__#_#___
_____###___#_____
_____#___________
_____#__###______
___#_#_#__#_#_#__
__#__#_#____###__
__#_##__##___#___
___##______##____
____##___________
_________________
_________________
Hasturkun
sumber
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

Angka dibaca dari baris pertama STDIN. Sisa input diabaikan.

Sedikit lebih mudah dibaca:

$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

Suntingan

  • (112 → 111) Tidak perlu memperbarui $ddengan nilai modulo-4.

  • (111 → 110) Sekarang dapat menyejajarkan $dkenaikan

Tambahan (109 karakter)

Kami dapat membuat satu karakter lebih pendek jika Anda senang memiliki kasus N=0kegagalan khusus (itu tidak menampilkan @karakter untuk semut). Semua input lain berfungsi dengan benar:

$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

Perbedaannya adalah bahwa kita sekarang menggunakan %falih-alih @fagar kita dapat menggunakan indeks negatif, dan kita beralih dari -144..144bukan 0..288. Menghemat harus diinisialisasi $p.

Timwi
sumber
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}]
alephalpha
sumber
1

> <>, 122 byte

Dengan risiko sedikit necromancy, saya pikir menulis jawaban di> <> akan menjadi tantangan yang menarik ...

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_#@

Program ini mengharapkan sejumlah langkah untuk dihitung agar ada pada tumpukan sebelum dieksekusi.

Sok
sumber