Latar Belakang
Ada adalah bahasa pemrograman yang tidak dikenal karena kekasarannya.
Namun, sintaks literal arraynya secara teori memungkinkan spesifikasi array yang cukup singkat. Berikut ini adalah deskripsi EBNF sederhana dari sintaks literal array (lumayan untuk bottlecaps.de :
array ::= positional_array | named_array
positional_array ::= expression ',' expression (',' expression)*
| expression (',' expression)* ',' 'others' '=>' expression
named_array ::= component_association (',' component_association)*
component_association ::= discrete_choice_list '=>' expression
discrete_choice_list ::= discrete_choice ('|' discrete_choice)*
discrete_choice ::= expression ('..' expression)? | 'others'
Kami akan membatasi diri pada array bilangan 1 dimensi untuk kesederhanaan. Ini berarti bahwa kami hanya akan menggunakan bilangan bulat untuk nilai ekspresi. Mungkin dalam tantangan di masa depan kita bisa mencoba sesuatu yang lebih maju (seperti mendeklarasikan variabel dan array multidimensi). Anda tidak harus bermain golf bilangan bulat literal .
Berikut adalah beberapa contoh literal array Ada dan representasi setara python-esque untuk kejelasan:
(1, 2, 3) = [1, 2, 3]
(1, others => 2) = [1, 2, 2, ..., 2]
(others => 1) = [1, 1, ..., 1]
(1 => 1, 2 => 3) = [1, 3]
(1|2 => 1, 3 => 2) = [1, 1, 2]
(1 => 1, 3 => 2, others => 3) = [1, 3, 2, 3, 3, ..., 3]
Tantangan
Tujuan dari tantangan ini adalah untuk menghasilkan byte array count-byte terpendek yang ada untuk array input yang diberikan. Perhatikan bahwa array Ada dapat mulai dari indeks apa pun yang diinginkan, sehingga Anda dapat memilih apa yang Anda inginkan sebagai indeks awal selama masing-masing nilai berurutan. Dalam contoh ini saya memilih untuk memulai pada 1, yang merupakan idiomatis untuk Ada, namun Anda dapat memilih untuk mulai dari bilangan bulat lainnya.
Memasukkan
Masukan Anda akan terdiri dari daftar bilangan bulat, dalam bentuk apa pun yang nyaman.
Keluaran
Output Anda akan berupa string teks yang mewakili literal array Ada terpendek valid yang mewakili daftar bilangan bulat input. Anda dapat menggunakan indeks awal apa pun yang Anda inginkan pada larik ini, tetapi pilihan Anda (apa pun itu) harus ditentukan dalam jawaban Anda (indeks awal mungkin juga dinamis).
Bilangan bulat harus direpresentasikan sebagai angka desimal yang ditandatangani, seperti pada contoh. Tantangan ini tidak mencakup golf dari nilai integer.
Contohnya
Berikut ini beberapa contohnya:
Simple: [1, 2, 3] -> (1,2,3)
Range: [1, 1, 1, 1, 1, 1, 1,] -> (1..7=>1)
Others: [1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1] -> (6=>2,others=>1)
Multiple Ranges: [1,1,1,1,1,2,2,2,2,2,1,1,1,1,1,2,2,2,2,2,1,1,1,1,1] -> (6..10|16..20=>2,others=>1)
Tiny Ranges: [1,1,2,2,1,1,1,1,1] -> (3|4=>2,others=>1)
Far Range: [[1]*5, [2]*100, [3]*5] -> (1..5=>1,6..105=>2,others=>3)
Alternation: [1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2] -> (1|3|5|7|9|11|13|15|17=>1,others=>2)
Big Number: [1234567890,1,1234567890] -> (2=>1,1|3=>1234567890)
Big-ish Number: [1234567,1,1234567] -> (1234567,1,1234567)
Solo: [-1] -> (1=>-1)
Huge Input: [[0],[1]*1000000000] -> (0,others=>1)
Positional Others: [1, 2, 3, 3, 3, 3, 3, 3] -> (1,2,others=>3)
Range and Choice, no Others: [1,1,1,12,12,3,3,3,3,3,3,3,3,3,3,4] -> (1..3=>1,4|5=>12,6..15=>3,16=>4)
Persyaratan minimum
Mendukung setidaknya 100 angka dan panjangnya sedikitnya 256 angka.
Menghasilkan hasil yang benar untuk semua input tersebut
- Termasuk menempatkan 'orang lain' di bagian akhir
- Termasuk menempatkan indeks untuk array item tunggal
Hentikan (sebaiknya pada TIO) untuk masing-masing input di atas dalam waktu kurang dari satu menit.
Solusi terpendek dalam byte menang!
Implementasi Referensi
Implementasi ini menggunakan input sebagai lariknya, dengan setiap karakter menjadi angka. Huruf kapital adalah konstanta khusus untuk nilai besar. Argumen program adalah 'indeks awal' untuk digunakan.
Bagian "kode" di tautan TIO adalah solusi yang tepat untuk masalah tersebut, sedangkan "header" dan "footer" menerapkan struktur pengujian.
sumber
(-1)
?106..110=>3,others=>2
akan lebih lama) Kasus terakhir perlu memiliki indeks, karena tata bahasa tidak mengizinkan array posisi elemen tunggal (positional_array ::= expression ',' expression (',' expression)*
)(1=>1,others=>1)
(1..100000000=>1)
(1|3=>1234567,2=>1)
ini adalah keluaran lain yang valid untuk[1234567,1,1234567]
?Jawaban:
JavaScript (ES6),
307304 byteDisimpan 2 byte berkat @KevinCruijssen
Ini memalukan lama ...
Cobalah online!
sumber
'others=>'
.t
digunakan sebelum didefinisikan; alasan mengapa tidak macet adalah karena 2 kasus uji pertama tidak menggunakannya sama sekali; yang dapat dengan mudah diperbaiki tanpa biaya, meskipun.)'others'
dua kali dan mencoba membuat variabel untuk itu tanpa mengubah output. ;) Terima kasih telah menjelaskannya, dan golf yang bagus dengan menggunakan koma[,O]
. :)05AB1E ,
136134132 byteEDIT: Tetap untuk semua kasus uji sekarang.
Cobalah secara online atau verifikasi semua test case (kecuali untuk yang 'Input Besar', karena terlalu besar).
Penjelasan:
Lihat ini 05AB1E ujung tambang (bagian Cara string kompres bukan bagian dari kamus? ) Untuk memahami mengapa
…ˆ†=>
adalah"others=>"
.sumber