Putri saya mendapat tugas berikut untuk mengerjakan PR matematika. Bayangkan enam teman yang hidup dalam sebuah garis, bernama E, F, G, H, J, dan K. Posisi mereka di garis adalah seperti yang ditunjukkan (bukan untuk skala) di bawah:
Jadi, F hidup lima unit dari E, dan dua unit dari G, dan sebagainya.
Tugas Anda: buat program yang mengidentifikasi jalur yang mengunjungi setiap teman tepat sekali dengan total panjang n unit, dengan mengambil lokasi teman dan n sebagai input. Seharusnya melaporkan jalan jika menemukannya (misalnya, untuk panjang 17 itu mungkin melaporkan "E, F, G, H, J, K", dan itu harus keluar dengan anggun jika tidak ada solusi. Untuk apa nilainya, saya menyelesaikan sebuah solusi yang tidak dikenali di Mathematica dalam 271 bytes. Saya kira itu mungkin jauh lebih singkat dari itu.
sumber
[0, 5, 7, 13, 16, 17]
Dan62
) sehingga Anda dapat memastikan itu tidak secara khusus dikode untuk kasus ini."[0, 5, 7, 13, 16, 17], 62"
dan output"(7, 16, 0, 17, 5, 13)"
ok?Jawaban:
J, 54 byte
Menghasilkan satu rute yang benar. Jika tidak ada rute itu tidak menghasilkan apa-apa.
Kode 52-byte yang menampilkan semua rute (satu per baris):
Kode 38-byte yang menampilkan posisi alih-alih huruf:
sumber
Mathematica, 55 atau 90 byte
Mathematica, katamu? ;)
Ini adalah fungsi anonim yang pertama mengambil posisi teman-teman (dalam urutan apa pun), dan kemudian panjang target. Itu kembali
Missing[NotFound]
, jika tidak ada jalan seperti itu.Saya dapat menyimpan empat byte jika mengembalikan semua jalur yang valid diizinkan (
FirstCase
->Cases
).Mengembalikan serangkaian string sedikit lebih rumit:
sumber
Z
akan melanjutkan dengan karakter ASCII berikutnya (bukan berarti Anda ingin menjalankan kode saya untuk n> 20 pula: D).Python 2,
154148 byte(atau 118 byte untuk solusi umum)
Program ini menerima baris dengan daftar dan bilangan bulat seperti '[0, 5, 7, 13, 16, 17], n' pada stdin dan mencetak jalur pada output dengan panjang n atau tidak sama sekali jika tidak mungkin.
Sangat sulit untuk menulis program kecil dengan Python yang membutuhkan permutasi. Impor dan penggunaan itu sangat mahal.
Sumber untuk persyaratan OP sebelum minifier:
Solusi umum (tidak diperkecil):
Karena algoritma sederhana dan sejumlah besar kombinasi, eksekusi untuk lebih dari 20 posisi awal akan sangat lambat.
sumber
from itertools import*
. Juga, Python 3 mungkin lebih pendek denganinput()
dan*a,c=map(...)
jika itu dapat bekerja dengan sisa program Anda.chr(a.index(n)+69)
?J (48 atau 65)
Saya berhipotesis bahwa ini bisa menjadi golf lebih banyak. Jangan ragu untuk menggunakan ini sebagai titik awal untuk bermain golf lebih jauh
Atau dengan surat:
Apa fungsinya:
(Saya harap format I / O ini baik-baik saja ...)
Bagaimana cara kerjanya:
Menghasilkan semua permutasi dari input
Hitung jaraknya
Melihat hasil yang sama dengan input, dan menghasilkan kembali permutasi tersebut (saya menduga beberapa karakter dapat dicukur di sini)
Dengan surat:
Buat daftar n huruf pertama, di mana n adalah panjang daftar input
melakukan hal yang sama seperti di atas
sumber
Oktaf, 73
Benar-benar tidak ada larangan bermain golf, jadi izinkan saya mencoba menjelaskan ... dari dalam ke luar, kami mengubah semua jarak, lalu untuk setiap permutasi, kami mengambil perbedaan antara rumah, mengambil nilai absolut sebagai jarak, menambahkannya Facebook, temukan indeks permutasi pertama dengan jarak yang diinginkan, dan permutasi huruf dan temukan permutasi huruf tertentu.
yaitu 13-0-16-5-17-7 => 13 + 16 + 11 + 12 + 10 = 62.
(kosong untuk input yang tidak mungkin)
sumber
perms()
dalam Oktaf 3.6.2 di ideone.com mengalami masalah dengan vektor string.Matlab (86)
Contoh di mana ada solusi:
Contoh di mana solusi tidak ada:
Matlab (62)
Jika format output dapat dilonggarkan dengan menghasilkan posisi alih-alih huruf, dan menghasilkan matriks kosong jika tidak ada solusi:
Contoh di mana ada solusi:
Contoh di mana solusi tidak ada:
Matlab (54)
Jika dapat diterima, program akan menyediakan semua jalur yang valid :
Contoh di mana ada solusi:
sumber
Haskell, 109 byte
Contoh penggunaan:
17 # [0, 5, 7, 13, 16, 17]
yang menampilkan semua jalur yang valid, yaitu["EFGHIJ","JIHGFE"]
. Jika tidak ada jalur yang valid, daftar kosong[]
dikembalikan.Daftar surat termasuk
I
(harapan itu baik-baik saja).Cara kerjanya: buat daftar
(name, position)
pasangan, permutasi, dan ambil pasangan yang panjang jalurnya saman
dan hapus bagian posisi.sumber