Anda telah mengumpulkan data dari Advanced Collecting Device Controller ™ sejak lama. Anda memeriksa log, dan Anda terkejut menemukan sesuatu yang sangat salah: data hanya berisi bit terakhir dari angka!
Untungnya, Anda tahu nilai awalnya dan bahwa nilainya tidak pernah berubah dengan cepat. Itu berarti Anda dapat memulihkan sisanya hanya dengan mencari jarak dari awal.
Tantangan
Anda akan menulis sebuah program atau fungsi untuk menghitung jumlah nilai yang telah berubah, diberikan modulus N
dan daftar nilai-nilai menengah moduloN
.
Perubahan antara setiap pasangan angka selalu kurang dariN/2
, jadi hanya akan ada satu jawaban yang valid untuk setiap kasus uji.
Anda akan diberikan sebagai input integer N
> 2 dan daftar nilai, dalam format pilihan Anda. Input dapat diberikan melalui STDIN atau baris perintah atau argumen fungsi.
Anda akan menghasilkan bilangan bulat tunggal, jumlah nilai aslinya telah berubah. Output dapat dicetak ke STDOUT atau dikembalikan.
Aturan
- Program Anda harus bekerja untuk jarak apa pun dan modulus kurang dari
2^20
. - Anda dapat berasumsi bahwa:
N
setidaknya3
.- Daftar memiliki setidaknya 2 nilai.
- Semua nilai dalam daftar setidaknya 0 dan kurang dari
N
. - Semua perubahan dalam angka kurang dari
N/2
.
- Yang lainnya adalah input yang tidak valid, dan program Anda dapat melakukan apa pun yang diinginkannya.
- Celah standar, semua perpustakaan non-standar, dan fungsi bawaan untuk tujuan yang tepat ini dilarang.
- Ini adalah kode-golf , jadi program terpendek dalam byte menang.
Contoh kasus uji
Memasukkan:
3
0 1 2 2 0 1 0 2 1 2 0 1 2 1 1
Keluaran:
4
Penjelasan (dengan nilai contoh):
Value mod 3: 0 1 2 2 0 1 0 2 1 2 0 1 2 1 1
Value: 0 1 2 2 3 4 3 2 1 2 3 4 5 4 4
Memasukkan:
10
5 2 8 9 5
Keluaran:
-10
Penjelasan (dengan nilai contoh):
Value mod 10: 5 2 8 9 5
Value: 15 12 8 9 5
Input tidak valid:
2
0 0 0 0 0
(modulus terlalu kecil)
6
2 5 4 2
(perubahan terlalu besar antara 2 dan 5)
:^;[5 2 8 9 5](\
?Jawaban:
TI-BASIC, 15 byte
Mengambil daftar dari
Ans
dan modulus dariInput
.sumber
Python 2, 53 byte
Jawaban super lurus ke depan. Saya ingin tahu apakah ada cara yang lebih pendek.
sumber
.:_2
untuk menghasilkan pasangan sampai saya melihat jawaban Anda - Saya menggunakan zip.Mathematica, 30 byte
Ini adalah fungsi anonim yang membutuhkan dua argumen. Contoh penggunaan:
Ini bekerja dengan mengambil
Differences
antara unsur-unsur berturut-turut, membungkus mereka untuk kisaran-n/2
untuk+n/2
denganMod
dan parameter offset, kemudian mengambil total denganTr
(matriks jejak, jumlah dari elemen diagonal).Perhatikan bahwa bahkan yang tidak diserang hanya 43 byte!
sumber
@
tidak perlu ketika Anda sudah memanggil fungsi dengan tanda kurung. Memiliki keduanya adalah kesalahan sintaksis.J, 24 byte
Pemakaian:
Akan mencoba bermain golf lebih banyak dan menambahkan beberapa penjelasan setelah itu.
Cobalah online di sini.
sumber
Pyth,
2019 byteMencuri
.:_2
dari Jakube, ide dari Mauris.sumber
R, 38 byte
Ini menciptakan fungsi tanpa nama yang menerima integer dan vektor sebagai input dan mengembalikan integer tunggal. Untuk menyebutnya, berikan nama, mis
f=function(n,v)...
.Penjelasan + tidak dikumpulkan:
Contoh:
sumber
MatLab, 33 byte
Maaf, ini jawaban pertama saya di situs web ini. Mengetikkan ini di MatLab kemudian menggunakan input
ans(modulus_value, [intermediate_values])
akan mengembalikan nilai yang diminta, di mana 'modulus_value' adalah nilai modulus, dan 'intermediate_values' adalah daftar nilai-nilai antara yang dipisahkan oleh spasi atau koma.Contoh:
Fungsi anonim mengambil keuntungan dari MatLab ini
mod
,diff
dansum
fungsi untuk menghitung jawabannya. Pertama, perbedaan antara masing-masing nilai antara dihitung. Hasilnya kemudian diimbangi oleh modulus dibagi dua, menghasilkan seperangkat nilai perbedaan yang terikat oleh [-modulus / 2 modulus / 2]. Hasilnya kemudian diimbangi dan dijumlahkan kembali.Saya pikir ini bisa lebih banyak golf, saya akan segera kembali dengan pembaruan. Terima kasih khusus kepada @ 2012rcampion untuk idenya.
Sunting:
unwrap
Fungsi Matlab hampir berfungsi di sini, tetapi sulit untuk bermain golf. Kode berikut mengembalikan array di mana nilai terakhir adalah jumlah nilai pertama yang diubah:@(x,y)unwrap(y/x*2*pi)/2/pi*x-y(1)
Nilai-nilai perantara diskalakan ke kisaran [-pi pi], lalu "tidak terbuka" sehingga tidak ada nilai berurutan yang lebih dari pi terpisah. Nilai-nilai ini kemudian diskalakan ulang dan digeser, menghasilkan array jarak dari nilai awal.
Menarik, tetapi tidak terlalu praktis untuk tantangan ini: D
sumber
Pyth, 29 byte
Cobalah secara online: Pyth Compiler / Executor
sumber
CJam, 27 byte
Uji di sini.
sumber
Pip , 39 byte
Membutuhkan daftar data sebagai argumen baris perintah dan modulus pada STDIN. Jika itu terlalu banyak, saya memiliki versi yang membutuhkan dua baris perintah args untuk 5 byte lebih.
Penjelasan:
Dan hanya untuk membuktikan bahwa skor yang tidak terlalu kompetitif ini lebih mencerminkan kemampuan golf saya daripada bahasa saya, inilah port solusi Python Mauris dalam 30 byte :
sumber
Jelly , tidak bersaing
6 byte Jawaban ini tidak bersaing, karena tantangan mendahului pembuatan Jelly.
Cobalah online!
Bagaimana itu bekerja
sumber