Kami mendefinisikan binarray sebagai array yang memenuhi properti berikut:
- ini tidak kosong
- nilai pertama adalah a
1
- nilai terakhir adalah a
1
- semua nilai lainnya adalah
0
atau1
Misalnya, array [ 1, 1, 0, 1 ]
adalah binarray yang valid .
Tugas
Mengingat non-kosong array yang Sebuah bilangan bulat non-negatif dan positif bilangan bulat N , tugas Anda adalah untuk menemukan binarray B panjang N yang memungkinkan untuk menghasilkan A dengan menjumlahkan jumlah tak terbatas salinan B , digeser oleh jumlah tak terbatas posisi.
Contoh
A = [ 1, 1, 2, 4, 1, 2, 2, 1, 0, 1, 0, 1, 1, 0, 1 ]
N = 4
Untuk input ini, binarray B = [ 1, 1, 0, 1 ]
akan menjadi jawaban yang valid karena kita dapat melakukan:
[ 1, 1, 0, 1 ]
+ [ 1, 1, 0, 1 ]
+ [ 1, 1, 0, 1 ]
+ [ 1, 1, 0, 1 ]
+ [ 1, 1, 0, 1 ]
+ [ 1, 1, 0, 1 ]
-----------------------------------------------
= [ 1, 1, 2, 4, 1, 2, 2, 1, 0, 1, 0, 1, 1, 0, 1 ]
Aturan
- Masukan dapat diambil dalam format apa pun yang masuk akal.
- Output dapat berupa array asli (misalnya
[1, 1, 0, 1]
) atau string biner dengan atau tanpa pemisah (misalnya"1,1,0,1"
atau"1101"
) - Anda hanya perlu mencetak atau mengembalikan satu binarray yang valid . Atau, Anda dapat memilih untuk mencetak atau mengembalikan semuanya ketika ada beberapa solusi.
- Anda tidak diharuskan mendukung input yang tidak mengarah ke solusi apa pun.
- Jumlahnya mungkin termasuk nol implisit yang tidak tumpang tindih dengan salinan B . Nol kedua dalam jumlah di atas adalah nol yang tersirat.
- Anda dapat mengasumsikan bahwa ukuran maksimum A adalah 100 dan ukuran maksimum B adalah 30.
- Ini adalah kode-golf, jadi jawaban tersingkat dalam byte menang. Celah standar dilarang.
Uji kasus
Input : N = 1 / A = [ 1, 2, 3, 4, 5 ]
Output: [ 1 ]
Input : N = 2 / A = [ 1, 2, 100, 99 ]
Output: [ 1, 1 ]
Input : N = 3 / A = [ 1, 1, 1 ]
Output: [ 1, 1, 1 ]
Input : N = 3 / A = [ 1, 1, 3, 2, 2 ]
Output: [ 1, 1, 1 ]
Input : N = 3 / A = [ 1, 0, 2, 1, 1, 1, 0, 0, 1, 0, 1 ]
Output: [ 1, 0, 1 ]
Input : N = 4 / A = [ 1, 2, 2, 2, 1 ]
Output: [ 1, 1, 1, 1 ]
Input : N = 4 / A = [ 1, 1, 2, 4, 1, 2, 2, 1, 0, 1, 0, 1, 1, 0, 1 ]
Output: [ 1, 1, 0, 1 ]
Input : N = 4 / A = [ 1, 1, 0, 2, 1, 0, 1 ]
Output: [ 1, 0, 0, 1 ] or [ 1, 1, 0, 1 ]
Input : N = 5 / A = [ 1, 3, 6, 9, 8, 6, 3, 4 ]
Output: [ 1, 1, 1, 0, 1 ]
Input : N = 8 / A = [ 2, 1, 0, 2, 3, 3, 1, 2, 1 ]
Output: [ 1, 0, 0, 1, 1, 1, 0, 1 ]
Input : N = 10 / A = [ 1, 2, 1, 2, 2, 1, 3, 3, 3, 2, 3, 0, 2, 1, 1, 0, 1 ]
Output: [ 1, 1, 0, 1, 0, 1, 1, 1, 0, 1 ]
Input : N = 13 / A = [ 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1 ]
Output: [ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ]
Input : N = 5 / A = [ 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1 ]
Output: [ 1, 1, 1, 1, 1 ]
Input : N = 6 / A = [ 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1 ]
Output: [ 1, 0, 0, 0, 0, 1 ]
Input : N = 7 / A = [ 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1 ]
Output: [ 1, 1, 0, 0, 0, 1, 1 ]
Input : N = 9 / A = [ 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1 ]
Output: [ 1, 0, 1, 0, 1, 0, 1, 0, 1 ]
code-golf
array-manipulation
polynomials
Arnauld
sumber
sumber
N
yang seharusnya didukung?N=4, A = [ 1, 1, 2, 4, 1, 2, 2, 2, 1, 2, 2, 1, 2, 0, 1 ]
, Anda mendapatkan 30459 yang dapat dibagi oleh 11 dan 13 namun hanya satu[ 1, 1, 0, 1 ]
dan[ 1, 0, 1, 1 ]
jawaban yang valid.Jawaban:
PHP,
105 92 9086 byteSolusi Jörg diperbaiki dan golf :
mengambil
N
dari argumen baris perintah pertama, nilai setelah itu; jalankan dengan-r
atau coba online .mencetak nomor biner (format
10001
); mencetak solusi yang tidak valid atau berjalan mati jika tidak ada solusi yang valid.versi pertama (sekarang 97 byte) yang tidak mencetak apa pun untuk input yang tidak valid: uji secara online
kerusakan
sumber
111
mana satu-satunya hasil yang benar adalah [1, 0, 1].PHP , 219 byte
Cobalah online!
-4 Bytes menggunakan
[$g,$z]=$_GET
PHP 7.1 sebagai gantilist($g,$z)=$_GET
sumber
[1,0,1,0,1,0,1,0,1]
jawaban yang valid ( ) dan tidak valid ([1,0,0,0,1,0,1,1,1]
) untuk kasus uji terakhir.while($_GET[0])$s+=2**$i++*array_pop($_GET[0]);
. -5 byte:range(1|.5*$m=2**$_GET[1],$m,2)
.[ 1,0,1,1,1,0,2,2,2,2,2,1 ]
.for($g=$_GET[0];$g;)
.Python, 166 byte
Cobalah online!
Bagaimana itu bekerja
Pertimbangkan A dan B sebagai angka dasar k nomor u dan v . Misalnya (kami akan menggunakan k = 1000 untuk ilustrasi):
A = [1, 2, 1, 3, 2, 1, 2]
B = [1, 0, 0, 1]
u = 1 002 001 003 002 001 002
v = 1 000 000 001
Seperti yang banyak diperhatikan oleh penjawab lain, jika B adalah jawaban yang valid, maka Anda dapat dibagi dengan v . Pada kasus ini,
u = 1 002 001 002 ⋅ v
Hasil bagi ini, diterjemahkan kembali ke array [1, 2, 1, 2], memberi tahu kita dengan tepat berapa banyak salinan B yang perlu kita ubah ke setiap posisi.
(Kenapa? Karena itulah tepatnya berapa lama perkalian bekerja di basis k .)
Yang gagal diperhatikan oleh penjawab lain adalah bahwa kondisi di atas tidak memadai . Sebagai contoh:
A = [1, 2, 1, 3, 2, 1, 2]
B = [1, 1, 1, 1]
u = 1 002 001 003 002 001 002
v = 1 001 001 001
u = 1 000 999 002 ⋅ v
Secara matematis, kita masih bisa menerjemahkan hasil bagi itu kembali ke array [1, 1, −1, 2], yang berfungsi dengan baik jika kita diperbolehkan menggunakan salinan negatif B:
tetapi tentu saja tantangannya tidak memungkinkan salinan negatif. Jadi kita perlu cek tambahan.
Menjelang akhir itu, kami memilih basis k = 10 e di mana k > 10 ⋅ jumlah (A), dan memeriksa bahwa tidak ada digit basis k yang meluap ke digit basis k berikutnya ketika kami mengalikan hasil bagi dengan sepuluh. Artinya, setiap e th dasar sepuluh digit, dimulai di akhir, di dasar sepuluh representasi dari kali quotient sepuluh, harus 0. Ini jaminan bahwa hasil bagi diterjemahkan kembali ke array dengan elemen non-negatif.
sumber
PHP, 213 Bytes
Cara yang sama sedikit golf
Cobalah online!
PHP, 344 Bytes pertama berfungsi
Setelah jawaban pertama saya, saya memutuskan untuk mencoba lagi yang memberikan semua solusi yang valid.
Versi Online
Kerusakan
sumber
=
di loop pertama untuk versi yang lebih pendek. Dalam versi yang lebih besar perlu menghapus empat BytesPython, 205 byte
Mengembalikan string biner tanpa pemisah. Seperti yang ditunjukkan oleh @AndersKaseorg, ada input yang solusi @ fəˈnɛtɪk tidak berfungsi karena divisi tersebut menunjukkan koefisien negatif yang tidak diizinkan. Untuk mengatasi ini, saya menggunakan basis yang sangat besar dan menguji bahwa tidak ada pinjaman di divisi.
sumber
f([1, 1, 1, 0, 0, 0, 1, 1, 1], 3)
salah mengembalikan101
.f([1, 0, 2, 0, 2, 0, 1], 3)
, dan varian maju dan mundur gagalf([1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0], 5)
.i
aneh, varian maju dan mundur gagalf([1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0]*10, 5)
.(x^kn-1)/(x^k-1)
selalu memiliki(x^n-1)/(x-1)
faktor, yang membodohi solusi @ fəˈnɛtɪk di basis apa pun.Pyth, 32 byte
Cobalah online
Bagaimana itu bekerja
Strategi ini mirip dengan jawaban Python saya , kecuali karena Pyth memiliki builtin untuk konversi basis, kita dapat menggunakan basis yang lebih efisien k = 2 ⋅ jumlah (A), dan memeriksa secara langsung bahwa setiap digit hasil bagi adalah paling banyak jumlah (A ).
sumber
Pari / GP ,
77749680 byteMengembalikan semua solusi.
Pertama-tama, mengubah array
a
menjadi polinomialb
. Kemudian memilih dari pembagib
polinomiald
sedemikian sehingga koefisiend
semua1
dan0
, dan koefisienb / d
semua tidak negatif, dand(0) = 1
, dandeg(d) = n + 1
. Akhirnya, ubah mereka kembali ke array.Cobalah online!
sumber