pengantar
"Yarr !! Kami punya seorang laddie yang menyebut dirinya seorang" programmer "membuat peta untuk 'harta karun kami! Tapi' ini ditulis dengan 'angka-angka aneh' n huruf!" E5, N2, E3 "... apa bahkan maksudnya? Kegilaan! Bahkan tidak bisa menulis peta harta karun yang tepat, tidak berguna, perbaiki itu untuk kita! Kami akan menghadiahkan bagimu bagian dari harta karun! "
Deskripsi Tantangan
Sekelompok perompak mengalami kesulitan membaca peta harta karun. Bisakah Anda menulis program untuk mengubahnya menjadi lebih ... bentuk bajak laut?
Sebagai masukan, Anda akan menerima peta harta karun asli. Ini adalah daftar string yang dipisahkan koma, setiap string yang terdiri dari bagian huruf (yang memberi tahu bajak laut ke arah mana mereka harus berjalan), dan sebagian nomor (yang memberi tahu bajak laut berapa banyak langkah yang harus diambil ke arah itu). Misalnya, peta harta karun berikut:
E2,N4,E5,S2,W1,S3
berarti, "berjalan dua langkah ke timur, berjalan empat langkah ke utara, berjalan lima langkah ke timur, berjalan dua langkah ke selatan, berjalan satu langkah ke barat, lalu berjalan tiga langkah ke selatan."
Sebagai output, Anda akan keluaran peta dalam bentuk grafik, menggunakan karakter >
, ^
, v
, dan <
sebagai pointer. Inilah output untuk input di atas:
>>>>>v
^ v
^ v<
^ v
>>^ X
Perhatikan bahwa kami telah mengganti langkah terakhir ke selatan sebagai X
gantinya. Ini karena langkah terakhir adalah di mana harta karun itu, dan seperti yang kita semua tahu, bajak laut harus memiliki tanda X di peta harta karun mereka, kalau tidak mereka tidak akan tahu cara membacanya.
Ngomong-ngomong, peta tidak akan pernah menyeberang sendiri, jadi Anda tidak perlu khawatir berurusan dengan tumpang tindih. Juga, Anda diizinkan untuk memiliki garis baru di akhir output.
Input dan Output Sampel
S5,W2
v
v
v
v
v
X<
N1,E1,S1,E1,N1,E1,S2
>v>v
^>^X
N1
X
N6,E6,S6,W5,N5,E4,S4,W3,N3,E2,S2,W1,N2
>>>>>>v
^>>>>vv
^^>>vvv
^^^Xvvv
^^^^<vv
^^^<<<v
^^<<<<<
E21,S2
>>>>>>>>>>>>>>>>>>>>>v
X
N12,E11,S12,W2,N4
>>>>>>>>>>>v
^ v
^ v
^ v
^ v
^ v
^ v
^ v
^ v
^ X v
^ ^ v
^ ^ v
^ ^<<
X
harus menandai langkah setelah langkah terakhir, seperti semua gerakan lainnya dihitung. Bayangkan langkah terakhir adalah N3: Anda berjalan tiga langkah ke utara dan menggali, tetapi tidak ada di sini, Anda harus berjalan 2 langkah sebagai gantinya. Saya tidak keberatan jika Anda mematuhi aturan yang ada, karena menambahkan sedikit kasus sudut untuk menangani. Tapi ingat apa yang terjadi pada anak itu.Jawaban:
Rubi,
213 209 198 186178Masukan input melalui stdin.
Ini menggunakan
y -> x -> char
kamus untuk membuat peta, di mana keduanyax
dany
bisa negatif. Setelah input diuraikan, minimum global koordinat x diekstraksi. Untuk setiap baris, itu kemudian beralih pada rentang dari global minimum ke indeks maksimum untuk baris saat ini, dan mencetak karakter yang benar untuk indeks itu.Untuk tetap dengan tema, ekspresi untuk mengubah
NESW
ke dalam indeks yang tepat yang tanpa malu-malu bajakan dari Sp3000 's jawaban .Versi asli yang menggunakan
[x,y] -> char
kamus:sumber
Python 2,
249248244239237 byteMasukan seperti
"E2,N4,E5,S2,W1,S3"
.NSEW
dipetakan[1, 3, 2, 0]
olehd=ord(c)%10%7
. Apakah akan berubahy
ataux
diputuskan olehd%2
, dan apakah kenaikan atau penurunan diputuskan olehd-2|1
. Ekspresi pertama dan ketiga ditemukan oleh brute force.Selain itu, ini adalah penggunaan sederhana kamus bersarang formulir
{y: {x: char}}
.(Terima kasih kepada @joriki untuk bantuan pemetaan)
sumber
(d + 1 & 2) - 1
1|d%-3
(yang merupakan negasi, tapi saya baru sadar itu juga oke)!Javascript (ES6), 260
Ini yang menarik ...
Terima kasih @ETHproductions, @ edc65, dan @vihan atas bantuannya!
Ini mendefinisikan fungsi anonim, jadi menyebutnya menambahkan
f=
ke awal untuk memberinya nama.Untuk menguji:
console.log(f("E2,N4,E5,S2,W1,S3"))
Penjelasan:
sumber
i++
darifor
loop ke tempat terakhir yang digunakan, dalam hal inic=i++>r-2?"X":c
.v[0].repeat(+v.slice(1))
di tempatArray(v.slice(1)- -1).join(v[0])
, dan" ".repeat(j-p-1)
di tempatArray(j-p).join(" ")
, menghemat 11 byte secara keseluruhan. Saya pikir Anda juga bisa menempatkannyaF='forEach'
di awal fungsi, kemudian mengubah masing-masing.forEach
dari sana ke[F]
, menyimpan 4. lainnyaif
s, mungkin membantu jika Anda mengurangi variabel pada saat yang sama jugaq=x=y=2e3
berarti output akan salah jika saya lakukan, katakanlahW9999
,?PHP,
431417 byteMasukkan ke dalam file (
treasure.php
), hapus lekukan, gabungkan baris (dibungkus di sini agar mudah dibaca), letakkan<?php
penanda di awal file (tidak ditampilkan di sini karena secara teknis bukan bagian dari program).Contoh eksekusi:
Opsi
-d error_reporting=0
diperlukan untuk menekan pemberitahuan tentang nilai yang tidak ditemukan pada indeks yang ditentukan di$z
.Memperbarui:
Ketika saya sedang mempersiapkan versi kode untuk posting yang tidak diklik, saya menemukan kode itu berisi dua tugas yang tidak dibutuhkan (12 byte) dan spasi putih yang dapat dihapus (
as$i
); juga, dengan menggantiwhile
denganfor
loop dan memeras tugas ke dalamnya (tidak mungkin menggunakanwhile
loop) saya menyimpan byte lain.sumber
$count --;
.$argn
save 3 Byteschop
save 1 Byte"X"
->X
use constants save more bytes$argn
petunjuk. Saya menyadari"X"->X
triknya tetapi saya mungkin lupa tentangnya ketika saya menulis solusi ini. Saya menulis kode PHP sejak tahun 2002 tetapi sampai hari ini saya tidak melihat bahwa PHP menyediakanchop()
fungsinya. Terima kasih atas petunjuk ini.Perl,
702613546474439338260 byteTerima kasih kepada Dom Hastings atas bantuannya dan versi supernya.
Kode menggunakan array 2D.
Versi oleh Dom Hastings:
Versi golf saya yang lebih kecil sebesar 338 byte (untuk referensi):
Uji
sumber
use strict;
, Anda tidak perlu semuamy
, yang akan menghemat setidaknya beberapa byte. Juga==
lebih pendek daripadaeq
karena yang terakhir membutuhkan ruang.$m
sekali, jadi daripada menyimpan argumen baris perintah sebagai variabel, Anda dapat memanggilnya langsungsplit
, yaitu@m=split(',',$ARGV[0])
.$d
dan$s
dapat diambil menggunakan regex untuk menyelamatkan Anda beberapa byte($d,$s)=/^(.)(.+)$/
, dan semuaforeach
bisafor
(karena mereka sama. Anda mungkin juga dapat menyimpan beberapa karakter menggantikan beberapa ini denganmap{
...}@x
karena Anda dapat mengabaikan parens sekitar item iterated (ini bekerja dengan baik jika Anda harus mengandung loop lain). Jika Anda menggunakan$ARGV[0]
Anda dapat menggantinya dengan pop, tetapi jika Anda menggunakan skrip seperti yangperl script.pl <<< "text"
Anda dapat gunakan<>
sebagai gantinya!pop
untuk menyimpan pasangan. Alih-alihuse Swtich
danswitch
/case
pernyataan, Anda bisa melakukan pemeriksaan individual yang mungkin menghemat byte. Sesuatu seperti$y-="N"eq$d
akan bekerja juga (karena benar1
dan salah''
). Seringkali, Anda dapat menggunakan kata-kata sebagai bareword, sehingga$y-=N eq$d
akan berhasil! Ada beberapa variabel ajaib yang dapat digunakan untuk menyimpan byte,$/
adalah'\n'
dan$"
adalah' '
, tapi kadang-kadang harfiah baris kekuatan membantu menyelamatkan char juga. Trik lain (kotor!) Adalah banyak tugas untuk menyimpan beberapa lagi, seperti yang$a=0;$b=0;
bisa dilakukan$a=$b=0
.substr($_,0,1)
juga halnyasubstr$_,0,1
. Postfix untuk loop dan jika cek juga dapat berguna seperti padafor(@c){...}
vs....for@c
tetapi Anda tidak dapat menggunakan;
dalam kode, Anda harus koma terpisah (yang tidak selalu berfungsi ketika Anda memanggil fungsi). Ada begitu banyak tips hebat juga di codegolf.stackexchange.com/questions/5105/… . Semoga berhasil!Python 2, 394 byte
Jalankan program lalu tempel ke input standar seperti misalnya
"E2,N4,E5,S2,W1,S3"
Ini tidak terlalu optimal. Pertama itu berjalan melalui input untuk merekam path. Kemudian melakukan beberapa matematika untuk menentukan posisi awal yang tepat dan ukuran
o
. Kemudian ia menjalankan kembali dan menetapkan entri yang sesuaio
sebagai salah satu dari>v<^X
. Kecerdasan utama dalam menggunakan kembali fungsi yang sama untuk kedua traversal ini.sumber
XQuery 3.0, 498
XQuery bahkan tidak sedikit kompetitif, jadi ini menyenangkan.
Tidak disatukan
sumber
PHP, 496
514528Saya mencoba peruntungan di PHP, hasilnya agak lama, saya masih ingin mempostingnya, hanya untuk bersenang-senang.
Tidak disatukan
sumber
for(;$i++<$f;)
, mencoba menghapus tanda kurung yang tidak perlu, menggunakan konstanta yang tidak terdefinisi (N
) alih-alih string ('N'
), ...if
s, coba gunakan operator trenary atau ands logis. Juga, ini akan membantu jika Anda menggunakan PHP4.1 dan menggunakan array GET dengan poin.JavaScript (ES6), 244
249 274Spasi utama dan baris baru ditambahkan untuk kejelasan dan tidak dihitung, kecuali baris baru di dekat akhir panggilan gabungan, yang signifikan dan dihitung.
Tes menjalankan cuplikan (hanya ECMAScript 6, Firefox dan Safari 9 saja)
sumber
C, 557
Versi tidak disatukan:
Alokasi memori dinamis tidak jauh lebih sulit, tetapi malloc adalah pengidentifikasi yang terlalu panjang untuk digunakan dalam kode golf. Saya merasa seperti harus ada semacam header PCG.h yang secara otomatis disertakan untuk bermain golf di c, hanya untuk menyingkat beberapa pengidentifikasi.
sumber
Groovy, 359
sumber
Gangguan Umum - 603
Implementasi bebas array: mencetak dari atas ke bawah, dari kiri ke kanan.
Mengurai dan memperluas arah menjadi jejak
(x y char)
elemen:Input "N3" yang sederhana menghasilkan
((0 0 #\^) (0 -1 #\^) (0 -2 #\X))
x
dany
y
pertama dan kemudian olehx
Iterasi daftar yang diurutkan saat memindahkan kursor
x - minx
,y - miny
, mencetak karakter yang dikehendakiContohnya
Hasil:
sumber
CoffeeScript,
303285 byteTampilkan cuplikan kode
sumber