pengantar
Pertimbangkan dua array integer yang tidak kosong, misalkan A = [0 3 2 2 8 4] dan B = [7 8 7 2] . Untuk melakukan penambahan pelurusan pada mereka, kami melakukan hal berikut:
Ulangi setiap larik cukup kali untuk memiliki panjang total lcm (panjang (A), panjang (B)) . Di sini lcm merupakan kelipatan umum terendah.
A -> [0 3 2 2 8 4][0 3 2 2 8 4] B -> [7 8 7 2][7 8 7 2][7 8 7 2]
Lakukan penambahan elemen-bijaksana pada array berulang, dan potong hasilnya di setiap posisi di mana ada pemotongan di salah satu dari mereka.
A -> [0 3 2 2 8 4][0 3 2 2 8 4] B -> [7 8 7 2][ 7 8 7 2][7 8 7 2] -> [7 11 9 4][15 12][7 5][9 10 15 6]
Array array ini adalah hasil Anda.
Tugas
Input Anda adalah dua array integer yang tidak kosong, dan output Anda akan menjadi hasil penambahan alignment, seperti yang didefinisikan di atas. Input dan output dapat dalam format yang masuk akal. Anda tidak perlu khawatir tentang integer overflow saat melakukan penambahan.
Aturan dan penilaian
Anda dapat menulis program atau fungsi lengkap. Hitungan byte terendah menang.
Uji kasus
[1] [4] -> [[5]]
[1,2,-3,-4] [15] -> [[16],[17],[12],[11]]
[0,-4] [2,1,0,-3] -> [[2,-3],[0,-7]]
[0,3,2,2,8,4] [7,8,7,2] -> [[7,11,9,4],[15,12],[7,5],[9,10,15,6]]
[18,17,16] [-1,-2,-3,-4] -> [[17,15,13],[14],[16,14],[15,13],[15],[16,14,12]]
[18,17,16,15] [-1,-2,-3,-4] -> [[17,15,13,11]]
[1,1,1,1,1] [6,5,6,5,6,5,6,2,1] -> [[7,6,7,6,7],[6,7,3,2],[7],[6,7,6,7,6],[7,3,2],[7,6],[7,6,7,6,7],[3,2],[7,6,7],[6,7,6,7,3],[2],[7,6,7,6],[7,6,7,3,2]]
[1,1,1,1,1,1] [6,5,6,5,6,5,6,2,1] -> [[7,6,7,6,7,6],[7,3,2],[7,6,7],[6,7,6,7,3,2]]
[1,1,1,1,1,1,1] [6,5,6,5,6,5,6,2,1] -> [[7,6,7,6,7,6,7],[3,2],[7,6,7,6,7],[6,7,3,2],[7,6,7],[6,7,6,7,3,2],[7],[6,7,6,7,6,7,3],[2],[7,6,7,6,7,6],[7,3,2],[7,6,7,6],[7,6,7,3,2],[7,6],[7,6,7,6,7,3,2]]
Jawaban:
JavaScript (ES6),
10199 byteMengambil input sebagai 2 array. Mengembalikan string.
Bagaimana itu bekerja
Kita beralih pada array pertama
a
dengan sebuah pointeri
sambil memperbarui pointer lainj
ke dalam array keduab
. Jumlahnyaa[i] + b[j]
ditambahkan ke string outputs
. Pemisah dimasukkan setiap kalii == 0
atauj == 0
. Kami mengulangi proses ini sampaij
kembali tepat di awalb
pada akhir iterasi.Catatan: Ketika
|
operator diterapkan,a.map(...)
dipaksa untukNaN
(jikaa
mengandung lebih dari satu elemen) atau nilai saat inij
(jikaa
mengandung tepat satu elemen). Karena itu,a.map(...)|j == j
dalam semua kasus dan aman digunakan di sini.Uji kasus
Tampilkan cuplikan kode
sumber
Haskell,
8479 byteVersi pertama saya sama dalam tata letak yang lebih mudah dibaca:
Menggunakan definisi lokal untuk menghindari keharusan memberikan
(%)
argumen tambahan untuka
danb
. Hebatnya, ini adalah solusi yang hampir sama diberikan pada waktu yang hampir bersamaan dengan @ nimi, dari siapa saya mengambil ide untuk menggunakan hanya satu baris untuk definisi lokal.Pemakaian:
sumber
!
.PHP,
126120 byteCoba di sini!
Fungsi anonim yang mengembalikan array array yang dihasilkan.
Pada dasarnya, kita mengulang isi kedua array kita, memodifikasi iterator kita dengan panjang array untuk mensimulasikan 'menyalin' mereka. Mengambil masing-masing nilai dari array, kami menjumlahkannya dan menambahkannya ke dalam array
$c
. Jika kami mencapai akhir dari salah satu array input kami (pemisahan, dalam hal tantangan), kami mulai menugaskan ke dalam array baru di$c
.Alasan untuk
do while
loop adalah karena kondisi kami didasarkan pada$i
, yang dimulai pada0
. Jika kita menggunakan loop di mana kondisi diperiksa di awal, loop tidak akan berjalanKami hanya mengakhiri penjumlahan begitu kami mencapai akhir dari kedua array pada saat yang sama, yang akan menyiratkan LCM.
sumber
$b[$i%$y]
? Anda dapat menghemat 3 byte dengan pindah$x=count($a)
ke penggunaan pertama$x
; sama untuk$y=count($b)
dan satu byte dengan bitwise atau dalamwhile
kondisiHaskell,
8784 byteContoh penggunaan:
[0,3,2,2,8,4] # [7,8,7,2]
->[[7,11,9,4],[15,12],[7,5],[9,10,15,6]]
.Rekursi sederhana. Kasing dasar: kedua daftar kosong. Jika hanya satu yang kosong, mulai ulang dengan versi lengkap dan mulai cluster baru di output. Jika tidak ada yang kosong, tambahkan jumlah ke elemen from.
Lihat juga jawaban @Christian Sievers , yang hampir identik dan telah diposting beberapa detik sebelumnya.
sumber
Oktaf, 113 byte
fungsi ini secara langsung dapat dipanggil untuk menyebutnya letakkan di dalam tanda kurung dan panggil sebagai (@ (a, b) ...) ([1 2 3 4], [6 4 5])
sumber
CJam , 30 byte
Cobalah online!
Mengambil input sebagai pasangan daftar.
Penjelasan
Idenya adalah untuk memasukkan beberapa penanda ke dalam array input (dalam bentuk string pendek) yang menunjukkan di mana array yang disejajarkan berakhir, dan di mana kita perlu memasukkan jeda pada array. Dengan cara ini kita dapat menghindari keharusan menghitung LCM.
sumber
Jelly ,
212018 byteCobalah online!
Bagaimana itu bekerja
sumber
Python 3.5 - (
146137134130 + 12) = 142 BytesSaya tidak tahu bagaimana cara meletakkan keseluruhan untuk loop dalam satu baris.
Suntingan:
sumber
gcd
fungsi difractions
, tidakmath
.3.4.3
.l*k
dan adaprint(r);r=[]
di baris terakhir.Python 2, 119 byte
Mengambil input dari stdin ketika dua tupel dipisahkan oleh koma, menampilkan daftar yang dihasilkan ke stdout. Berakhir dengan menaikkan
ZeroDivisionError
pengecualian, sejak itu tampaknya diizinkan .Misalnya, jika inputnya adalah
(0, 3, 2, 2, 8, 4), (7, 8, 7, 2)
, program akan mencetakke stdout dan pengecualian traceback ke stderr.
sumber
J ,
3432 byteCobalah online!
Penjelasan
sumber
Haskell, 166 byte
Ini mungkin bukan pendekatan yang paling elegan: Pada dasarnya fungsi
?
membuat satu daftar panjang yang dibutuhkan dengan jendela, dan%
memotong jumlah ini lagi.!
adalah fungsi terakhir yang menggabungkan keduanya.sumber
ind
dengank
atau sesuatu, dan ada beberapa tanda kurung yang tidak perlu di sekitardrop i l
danmap(+(-i))ind
. Pertimbangkan juga memiliki dua kasing%
, dengan pencocokan pola aktifl
.[PHP],
183152135 byteVersi bagus:
Keluaran:
sumber
$i=$j=$k=0;
tidak perlu jika Anda menggunakan+$i
dll untuk indeks array dalam penugasan menambahkan (-8 byte).$i++;if(!isset($A[$i])){$i=0;$k++;}
->isset($A[++$i])?:$i=!++$k;
(-9, dua kali).$i==0&&$j==0&&!isset()
->!$i&!$j&!isset()
(-6).return$O;
tidak membutuhkan ruang (-1).$i=$j=0;
bagian karena nilai pertama dari array tidak akan benar. Saya telah memodifikasi logika sedikit jadi tidak yakin bagaimana menerapkan operator ternary dalam kasus ini. Terima kasih atas++$i
sarannya.unset($i);$A[+$i]
. The+
akan dilemparkannull
ke bilangan bulat0
.if(!isset($A[++$i])){$i=0;++$k;++$f;}
->isset($A[++$i])?:$i=!++$k|!++$f;
masing-masing masih menyimpan 5 byte. Simpan satu lagi dengan$f<2
bukan$f!=2
. dan dua lainnya denganwhile($f=$f<3){...}
sebagai gantinyawhile($f<2){$f=0;...}
(menginisialisasi dan me-reset$f
ke 1 kecuali itu meningkat dua kali)PowerShell ,
147145 byteCobalah online!
( Saran golf diterima. Saya merasa mungkin ada 10 hingga 15 byte yang bisa diperas dari ini. )
Mengambil input sebagai dua array eksplisit (dengan
@(...)
sintaks) sebagai argumen baris perintah. Mengembalikan hashtable dari array yang dihasilkan, karena array multidimensi di PowerShell bisa menjadi aneh, dan ini lebih konsisten. Set beberapa variabel awal, kemudian memasukido
/until
lingkaran lagi, dengan makhluk bersyarat sampai$i
adalah lcm dari jumlah array yang .Setiap iterasi loop, kami menambahkan korespondensi
$a
dan$b
nilai - nilai bersama-sama, memperlakukannya sebagai array,(...)
sebelum menambahkannya ke dalam hashtable$o
di tempat yang sesuai$j
. Enkapsulasi array diperlukan untuk mencegah penambahan aritmatika - ini memaksa+=
overload untuk menggabungkan array sebagai gantinya. Kemudian, tergantung pada$x
dan$y
(jumlah) untuk menentukan apakah kita berada di tepi array - jika demikian, kita menambah$j
.Akhirnya, kami keluar
$o
dari jalur pipa dan hasilnya tersirat.(NB: Karena cara PowerShell menyebutkan hashtables dengan default
Write-Output
, ini cenderung menjadi output "terbelakang"; seperti pada, array hasil "0" ada di "bawah" dari output. Hash itu sendiri baik-baik saja, dan akan menjadi digunakan dengan baik jika Anda misalnya, mengenkapsulasi kode ini dalam variabel kembali ... itu hanya terlihat aneh ketika dicetak.)Menyimpan 2 byte dengan memindahkan $ x dan $ y ke dalam indeks array daripada memisahkan (menyimpan dua titik koma).
sumber
Python 2, 113 byte
sumber
not
s menjadi<1
?Python 3.5,
210176173169158 BytesMengambil dua daftar sebagai input dan mencetak semua daftar.
Ini jawaban pertama saya dan saya belum tahu cara bermain golf. Ide dasar yang saya gunakan adalah memiliki dua penghitung untuk setiap daftar yang menunjukkan perpecahan dan daftar saat ini di mana nilai tambah ditambahkan ke; segera setelah pemecahan terjadi, kami mencetak daftar saat ini dan membuat yang kosong baru.
sumber
x=[];c=len(a);d=len(b);e=f=0
. Juga,true
bisa menjadi1
, danx.append(a[e]+b[f])
bisa menjadix+=a[e]+b[f],
.if
danwhile
pernyataan tidak perlu tanda kurung.Racket 373 byte
Tidak Disatukan:
Pengujian:
Keluaran:
sumber
Clojure,
280206 byteNah ini jauh lebih masuk akal. Menghasilkan jumlah elemen-bijaksana, menambahkan metadata posisi, mengambil sementara kita belum mengulanginya dan menempatkan nilai jumlah ke setiap partisi.
Asli: Saya berharap untuk memperbaiki ini, tetapi ini adalah yang paling baik yang saya miliki untuk saat ini.
Tidak disatukan dan bertele-tele:
Mulai dengan "menggabungkan" siklus koleksi yang tak terbatas
a
danb
, menambahkan metadata pada indeks setiap elemen dalam koleksi, berlangsung hingga kedua urutan mulai dari indeks 0 lagi.Koleksi ini
c
ini kemudian digabungkan dengan data partisi (jumlah kumulatif satu dan nol), dipartisi dan elemen terakhir (menjadi jumlah item) dipilih.Saya pikir untuk perbaikan signifikan diperlukan pendekatan yang sama sekali berbeda.
sumber
PHP,
150121119 bytefungsi anonim mengambil input sebagai array.
kerusakan
sumber
C ++ 14, 206 byte
Sebagai lambda generik yang tidak disebutkan namanya, membutuhkan wadah masukan
P
,Q
dan wadah keluaranR
sepertivector<vector<int>>
.Tidak digabungkan dan digunakan:
sumber
Mathematica 112 Bytes
Ini mungkin bisa diperbaiki. Idenya adalah untuk membuat array 2D dengan elemen kedua yang digunakan untuk melacak lessor dari penghitung i mod panjang masing-masing array input.
Pemakaian
sumber
JavaScript (ES6), 131 byte
Sedikit tidak berbulu:
d
dane
mengandung angka, jumlah angka pertama ditambahkan kes
dan elemen yang tersisa diproses secara rekursifs
ditambahkan ke hasilnyar
dan array lainnya diatur ulang ke array awalSayangnya solusi ini tidak memiliki efisiensi yang kejam dari @ Arnauld, tapi setidaknya saya pikir ini solusi yang indah.
sumber