Penjelajah Tiny


34

Anda seorang penjelajah, memetakan dunia yang tidak dikenal. Kapal Anda terbawa angin. Kemana perginya, siapa yang tahu?

Setiap hari, di spyglass Anda, Anda melihat fitur di utara, selatan, timur dan barat. Anda selalu melihat empat fitur tersebut, sesuai dengan arah mata angin. Spyglass Anda melaporkan simbol ASCII seperti ini:

~~.*, ~~~~, ~.^^,~#~#

Simbol berada dalam urutan (utara, selatan, timur, barat).

Ini adalah simbol: ~= laut, .= pantai, ^= gunung, *= pohon, #= tidak valid (tidak ada pengamatan, ini terjadi setiap kali Anda melihat ujung dunia, atau bentang alam dikaburkan oleh kabut). Spyglass Anda melihat tepat satu unit di setiap arah.

Setiap malam, Anda melihat bintang-bintang untuk melihat seberapa jauh Anda bepergian. Melihat bintang-bintang melaporkan simbol ascii seperti ini:

n, s, e,w

masing-masing sesuai dengan Utara, Selatan, Timur dan Barat. Anda selalu memindahkan tepat satu unit ke utara, selatan, timur atau barat setiap malam. Jadi Anda, sebagai penjelajah akan menerima aliran simbol tanpa akhir:

~~.*n~~~~s~~.*s~.**

Tugas Anda adalah menampilkan peta 2D dunia (di mana ?ada bagian peta yang tidak diketahui, utara naik, timur kanan):

?~~~??????
?~~~??????
?~~~.^^.??
?~~.***.~~
~~.*^^*.~~
~~~..~~~~~
~~~~~~~~~~
~~~~~~~~~~

Demi kesederhanaan, mari kita asumsikan Anda mulai di sudut kiri bawah peta. Asumsikan semua peta adalah 8x8.

Berikut ini adalah contoh 3x3 sederhana. Asumsikan peta terlihat seperti ini:

~.~
~^~
~.~

Dengan input berikut: ~#.#n~~^#s

Anda akan mendapatkan hasil ini:

~??
~^?
~.?

Lebih banyak contoh input dan output:

memasukkan ~#~#n~~~#n~~~#n~~~#n~~~#n~~.#n~~.#n#~~#e#.~~e#.~~e#.~~e#.~~e#~~~e#~~~e#~#~s~~#~s~~#~s~~#~s~~#.s~~#~s~~#~s~##~w~#~~w.#~~w^#~~w.#~~

keluaran

~~~~~~~~ 
~....~~~ 
~.????~~ 
~~????~~ 
~~????.~ 
~~????~~ 
~~?.^.~~ 
~~~~~~~~

Memasukkan:

~#~#e~#~~e~#~~e.#~~e^#~~n.~..n~^~.n~.~~n.~~.n.~~*n~.~.n#.~~w#.~~w#.~~s~*..s..*.s*~.~s.~~~s

Keluaran:

?~~~~~?? 
?....~?? 
?.**.~?? 
?~..~~?? 
?~~~~~?? 
?~~..~?? 
~~~.^.?? 
~~~~~~?? 

7
Selamat Datang di Programming Puzzles & Code Golf! Ini adalah tantangan pertama yang bagus. Ada beberapa hal yang tidak jelas bagi saya: Haruskah semua simbol dalam output dipisahkan ruang? Itu tampaknya menjadi kasus dalam contoh output tetapi tidak secara eksplisit dinyatakan di mana saja. Juga, apa tujuan melayani arah bintang? Saya pikir mungkin mereka mengontrol di mana pada peta simbol pergi, tetapi mengikuti contoh dan mulai di kiri bawah, itu tampaknya tidak menjadi masalah. Dapatkah Anda menguraikan itu?
Alex A.

Output tidak harus dipisahkan dengan ruang, itu adalah kesalahan pada bagian saya. "#" Mewakili "tidak ada pengamatan". Mereka terjadi setiap kali Anda berada di batas peta, tetapi bisa juga terjadi secara acak.
user52676

4
Luar biasa. Seperti yang dikatakan Alex, ini adalah tantangan pertama yang hebat. Saya berharap dapat melihat lebih banyak dari Anda di masa depan! :) (FYI, Sandbox adalah tempat yang bagus untuk mendapatkan umpan balik tentang tantangan di masa depan.)
El'endia Starman

