Asumsikan kita ingin menggeser array seperti yang dilakukan di game 2048 : jika kita memiliki dua elemen berurutan yang sama dalam array, gabungkan mereka menjadi dua kali elemen nilai. Shift harus mengembalikan array baru, di mana setiap pasangan elemen yang sama berturut-turut diganti dengan jumlah mereka, dan pasangan tidak boleh berpotongan. Pergeseran hanya dilakukan sekali, jadi kita tidak perlu menggabungkan nilai yang dihasilkan lagi. Perhatikan bahwa jika kita memiliki 3 elemen yang sama berturut-turut, kita harus menjumlahkan yang paling kanan, jadi misalnya, [2, 2, 2]
harus menjadi [2, 4]
, bukan [4, 2]
.
Tugasnya adalah menulis fungsi terpendek yang mengambil array dan mengembalikan array yang digeser.
Anda dapat mengasumsikan bahwa semua bilangan bulat akan benar-benar positif.
Contoh:
[] -> []
[2, 2, 4, 4] -> [4, 8]
[2, 2, 2, 4, 4, 8] -> [2, 4, 8, 8]
[2, 2, 2, 2] -> [4, 4]
[4, 4, 2, 8, 8, 2] -> [8, 2, 16, 2]
[1024, 1024, 512, 512, 256, 256] -> [2048, 1024, 512]
[3, 3, 3, 1, 1, 7, 5, 5, 5, 5] -> [3, 6, 2, 7, 10, 10]
Saya juga sangat tertarik dengan solusi menggunakan :)
sumber
Jawaban:
Jelly ,
10 98 byteTryItOnline atau jalankan semua test case
Bagaimana?
sumber
Haskell,
475750 bytePenggunaan
reduce
(ataufold
seperti yang disebut dalam Haskell, ini lipatan kananfoldr
). Contoh penggunaan:map abs.foldr(#)[] $ [2,2,2,4,4,8]
->[2,4,8,8]
.Edit: +10 byte untuk membuatnya berfungsi untuk array yang tidak disortir juga. Angka yang digabungkan dimasukkan sebagai nilai negatif untuk mencegah penggabungan kedua. Mereka dikoreksi oleh final
map abs
.sumber
Brain-Flak ,
15896Cobalah online!
Penjelasan:
1 Membalikkan daftar (memindahkan semuanya ke tumpukan lain, tetapi itu tidak masalah)
2 Lakukan langkah 3-6 hingga tidak ada yang tersisa di tumpukan ini:
3 Gandakan dua elemen teratas (2 3 -> 2 3 2 3)
4 Letakkan 1 di atas jika dua teratas sama, 0 sebaliknya (dari wiki)
5 Jika dua teratas sama (tidak nol di atas) tambahkan dua berikutnya dan dorong hasilnya
6 Pindahkan elemen atas ke tumpukan lainnya
7 Beralih ke tumpukan lain dan cetak secara implisit
sumber
PHP, 116 Bytes
atau
-4 Bytes jika outputnya bisa berupa array
print_r
bukan 'json_encode`176 Bytes untuk menyelesaikan ini dengan Regex
sumber
for($i=count($a=$argv);--$i;)$b[]=($a[$i]==$a[$i-1])?2*$a[$i--]:$a[$i];print_r(array_reverse($b));
ide yang sama tetapi lebih pendek[]
saya butuh$r=[];
Terima kasih atas bantuan AndaGNU sed,
41 3837Termasuk +1 untuk -r
-3 Berkat Digital Trauma
-1 Berkat seshoumara
Input dan output adalah string yang dipisahkan ruang dalam unary ( berdasarkan konsensus ini ).
Cobalah online!
sumber
y,!, ,
untuk menyimpan 1 byte.Retina , 32
r
on line 3 mengaktifkan pencocokan regex kanan-ke-kiri. Dan ini berarti bahwa\1
referensi harus ada sebelum(1+)
kelompok penangkap yang dirujuk.Cobalah online.
sumber
Perl, 41 byte
Termasuk +1 untuk
-p
Berikan urutan input pada STDIN:
shift2048.pl
:sumber
Python, 61 byte
Boolean
b
memeriksa apakah dua elemen terakhir harus runtuh dengan memeriksa bahwa mereka sama dengan cara yang aman untuk daftar panjang 1 atau 0. Elemen terakhir jika kemudian ditambahkan dengan pengali1
untuk sama atau2
untuk tidak sama. Itu ditambahkan ke hasil rekursif dalam daftar dengan banyak elemen yang dipotong pada akhirnya. Terima kasih kepada Dennis untuk 1 byte!sumber
[l[-1]<<b]
menghemat satu byte.l[-2:-1]
adalah[l[-2]]
Perl, 43 + 1 (
-p
) = 44 byteTon Hospel datang dengan 41 byte jawaban , lihatlah!
-4 Terima kasih kepada @Ton Hospel!
Sunting : ditambahkan
\b
, karena tanpa itu gagal pada input seperti24 4
di mana output seharusnya28
.Jalankan dengan
-p
bendera:Saya tidak melihat cara lain selain menggunakan
reverse
dua kali lipat kanan (seperti yangs/(\d+) \1/$1*2/ge
akan kiri-lipat, yaitu2 2 2
akan menjadi4 2
bukan2 4
). Jadi 14 byte hilang berkatreverse
... Masih saya pikir harus ada cara lain (lebih baik) (ini perl!), Beri tahu saya jika Anda menemukannya!sumber
reverse reverse
sepertinya agak panjang. Saya bukan ahli dalam Perl, tetapi apakah ada cara Anda bisa membuat jalan pintas kereverse
(jika tidak ada yang lain, [ab] menggunakaneval
)?($_)
reverse
sepertinyareverse
tidak dapat dipanggil tanpa argumen (contohnya menunjukkan, tapi hanya ada satu prototipe :)reverse LIST
, jadi saya lupa tentang$_
menjadi argumen default;)LIST
bisa kosong ...$_
sebagai argumen default, doc menentukan prototipe tanpa parameter (sukaprint
ataulenght
...). Atau mungkin itu hanya kesan salah yang saya miliki.JavaScript (ES6), 68 byte
sumber
[1024, 1024, 512, 512, 256, 256]
apakah diselesaikan sebagai[2048, 512, 1024]
dan tidak[2048, 1024, 512]
...?Perl 5.10,
6150 byte (49+1 untuk bendera)Terima kasih kepada Ton Hospel untuk menghemat 11 byte!
Solusi bebas-regex, dengan
-a
bendera:Coba di sini!
sumber
@a=($F[-1]-$b?$b:2*pop@F,@a)while$b=pop@F;say"@a"
(50 byte)JavaScript (ES6),
686558576564 byteDisimpan 1 byte berkat @ l4m2
Diperbaiki untuk array yang tidak disortir sekarang karena telah diklarifikasi bahwa input seperti itu diharapkan.
sumber
a=>(a.reverse()+'').replace(/(.),\1/g,(c,i)=>i*2).split`,`.reverse()
?[1024, 1024, 512, 512, 256, 256]
(saya pikir case test ini mungkin telah ditambahkan kemudian).f=(a,l=[],m)=>(x=a.pop())*!m-l?f(a,x).concat(l):x?f(a,2*x,1):[l]
?05AB1E , 26 byte
Cobalah online!
Langkah umum
sumber
Mathematica, 53 byte
Penjelasan
Membagi input menjadi sub daftar yang terdiri dari run dari elemen yang identik. yaitu
{2, 2, 2, 4, 8, 8}
menjadi{{2, 2, 2}, {4}, {8, 8}}
.Partisi masing-masing sublist menjadi panjang partisi paling banyak 2. yaitu
{{2, 2, 2}, {4}, {8, 8}}
menjadi{{{2, 2}, {2}}, {{4}}, {{8, 8}}}
.Totalkan setiap partisi. yaitu
{{{2, 2}, {2}}, {{4}}, {{8, 8}}}
menjadi{{4, 2}, {4}, {16}}
.Membalikkan hasil karena
Partition
perintah Mathematica bergerak dari kiri ke kanan, tetapi kami ingin partisi berada di arah lain. yaitu{{4, 2}, {4}, {16}}
menjadi{{2, 4}, {4}, {16}}
.Ratakan hasilnya. yaitu
{{2, 4}, {4}, {16}}
menjadi{2, 4, 4, 16}
.sumber
Plus@@@
adalahTr/@
dan saya pikir Anda dapat menghindari tanda kurung danJoin@@
jika Anda menggunakan##&@@
pada hasilReverse
(belum mencobanya).Java 7, 133 byte
Input adalah ArrayList, dan itu hanya loop mundur, menghapus dan menggandakan jika diperlukan.
sumber
Long
referensi pada baris 3 dengan==
. Pertimbangkana.get(i)-a.get(i-1)==0
.Perl, 37 byte
Termasuk +4 untuk
-0n
Jalankan dengan input sebagai baris terpisah pada STDIN:
shift2048.pl:
sumber
Haskell, 56 byte
sumber
PHP,
86 100 9994 bytemembutuhkan PHP 7.0; mengambil nilai dari argumen baris perintah.
Jalankan dengan
-nr
atau coba online .sumber
for($r=[];$v=($p=array_pop)($a=&$_GET[a]);)array_unshift($r,end($a)-$v?$v:2*$p($a));print_r($r);
lebih pendek 1 ByteJulia 205 byte
Fungsi yang akan dipanggil adalah
H
misalnya
H([1,2,2,4,8,2,])
Ini sama sekali bukan cara terpendek dalam hal ini di julia. Tapi itu sangat keren, saya ingin membagikannya.
t(a)
adalah tipe-nilai, mewakili nilai (a).s(a)
adalah turunan dari tipe nilai itug
adalah fungsi yang mengirimkan nilai perbedaan (menggunakan tipe nilai) dan jumlah parameternya. Dan itu kerenK
hanya membungkusg
sehinggaBagian ekstra keren:
Ini mendefinisikan
^
operator untuk diterapkan ke fungsi. SehinggaK^s(2)(X)
sama sepertiK(K(X))
jadiH
hanya meneleponK
padaK
sekelompok kali - cukup kali untuk tentu runtuh setiap kasus bersarangIni bisa dilakukan jauh lebih singkat, tetapi cara ini sangat menyenangkan.
sumber
PowerShell v2 +, 81 byte
Mengambil input sebagai array eksplisit
$n
, membalikkannya$n[$n.count..0]
,-join
s elemen bersama dengan koma, kemudian regex-replace
pasangan digit yang cocok dengan elemen pertama, a*2
, dan dikelilingi dalam parens. Pipa yang menghasilkan (yang untuk input@(2,2,4,4)
akan terlihat seperti(4*2),(2*2)
) keiex
(kependekanInvoke-Expression
dan mirip denganeval
), yang mengubah perkalian menjadi angka aktual. Menyimpan array yang dihasilkan ke dalam$b
, merangkum bahwa dalam parens untuk meletakkannya di pipa, kemudian membalikkan$b
dengan[$b.count..0]
. Meninggalkan elemen yang dihasilkan pada pipa, dan output tersirat.Uji Kasus
NB - Dalam PowerShell, konsep "mengembalikan" sebuah array kosong tidak ada artinya - itu dikonversi menjadi
$null
begitu meninggalkan ruang lingkup - dan itu sama dengan mengembalikan apa-apa, yang dilakukan di sini pada contoh pertama (setelah beberapa kesalahan verbose jahat). Selain itu, output di sini dipisahkan dengan ruang, karena itulah pemisah default untuk array yang diketikkan.sumber
Javascript - 103 byte
sumber
[2,2,4,4]
hasil[2,2,4,4]
.Brain-Flak , 60 byte
Cobalah online!
Penjelasan:
sumber
Python 2, 94 byte
Cobalah online
sumber
Julia,
7382 BytesGunakan lipatan kanan untuk membuat daftar dari belakang ke depan (orang juga dapat menggunakan lipatan kiri dan membalikkan daftar di awal dan akhir).
Jika kepala daftar saat ini tidak sama dengan elemen berikutnya untuk ditambahkan sebelumnya, maka tambahkan saja.
Lain menghapus kepala daftar (terdengar agak kejam) dan menambahkan elemen kali 2.
Contoh
sumber
Racket 166 byte
Tidak Terkumpul:
Pengujian:
Keluaran:
sumber
Japt , 12 byte
Cobalah online!
Dibongkar & Cara kerjanya
Dapatkan beberapa ide dari solusi Jelly Jonathan Allan's .
sumber
Mathematica, 51 byte
{Longest@a___,x_/;x>0,x_,b___}
mencocokkan daftar yang berisi dua angka positif identik berurutan dan mengubah dua angka menjadi-2x
.Longest
memaksa pertandingan terjadi selambat mungkin.Proses ini digambarkan langkah demi langkah:
sumber
Vim, 28 byte
G@='?\v(\d+)\n\1<C-@>DJ@"<C-A>-@=<C-@>'<CR>
Makro yang regex mencari mundur untuk pencocokan angka berurutan, dan menambahkannya bersama-sama.
Array input harus satu angka per baris. Format ini menyelamatkan saya pukulan, yang bagus, tetapi alasan sebenarnya adalah untuk bekerja di sekitar pertandingan regex yang tumpang tindih. Diberikan string
222
, jika Anda/22
hanya akan cocok dengan pasangan pertama, bukan pasangan kedua yang tumpang tindih. Aturan tumpang tindih berbeda ketika kedua pasangan mulai pada garis yang berbeda. Dalam tantangan ini[2, 2, 2]
menjadi[2, 4]
, jadi mencocokkan pasangan yang tumpang tindih sangat penting.CATATAN: Tantangan hanya meminta satu pass. Untuk alasan itu, Anda harus memilikinya
:set nowrapscan
. Dengan:set wrapscan
saya bisa membuat versi yang menyelesaikan pekerjaan pada beberapa lintasan, meskipun solusi ini sebagai tertulis tidak akan selalu melakukan itu.<C-@>
: Biasanya, di baris perintah, untuk mengetik literal<CR>
tanpa menjalankan perintah, Anda harus menghindarinya<C-V>
. Tapi Anda bisa mengetik tidak<C-@>
terhapus dan itu akan diperlakukan sebagai<C-J>
/<NL>
, yang akan seperti<CR>
ketika Anda menjalankan makro tetapi tidak saat Anda mengetik. Coba baca:help NL-used-for-Nul
.@=
: Saya tidak bisa menggunakan makro yang direkam dengan mudah kali ini karena ada kemungkinan input mungkin tidak memiliki pasangan yang cocok. Jika itu terjadi saat menjalankan makro, pencarian yang gagal akan gagal makro. Tetapi jika itu terjadi selama pass perekaman (implisit pertama), sisa perintah mode normal akan berjalan, merusak file. Kelemahannya@=
adalah saya kehilangan satu byte pada panggilan rekursif; terkadang Anda dapat menggunakan@@
sebagai panggilan rekursif, tetapi itu akan berjalan@"
dari 4 byte sebelumnya dalam kasus ini.DJ@"<C-A>-
:DJ
menghapus baris dan memasukkan nomor (tidak ada baris baru) dalam register, jadi saya dapat menjalankannya sebagai makro untuk argumen nomor<C-A>
. Saya harus-
sesudahnya jadi saya tidak mendapatkan pertandingan kedua dalam kasus seperti[4, 2, 2]
.sumber
Perl6, 92 byte
sumber
Prolog (SWI) ,
9787 byteCobalah online!
sumber