Diberikan string input yang hanya terdiri dari huruf-huruf, kembalikan ukuran langkah yang menghasilkan jumlah langkah minimum yang diperlukan untuk mengunjungi semua huruf dalam urutan di atas alfabet pembungkus, mulai dari huruf apa pun.
Misalnya, ambil kata dog
,. Jika kita menggunakan ukuran langkah 1, kita berakhir dengan:
defghijklmnopqrstuvwxyzabcdefg Alphabet
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
defghijklmnopqrstuvwxyzabcdefg Visited letters
d o g Needed letters
Untuk total 30 langkah.
Namun, jika kita menggunakan ukuran langkah 11, kita mendapatkan:
defghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefg
^ ^ ^ ^ ^ ^
d o z k v g Visited letters
d o g Needed letters
Untuk total 6 langkah. Ini adalah jumlah minimum langkah, jadi hasil pengembalian dog
adalah ukuran langkah; 11
.
Kasus uji:
"dog" -> 11
"age" -> 6
"apple" -> 19
"alphabet" -> 9
"aaaaaaa" -> 0 for 0 indexed, 26 for 1 indexed
"abcdefga" -> 1 or 9
"aba" -> Any odd number except for 13
"ppcg" -> 15
"codegolf" -> 15
"testcase" -> 9
"z" -> Any number
"joking" -> 19
Aturan
- Input akan berupa string atau array karakter yang tidak kosong yang hanya terdiri dari huruf-huruf
a
untukz
(Anda dapat memilih antara huruf besar atau kecil) - Output dapat diindeks 0 (yaitu kisaran
0-25
) atau 1 diindeks (1-26
) - Jika ada dasi, Anda dapat menampilkan ukuran langkah apa pun atau semuanya
- Ini adalah kode-golf , sehingga jumlah byte terendah untuk setiap bahasa menang!
Jawaban:
Arang , 41 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Diindeks 0. Penjelasan:
Ulangi ukuran 26 langkah. (Sebenarnya saya mengulang alfabet huruf kecil di sini dan menggunakan variabel indeks.)
Ulangi setiap karakter input setelah yang pertama.
Ulangi 26 kali dan hasilkan string karakter yang dihasilkan dengan mengambil 26 langkah pada ukuran langkah awal yang diberikan (0-diindeks) dengan karakter input sebelumnya.
Temukan posisi karakter saat ini dari input dalam string itu, atau -1 jika tidak ditemukan.
Ambil jumlah semua posisi, kecuali ada yang tidak ditemukan, dalam hal ini gunakan -1.
Simpan jumlahnya.
Temukan jumlah minimum non-negatif.
Temukan ukuran langkah pertama dengan jumlah itu dan outputkan.
sumber
JavaScript, 143 byte
Cobalah online!
Terima kasih kepada Shaggy, menggunakan
[...Array(26).keys()]
menghemat 9 byte.sumber
Jelly ,
282623 byteOutput diindeks 0. Input adalah bytestring dan dapat dalam hal apapun, tetapi huruf besar jauh lebih cepat.
Masukan satu huruf harus dibuat khusus dan biayanya 2 byte. ._.
Cobalah online!
Perhatikan bahwa ini adalah pendekatan brute-force; input dengan empat atau lebih huruf akan habis pada TIO. Rangkaian uji coba
_39
untuk "efisiensi".Bagaimana itu bekerja
sumber
Jelly , 17 byte
Input adalah bytestring pada STDIN, output 1-diindeks.
Cobalah online!
Bagaimana itu bekerja
sumber
JavaScript (Node.js) ,
123 121 116114 byteCobalah online!
Berkomentar
s[k++ >> 5]
sumber
Ruby ,
12111411210810289 byteCobalah online!
Diindeks 0. Mengambil input sebagai array karakter.
Berkat ASCII-only untuk ide-ide golf yang bernilai 12 byte.
sumber
p,=*s
trik, tapi saya tidak begitu yakin tentang kekuatan teoritis dari solusi dengan skor penalti hardcoded ... Jadi, saya mengubah konstanta ke infinity (walaupun nilai Anda akan memungkinkan untuk 2 byte lagi off) ).Python 2 ,
230222216194169 byteCobalah online!
-22 byte dari tsh
-39 byte dari Jo King
Versi lebih lama dengan penjelasan:
Cobalah online!
Ini akan lebih pendek dalam bahasa dengan jumlah huruf utama (tidak perluKiriman ini sekarang digunakanfloat('inf')
penanganan loop tak terbatas). Sebenarnya, pengajuan ini masih perlu untuk menangani string seperti "aaa".26*len(s)
sebagai batas atas, yang menghentikan loop tak terbatas.Kiriman ini diindeks 0 (mengembalikan nilai dari 0 hingga 25 inklusif).
f
mengambil string (n huruf besar) dan mengembalikan Optimal Alphabet Steppingt
adalah fungsi pembantu yang mengambil string dan alfabet melangkah dan mengembalikan jumlah hop yang diperlukan untuk menyelesaikan string (atau26*len(s)
jika tidak mungkin).sumber
while a!=A(c)and S<len(s)*26:
dan Anda dapat menghapusif a==i:return float('inf')
, karenalen(s)*26
ada batas atas jawaban apa pun.Merah , 197 byte
Cobalah online!
sumber
05AB1E (warisan) ,
332726 byteMenggunakan versi lawas karena sepertinya ada bug ketika Anda ingin memodifikasi / menggunakan hasilnya setelah peta bersarang di versi 05AB1E baru ..
Output terindeks 0.
Cobalah secara online atau verifikasi semua kasus uji .
Penjelasan:
sumber
Python 3 ,
191178162 byteTerima kasih semuanya atas semua tips Anda! ini terlihat seperti golf.
Cobalah online!
Dan kode asli saya kalau ada yang tertarik.
Ubah kata menjadi daftar nilai ASCII, lalu beralih melalui ukuran langkah 0 hingga 25, memeriksa berapa langkah yang diperlukan untuk mengeluarkan daftar (ada langit-langit untuk menghentikan loop tak terbatas).
Jumlah langkah ditambahkan ke daftar a .
Setelah big for loop, indeks nilai terkecil dalam a dicetak. Ini sama dengan nilai i (ukuran langkah) untuk iterasi loop, QED.
sumber
range(26)
sudah cukup - Anda tidak perlu menentukan awal, karena 0 adalah default;a.append(n)
bisa jadia+=[n]
; baris pertama akan lebih pendek sebagai petaw=list(map(ord,input()))
, (sebenarnya dengan algoritma Anda saat ini, di Py2 Anda juga bisa menjatuhkanlist(...)
pembungkus); hindari spasi ekstra / jeda baris sebanyak mungkin (mis., tidak perlu baris baru di oneliners :)if p>122:p-=26
)n>99
terlihat mencurigakan, apakah konstanta yang sewenang-wenang untuk keluar dari loop yang tidak terbatas? Maka mungkin harus seperti 26 * len (w), karena Anda tidak pernah tahu, seberapa besar inputnya.list(...)
di Py3 dan juga satu tambahanif
: 165 byte . Juga, lihat topik tips ini , saya yakin Anda akan sangat meningkatkan keterampilan Anda menggunakan saran dari sana!while p!=c and n>len(w)*26:
dan menyingkirkan yang terakhir jika pernyataan untuk -8 byte.n+=1
danp+=i
pada baris yang terpisah menjadin+=1;p+=i
satu.