1
Saya menduga contoh pertama (di mana inputnya ~#~#n~~~#n~~~#n~~~#n~~~#n~~.#n~~.#n#~~#e#.~~e#.~~e#.~~e#.~~e#~~~e#~~~e#~#~s~~#~s~~#~s~~#~s~~#.s~~#~s~~#~s~##~w~#~~w.#~~w^#~~w) salah, dan output seharusnya ada di ??mana dikatakan?.
Leaky Nun

3
Ini adalah kapal udara ajaib ;)
user52676

Jawaban:


8

MATL , 68 59 58 byte

'?'7XJQtX"'s'jh5e"@2#1)t35>)-1l8t_4$h9M)b'nsew'=8M*sJ+XJ+(

Cobalah online!

Penjelasan

Peta disimpan di bagian bawah tumpukan dan secara bertahap diisi. Posisi explorer saat ini disimpan di clipboard J.

Peta menggunakan koordinat matriks, sehingga (1,1) adalah kiri atas. Selain itu, pengindeksan linear kolom-utama digunakan. Ini berarti bahwa elemen-elemen dari matriks 8 Ă— 8 yang mewakili peta diakses dengan indeks tunggal sebagai berikut:

1  9 17 25 33 41 49 57
2 10 18 26 34 42 50 58
3 11 19 27 35 43 51 59
4 12 20 28 36 44 52 60
5 13 21 29 37 45 53 61
6 14 22 30 38 46 54 62
7 15 23 31 39 47 55 63
8 16 24 32 40 48 56 64

Jadi misalnya elemen (3,2) dari matriks adalah elemen dengan indeks linier 11. Gerakan ke arah Utara, Selatan, Timur dan Barat masing-masing berhubungan dengan menambahkan -1, 1, 8 atau -8 ke indeks linier. Array [-1 1 8 -8] berfungsi untuk menyandikan dua hal yang berbeda:

  • Kemungkinan perpindahan penjelajah.
  • Posisi relatif fitur yang terdeteksi dengan spyglass. Posisi ini relatif terhadap posisi explorer saat ini.

String input disusun menjadi potongan-potongan 5karakter. Karena potongan pertama tidak memiliki karakter pertama (yang menunjukkan gerakan), inisial sdimasukkan secara sewenang-wenang untuk membuat semua potongan ukuran yang sama. Untuk mengimbangi ini, penjelajah mulai di posisi 7, bukan 8, sehingga perpindahan awal ke Selatan (tambahkan 1 ke indeks linier) membuat mereka di posisi 8.

Potongan 5 karakter diproses dalam satu lingkaran. Karakter pertama memperbarui posisi, dan 4 sisanya, jika berbeda dari #, dituliskan ke dalam entri matriks yang mewakili peta.

