String biasa terlihat seperti ini:
Hello,IAmAStringSnake!
Dan ular tali terlihat seperti ini:
Hel
l rin
o,IAmASt g
S
!ekan
Tugas Anda
String snake berbahaya, jadi Anda harus membuat program yang mengambil string snake sebagai input dan output sebagai string biasa.
Spesifikasi
- Input dapat berupa string multiline atau array string.
- Setiap baris input akan diisi dengan spasi untuk membentuk kisi persegi panjang.
- Karakter dalam ular hanya dapat terhubung ke karakter yang berdekatan di atas, di bawah, kiri atau kanan dari mereka (seperti dalam game Snake). Mereka tidak bisa pergi diagonal.
- Karakter ular tidak akan pernah berbatasan dengan bagian lain dari ular, hanya karakter yang terhubung.
- Karakter pertama dari string adalah karakter akhir dengan jarak Manhattan terpendek dari sudut kiri atas kotak input (yaitu jumlah minimum gerakan yang diperlukan ular untuk langsung dari karakter akhir ke kiri atas sudut). Kedua ujungnya tidak akan pernah memiliki jarak yang sama.
- String dapat berisi karakter ASCII antara titik kode 33 dan 126 inklusif (tanpa spasi atau baris baru).
- Panjang string akan antara 2 dan 100 karakter.
- Kode terpendek dalam byte menang.
Uji Kasus
(Input grid, diikuti oleh string output)
Hel
l rin
o,IAmASt g
S
!ekan
Hello,IAmAStringSnake!
----------
Python
Python
----------
P ngPu Code
r i z d G
o m z n o
gram lesA lf
ProgrammingPuzzlesAndCodeGolf
----------
~ zyx tsr XWVUTSR
}|{ wvu q Y Q
! p Z `ab P
"#$ 6789:; o [ _ c O
% 5 < n \]^ d N
('& 432 = m e M
) 1 > lkjihgf L
*+,-./0 ? K
@ABCDEFGHIJ
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
----------
tSyrep
r p
in Sli
g Sile
Snakes n
Ser ylt
a eh ilS
fe w t
emo h
Sre
SlipperyStringSnakesSilentlySlitherSomewhereSafe
Jawaban:
APL, 55 byte
Fungsi ini mengambil matriks karakter dengan string snake di dalamnya.
Contoh:
Penjelasan:
(,⍵≠' ')/,⍳⍴⍵
: dapatkan koordinat semua non-spasi(⊂0 0)
: begin at (0,0) (yang merupakan koordinat tidak valid){
...}
: ikuti ular, berikan posisi dan ular:1<⍴⍵:
: jika ada lebih dari 1 elemen yang tersisa:∆←⍵~⍺
: hapus posisi saat ini dari ular dan simpan di∆
.+/¨|⍺-∆
: temukan jarak antara posisi saat ini dan setiap titik di sisa ular∆[⊃⍋...
] `: dapatkan titik terdekat dari ular∇
: jalankan fungsi lagi, dengan titik terdekat sebagai titik saat ini dan ular yang disingkat sebagai ular baru.⍺,
: tambahkan posisi saat ini ke hasil itu⋄⍺
: jika tidak, kembalikan saja posisi saat ini1↓
: jatuhkan item pertama dari hasil (yang merupakan (0,0) posisi)⍵[
...]
: dapatkan elemen-elemen itu dari ⍵, dalam urutan itusumber
JavaScript (ES6) + SnakeEx , 176 byte
Ingat SnakeEx? Bagus, karena saya juga tidak! Saran golf diterima.
sumber
MATL , 80 byte
Terima kasih kepada @LevelRiverSt untuk koreksi
Input adalah sebagai array 2D char, dengan baris dipisahkan oleh
;
. Kasing uji dalam format ini adalahCobalah online!
Penjelasan
Koordinat setiap karakter nonspace diwakili oleh bilangan kompleks. Untuk setiap karakter saat ini, yang berikutnya diperoleh sebagai yang terdekat (perbedaan absolut minimum dari koordinat kompleksnya).
Untuk menentukan karakter awal, dua titik akhir perlu ditemukan. Ini dilakukan sebagai berikut. Endpoint adalah char nonspace yang memiliki tepat satu tetangga nonspace. Jumlah tetangga diperoleh dengan konvolusi 2D dengan masker yang sesuai. Titik awal adalah titik akhir yang koordinat kompleksnya memiliki jumlah paling sedikit dari bagian nyata dan imajiner; yaitu paling dekat di jarak Manhattan ke bilangan kompleks 0, atau ekuivalen dengan 1 + 1j, yang merupakan koordinat kompleks sudut kiri atas.
sumber
The initial point is the endpoint whose complex coordinate has the least absolute value
Hati-hati: Jarak Euclidean! = Jarak Manhattan. misalnya titik 7 + 7j memiliki jarak Euclidean 9.8994 dan jarak Manhattan 14. 10j lebih jauh dengan jarak Euclidean tetapi jauh lebih dekat dengan jarak Manhattan. Selain itu, konsep hebat!C
198190179180181 byteSunting: Menggunakan tip oleh user81655 dan menghapus tanda kurung di operator ternary, terima kasih! Saya juga mengubah tes rumit (S & 1) untuk pemerataan untuk yang lebih tepat (dan lebih pendek!) S% 2.
Sunting2: Menggunakan * gaya pengalamatan berat, membuat saya buta terhadap optimalisasi yang jelas dalam definisi S, yaitu, mengganti * (a + m) dengan [m] dll. Saya kemudian mengganti S sendiri dengan T, yang pada dasarnya tidak setengah dari apa yang S lakukan. Kode juga sekarang mengambil keuntungan dari nilai balik dari putchar.
Sunting3: Memperbaiki bug yang telah ada sejak awal, kriteria berhenti pencarian Manhattan a <b + m hanya benar jika a telah dikurangi. Ini menambahkan 2 byte, tetapi kita mendapatkan kembali dengan membuat definisi m global.
Sunting4: Golf saya telah melewati batas minimum dan salah jalan sekarang. Perbaikan bug lain yang terkait dengan pencarian Manhattan. Saya awalnya memiliki in-bound check pada tempatnya dan tanpa itu pencarian berlanjut untuk array input besar (sekitar 50x50) di luar array b. Oleh karena itu array harus diperluas setidaknya dua kali ukuran sebelumnya, yang menambahkan satu byte lagi.
Tidak digabungkan dan dijelaskan:
sumber
a[1]
,a[-m]
dll, dan buatm
global -m=103;main()
.C, 272 byte
Lihatlah sumber @ Zunga. Sekarang lihat milikku. Ingin tahu bagaimana saya mendapat tambahan 91-byte?
Tidak Disatukan:
sumber
Python (2 dan 3),
640 624 604 583 575 561 546538 byteSaya masih golf n00b jadi ini agak besar.
Sunting: Terima kasih kepada @porglezomp untuk sarannya! Saya tidak menghapus semua operator 'dan' karena itu akan merusak Python 3.
Sunting2: Terima kasih kepada @Aleksi Torhamo untuk komentar tentang isspace (). Pengurangan yang dihasilkan mengkompensasi perbaikan bug yang saya masukkan. Juga terima kasih kepada anonim untuk penyorotan sintaks!
Sunting3: Terima kasih kepada @ mbomb007 untuk beberapa byte tambahan.
Dan ini versi pra-golf saya
sumber
S=lambda s:s.isspace()
dan kemudian melakukanS(s)
alih - alihs.isspace()
.and
untuk<
, karenaf() < g() < h()
samag = g(); f() < g and g < h()
dalam hal efek samping (rantai perbandingan hubungan pendek), dan Anda mengabaikan hasil dari perbandingan pula.m[(x,y)]=
sama dengan yang lebih pendekm[x,y]=
S=str.isspace
S
dan bukannya menggunakan<'!'
dalam setiap kejadian bisa sama panjangnya, mungkin membuka peluang untuk menghemat lebih banyak. Mengubahif 1-S(v[x]):
keif(v[x]<'!')<1:
, misalnya. Dan mungkin Anda bisa menghapus beberapa tanda kurung di perbandingan nanti dengan melakukannya dengan cara itu.JavaScript (ES6), 195
Lihat penjelasan di dalam cuplikan tes
Uji
sumber
););}
dibutuhkan?for
header di mana 2 titik dua diperlukan. Yang kedua adalah delimeter untukfor
tubuhLua,
562535529513507504466458 BytesSejauh ini golf terbesar
saya,saya pikir saya masih bisa memotong 100 byte, yang akan saya upayakan, tetapi mempostingnya sebagai jawaban karena sudah memakan waktu :).Saya benar, saya telah mengurangi lebih dari 100 byte! Saya tidak berpikir ada banyak ruang untuk perbaikan.fungsi ini harus dipanggil dengan array 2D yang mengandung satu karakter per sel.
Disimpan 40 byte saat bekerja dengan @ KennyLau , terima kasih padanya!
Woo hoo! Di bawah 500!
Tidak disatukan
Penjelasan akan datang setelah saya selesai bermain golf ini, untuk saat ini, saya akan meminjamkan Anda versi yang dapat dibaca dari kode sumber ini: DInilah penjelasannya!Sunting: tidak diperbarui dengan modifikasi terbaru, masih bermain golf sebelum memperbarui. Sama halnya dengan penjelasan
Jadi, inilah beberapa penjelasan terperinci tentang cara kerja program ini.
Pertama-tama, mari kita perhatikan loop berlabel
a
, ini memungkinkan kita untuk menemukan ujung terdekat ke sudut kiri atas. Ini akan berulang selamanya jika tidak ada akhirnya, tapi itu tidak masalah: D.Pada kotak 4x4, di sini adalah jarak ular (kiri), dan urutan mereka melihat (kanan)
Untuk setiap karakter ini, untuk menjadi yang terakhir, ia harus memeriksa dua kondisi: - Tidak menjadi ruang - Dikelilingi oleh tepat 3 ruang (atau tepat 1 non-ruang)
Kondisi-kondisi ini diperiksa bagian kode berikut
Memeriksa apakah char bukan spasi dicapai oleh ekspresi
m[i][j]~=s
.Memeriksa apakah kita hanya dikelilingi oleh 1 non-ruang dicapai dengan xor-ing kondisi di atas untuk sekitar kita, ini dapat ditulis sebagai
Dan akhirnya, jika semua hal di atas dievaluasi dengan benar, ternary akan mengembalikan apa yang ada di terakhir
and
->m[i][j]
. Lain, kita biarkanr
tidak disetel :)Sekarang kita memiliki kepala ular, mari kita lanjutkan ke ujung yang lain! Iterasi ular terutama dicapai oleh terner bersarang berikut:
Kami mengatur ulang
i
danj
pada saat yang sama untuk menghindari kebutuhan boneka untuk menyimpan nilai-nilai lama. Mereka berdua memiliki struktur yang sama persis, dan menggunakan kondisi sederhana, jadi saya akan menyajikannya dalam bentuk bersarangif
, sehingga Anda dapat membacanya lebih mudah. :)Dapat diterjemahkan ke:
Menguji!
Berikut kode yang saya gunakan untuk menjalankan ini, Anda dapat mengujinya secara online dengan menyalin-menempelnya.
sumber
Lua, 267 byte
Diperlukan Lua 5.3.
Pemakaian:
sumber
Python 3,
245243241236 bytes
adalah string input,n
apakah output dicetak ke stdout:Sunting: Terima kasih kepada @Cees Timmerman karena telah menghemat 5 byte!
sumber
c>' 'and
danprint n
dengan Python 2.if
bukanelif
?s
adalah string multiline; karakter terakhir dari string harus berupa baris baru (ini diperlukan untuk melewatiPython
test case)Python, 537
Solusi awal saya:
Dipadatkan sedikit, tetapi dibiarkan sebagai metode:
sumber
Java 7,
927924923 byteOk, butuh beberapa saat .. Dalam beberapa bahasa pemrograman tidak masalah jika array x dan y Anda berada di luar batas-batas 2D-array, tetapi dengan Java itu akan melempar
ArrayIndexOutOfBoundsExceptions
, jadi semuanya harus diperiksa ..Saya pertama-tama menentukan titik awal, dan kemudian menggunakan metode rekursif untuk membangun string dari sana. Selain itu, saya menggunakan daftar untuk melacak koordinasi yang telah saya temui, sehingga tidak akan masuk ke lingkaran bolak-balik-balik (menghasilkan StackOverflowException).
Ini mungkin jawaban terpanjang yang telah saya posting sejauh ini, tetapi meskipun beberapa bagian dapat di-golf, saya tidak berpikir tantangan ini bisa menjadi jauh lebih pendek di Jawa. Java saja tidak cocok untuk mengikuti jalur dalam kisi-kisi .. Itu adalah tantangan yang menyenangkan untuk mencari tahu. :)
Kasus yang tidak disatukan & uji:
Coba di sini.
Keluaran:
sumber
PHP,
199184182 bytemungkin masih memiliki potensi golf kecil
mengambil input sebagai string multiline dari baris perintah, mengharapkan linebreak gaya linux.
Jalankan
php -r '<code>' '<string>'
; melarikan diri linebreaks.kerusakan
sumber
C #, 310
(Edit: perbaikan bug)
Fungsi dengan parameter string multiline, mengembalikan string.
Termasuk yang diminta
using
dalam hitungan byte.Ini adalah porting jawaban javascript saya.
Uji ideone
Dengan spasi
sumber
Python 2, 251 byte
Atau, jika Anda ingin memimpin baris baru di testcases Anda, 257 byte:
Lewati semua testcases.
Hasil dalam:
sumber
b.append(...)
denganb+=[...]
dandef n(x,y):return ...
dengann=lambda x,y:...
' '
.~-x
alih-alih menggunakanx-1
, Anda tidak harus menggunakan tanda kurung.Japt
-P
, 106 byteCobalah online!
Ini ... um ... kekejian.
Dibongkar & Cara kerjanya
Satu poin penting adalah bahwa saya menggunakan prioritas operator antara penugasan dan operator koma di JS, untuk mengemas beberapa baris dan menjaga agar pintasan
@
(XYZ{
) tetap dapat digunakan.sumber