'?'          % push '?'. The map will initially be filled with this
7XJ          % push 7: initial position of the explorer. Copy into clipboard J
Qt           % add 1. Duplicate
X"           % 8x8 matrix containing '?'
'n'jh        % take input string. Prepend 'n'
5e           % reshape into a 5-column matrix
"            % for each column (chunk)
  @          %   push current chunk
  2#1)       %   split chunk into its first char and an array with the other 4
  t35>       %   duplicate. Logical index of chars different than #
  )          %   apply that index to keep characters different than #
  -1l8t_4$h  %   array [-1 1 8 -8]
  9M         %   push logical index again
  )          %   apply that index to keep only relevant relative positions
  b          %   bubble up in stack: move first char of chunk to top
  'nsew'=    %   logical index that tells if that char is 'n', 's', 'e' or 'w'
  8M         %   push array [-1 1 8 -8] again
  *          %   multiply element-wise. Only one of the four results will be nonzero
  s          %   sum of the array. Gives displacement of the explorer
  J+         %   push position of the explorer and add to compute new position
  XJ         %   update position in clipboard J
  +          %   add updated position of explorer to relative positions of features
  (          %   write those fearttures into the indexed entries of the map
             % end for each. Implicitly display

Itu trik yang cerdas! Saya akan menguji program Anda terhadap beberapa peta untuk melihat apakah itu sesuai dengan yang saya harapkan.
user52676

3

C, 210 208 207 byte

Yang ini menggunakan printf dan scanf untuk membaca input, dan array yang dilinearisasi bukannya x, y; jadi saya merasa cukup berbeda dengan milibyte .

Golf:

 main(p){char*i,*j,m[80];for(p=73,i=m+p;p--;m[p]=63);for(p=8;scanf("%5s",i)>0;p+=*j=='n'?8:*j=='s'?-8:*j=='e'?1:-1)for(j=i;j-i<4;j++)if(*j^35)m[p+"qajh"[j-i]-'i']=*j;for(p=72;m[p]=0,p-=8;)printf("%s\n",m+p);}

Agak tidak terserang:

main(p){
    char*i,*j,m[80];
    for(p=73,i=m+p;p--;m[p]=63);                   // fill with ?
    for(p=8;scanf("%5s",i)>0;
            p+=*j=='n'?8:*j=='s'?-8:*j=='e'?1:-1)  // read 5-at-a-time
        for(j=i;j-i<4;j++)
            if(*j^35)m[p+"qajh"[j-i]-'i']=*j;      // update map positions
    for(p=72;m[p]=0,p-=8;)printf("%s\n",m+p);      // output line-by-line
}

Perwakilan:

  // board: (vertically reversed when printed)
    0  1  2  3  4  5  6  7
    8  9  10 ...
    16 18 19 ...
    ...
    56 57 58 59 60 61 62 63

  // offsets and offset order, or why "qajh": 
    s2      -8       a
  w4  e3  -1 0+1   h i j
    n1      +8       q   <- offset by +'i'

Juga, Anda mulai di posisi 8 karena ini mencukur sekitar satu atau lebih loop cetak.


2

Fortran, 263 251 247 235 234 216 byte

Versi 1D (mirip dengan yang dilakukan oleh Don Muesli):

#define R read(*,'(a)',advance='no',eor=1)c
#define F(x)R;if(c/='#')a(x+i)=c
program t
character::a(64)='?',c
integer::k(4)=[8,-8,1,-1],i=57
do
F(-8)
F(8)
F(1)
F(-1)
R
i=i+k(index('snew',c))
enddo
1 print'(8a)',a
end

Versi 2D:

#define R read(*,'(a)',advance='no',eor=1)c
#define F(x,y)R;if(c/='#')a(x+m,y+l)=c
#define G(x,y)j=index(x,c);if(j==2)j=-1;y=y+j
program t
character::a(8,8)='?',c
l=8;m=1
do
F(,-1)
F(,1)
F(1,)
F(-1,)
R
G('sn',l)
G('ew',m)
enddo
1 print'(8a)',a
end

Untuk mengaktifkan formulir dan pra-pemrosesan gratis, file memerlukan ekstensi .F90, mis explorer.F90. Masukan dibaca dari STDIN:

echo "~#~#e~#~~e~#~~e.#~~e^#~~n.~..n~^~.n~.~~n.~~.n.~~*n~.~.n#.~~w#.~~w#.~~s~*..s..*.s*~.~s.~~~s" | ./a.out 
?~~~~~??
?....~??
?.**.~??
?~..~~??
?~~~~~??
??~..~??
~~~.^.??
~~~~~~??

Jadi, apakah Fortran juga memiliki pengindeksan linear?
Luis Mendo

@ DonMuesli Tidak, tidak juga. Saya beroperasi pada array 1D secara langsung. Untuk mencetak array karakter saya menggunakan fakta bahwa array disimpan secara bersamaan dalam memori.
Alexander Vogt

2

C, 265 226 224 byte

a[8][8];x;y;i;main(c){for(;c=getchar(),c+1;y+=(c=='n')-(c=='s'),x+=(c=='e')-(c=='w'))for(i=5;--i;c=getchar())i&&c-35&&(a[x+(i==2)-(i==1)][y-(i==3)+(i==4)]=c);for(y=8;y--;putchar(10))for(x=0;x<8;)putchar((i=a[x++][y])?i:63);}

Peta ini 8x8, saya tidak menyadarinya sebelumnya. Dan di sini adalah solusi 265 byte yang berfungsi untuk peta dengan dimensi variabel:

a[99][99];c;x;X;y;i;k;p;main(Y){for(;c=getchar(),c+1;y+=(c=='n')-(c=='s'),x+=(c=='e')-(c=='w'))for(i=5;--i;c=getchar())i&&c-35&&(a[k=x+(i==2)-(i==1),X=X<k?k:X,k][p=y-(i==3)+(i==4),Y=Y<p?p:Y,p]=c);for(y=Y+1;y--;putchar(10))for(x=0;x<=X;)putchar((i=a[x++][y])?i:63);}

Bukankah a[8][8]seharusnya cukup?
Alexander Vogt

@Alexander Vogt - Oh, benar! Terima kasih, itu mengurangi dua byte lagi.
mIllIbyte

Saya sangat suka bagaimana Anda menghitung kenaikan / penurunan ke x dan y. Membandingkan kode C kami, static int a[8][8]memberi Anda inisialisasi peta gratis, dan penggunaan char m[64]memberi saya diskon besar untuk output peta. Hitungan sangat dekat, meskipun
tucuxi

Jika Anda membalikkan edan wdalam representasi peta Anda, maka Anda dapat menggunakan for(x=8;x--;)putchar((i=a[x][y])?i:63)untuk mencukur dua byte pada output.
tucuxi

Apakah c=getchar(),c+1tidak setara dengan getchar(),c++atau ada beberapa tipu daya yang terlibat?
Jonathan Frech

2

Ruby, 169 147 byte

Program lengkap. Mengambil dalam string input dari STDIN (Anda mungkin perlu memasukkannya dari file untuk mencegah baris baru yang tertinggal dari mengacaukan segalanya) dan mengeluarkan peta yang dihasilkan ke STDOUT.

Memotong satu ton dengan menempatkan semua string menjadi satu dan kemudian membaginya nanti.

m=??*64
d=0
x=56
gets.each_char{|c|d<4?(w=x+(d>2?-1:d>1?1:d<1?-8:d<2?8:0)
m[w]=c if c>?$):x+=c>?v?-1:c<?f?1:c>?q?8:-8
d+=1;d%=5}
puts m.scan /.{8}/

Tidak Disatukan:

m = ?? * 64                 # 64 "?" symbols
                            # y axis counts downwards; 0-7 is top row
d = 0                       # Keep track of which direction we're looking
x = 56                      # Position, bottom left corner (0,7)
gets.each_char do |c|       # For each character from first line of STDIN
    if d < 4                # Looking in a direction
        if    d > 2         # d == 3; looking west
            w = x - 1
        elsif d > 1         # d == 2; looking east
            w = x + 1
        elsif d < 1         # d == 0; looking north
            w = x - 8
        else                # d == 1; looking south
            w = x + 8
        end
        m[w] = c if c > ?$  # Only '#' gets rejected by this step
    else                    # Moving in a direction
        if    c > ?v        # c == 'w'
            x -= 1
        elsif c < ?f        # c == 'e'
            x += 1
        elsif c > ?q        # c == 's'
            x += 8
        else                # c == 'n'
            x -= 8
        end
    end
    d = (d + 1) % 5         # Look in the next direction
end
puts m.scan /.{8}/          # Split map into rows of 8

1

Lua, 354 byte ( coba online )

Golf:

n=(...)r={}y=8x=1q="?"for i=1,8 do r[i]={q,q,q,q,q,q,q,q}end for u in n:gsub("#",q):gmatch(".....")do a,b,c,d,e=u:match("(.)(.)(.)(.)(.)")if a~=q then r[y-1][x]=a end if b~=q then r[y+1][x]=b end if c~=q then r[y][x+1]=c end if d~=q then r[y][x-1]=d end y=y+(("n s"):find(e)or 2)-2x=x+(("w e"):find(e)or 2)-2 end for i=1,8 do print(table.concat(r[i]))end

Sedikit tidak berbulu:

n = "~#~#e~#~~e~#~~e.#~~e^#~~n.~..n~^~.n~.~~n.~~.n.~~*n~.~.n#.~~w#.~~w#.~~s~*..s..*.s*~.~s.~~~s"

r={} y=8 x=1 q="?"
for i=1,8 do r[i]={q,q,q,q,q,q,q,q} end
for u in n:gsub("#",q):gmatch(".....") do
  a,b,c,d,e=u:match("(.)(.)(.)(.)(.)")
  if a~=q then r[y-1][x]=a end
  if b~=q then r[y+1][x]=b end
  if c~=q then r[y][x+1]=c end
  if d~=q then r[y][x-1]=d end
  y=y+(("n s"):find(e)or 2)-2
  x=x+(("w e"):find(e)or 2)-2
end
for i=1,8 do print(table.concat(r[i])) end

Tidak x=x+(("w e"):find(e)or 2)-2 endbisa x=x-2+(("w e"):find(e)or 2)end?
Jonathan Frech

1

Kotlin, 242 byte

{val m=Array(8){Array(8){'?'}}
var d=7
var i=0
for(c in it)(mapOf('n' to{d--},'s' to{d++},'w' to{d-=8},'e' to{d+=8},'#' to{i++})[c]?:{m[d%8+listOf(-1,1,0,0)[i%4]][d/8+listOf(0,0,1,-1)[i%4]]=c
i++})()
m.forEach{for(c in it)print(c);println()}}

Baris baru dapat diganti dengan titik koma jika diinginkan.

Coba Di Sini

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.