Temukan run terpanjang dari true dalam daftar boolean. Kembalikan daftar yang sama, dengan semua trues lainnya dipalsukan.
Input output
Sebuah daftar; format biasa (mis., daftar terbatas sebagai string).
Detail
Benar dan salah dapat berupa apa saja yang bahasa Anda biasanya gunakan untuk nilai-nilai itu, atau bilangan bulat 1 dan 0. Jika Anda menggunakan karakter tunggal, daftar dapat berupa gabungan (misalnya, 10001
).
Jika ada dasi untuk jangka waktu terpanjang, jaga agar semua ikatan berjalan benar, dan palsukan semua lari lebih pendek.
Contohnya
input ↦ output
1,0,1,0,1 ↦ 1,0,1,0,1
1,1,0,1,1,0,1 ↦ 1,1,0,1,1,0,0
1,1,0,1,1,1,0,1,1 ↦ 0,0,0,1,1,1,0,0,0
1,1,1 ↦ 1,1,1
0,0,1 ↦ 0,0,1
0,0 ↦ 0,0
1,1,1,0,0,0,1,1,1,1,0,1,0,0,1,1,0,1,1,1,1,0,0,1,0 ↦ 0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0
(langsung dari https://stackoverflow.com/q/37447114 )
code-golf
array-manipulation
msh210
sumber
sumber
Haskell,
59,58,55, 64 byteCatatan menyenangkan, ini berfungsi pada daftar nilai mana pun di mana
falsy < truthy
. JadiFalse/True
,0/1
,'f'/'t'
, dllcatatan:
Seperti yang ditunjukkan oleh beberapa orang (termasuk
@proud haskeller
dan@nimi
), versi sebelumnya gagal pada daftar semua nilai falsy. Penambahan.([1<2]:)
telah memperbaiki ini, seperti yang disarankan oleh@proud haskeller
. Saya meninggalkan penjelasan yang sama untuk saat ini, karena saya pikir itu masih masuk akal. Jika ada yang berkomentar, meminta penjelasan tentang hasil edit, saya akan mengedit.Penjelasan:
Saya akan desugar pertama tanpa
group
, dan kemudian menambahkannya kembali. Pertama, saya menemukan bahwa kata-kata seringkali lebih mudah di mata daripada simbol, jadi saya akan membuat beberapa pergantian. (Perhatikan bahwa=<<
'berkelas' sehingga berlaku berbeda untuk daftar dan fungsi. Saya memanggilbind
versi=<<
untuk fungsi.)Rincian terakhir adalah yang
x <$ list
mengganti setiap elemenlist
denganx
dangroup list
membagi bagianlist
-bagiannya menjadi potongan-potongan elemen yang sama. Jadigroup [1, 1, 2, 3, 3, 3] == [[1, 1], [2], [3, 3, 3]]
.Singkatnya, fungsi membagi daftar nilai menjadi kelompok hanya benar dan kelompok hanya salah. Kemudian untuk setiap grup, ganti setiap elemen dengan hasil pernyataan
this is the biggest group
(grup terbesartrue
akan menjadi yang terbesar) dan gabungkan grup.Empat byte disimpan oleh
@Zgarb
sumber
(\y->(maximum g==y)<$y)
dengan((<$)=<<(==maximum g))
. Saya belum mengujinya.f
dengan fungsi point-free((=<<)=<<(=<<)(<$).(==).maximum).group
. Menghemat tiga byte dan benar-benar tidak dapat dibaca!b=(=<<);b b(b(<$).(==).maximum).group
masih satu byte lebih pendek. Saya belum pernah melihat yang seperti ini sebelumnya di Haskell golf :)(:[t])
sebelum maksimum atau sesuatu yang serupaRetina,
474336Cobalah online! atau coba semua test case
Berkat msh210 untuk bermain golf 4 byte!
Juga terima kasih sebesar-besarnya kepada Martin untuk 7 byte!
Penjelasan:
Ganti semua
0
dengan!
s. Hal ini dilakukan untuk membuat grup yang cocok1
lebih pendek, seperti sekarang1!
dan!1
akan memiliki batas kata (\b
) di antara mereka, yang juga cocok dengan awal atau akhir string.Ini adalah opsi konfigurasi yang mengatakan bahwa setelah menerapkan regex setelah backtick ke input, dalam setiap pertandingan, terjemahkan setiap karakter ascii yang dapat dicetak menjadi sebuah
0
karakter.Regex ini cocok dengan grup dari
1
s yang dikelilingi oleh nol, tetapi tidak dapat mencocokkan1
diikuti oleh dirinya sendiri di mana saja di string. Ini adalah kelompok non-maksimal yang akan dipalsukan. Selain itu, ini juga cocok dengan!
karakter yang kami tambahkan untuk mengubahnya kembali menjadi0
.sumber
MATL, 14 byte
Cobalah secara Online!
Versi modifikasi dengan semua kasus uji
Penjelasan
sumber
Python 2, 62 byte
Cobalah Ideone .
Bagaimana itu bekerja
s.split('0')
memisahkan string input s menjadi nol atau lebih 1 'sUntuk setiap t yang dijalankan , kami memeriksa apakah
t+'1'
substring dari s .Jika ya, prosesnya tidak maksimal,
t+'1'in s
kembalikan True ,1-(t+'1'in s)
kembalikan 1 - True = 0 dan jalankan diganti dengan proses 0 dengan panjang yang sama.Jika tidak, jalankan maksimal,
t+'1'in s
kembalikan False ,1-(t+'1'in s)
kembalikan 1 - False = 1 dan jalankan digantikan dengan proses 1 dengan panjang yang sama, yaitu dengan sendirinya.Akhirnya,
'0'.join
pulihkan semua 0 yang dihapus .sumber
J, 25 byte
Ini adalah kata kerja monadik yang mengambil dan mengembalikan array 0-1. Gunakan seperti ini:
Penjelasan
sumber
;.
.Pyth,
26242321 byteSuite uji.
1/0
atautrue/false
input.true/false
dalam output.Penjelasan
23 byte sebelumnya
Suite uji.
1/0
atautrue/false
input.1/0
dalam output.24 byte sebelumnya
Suite uji.
1/0
atautrue/false
input.1/0
dalam output.26 byte sebelumnya
Suite uji.
1/0
atautrue/false
input.1/0
dalam output.sumber
Jr.b,N&YNrQ8)9qReSJJ
atauJrm,hd*FdrQ8 9qReSJJ
. Kedua versi menghemat satu byte. Atau menjadi lebih gila denganJrXR1*FdrQ8 9qReSJJ
dan menyimpan dua. ;-)Oracle SQL 12.1,
137135 byteTidak bermain golf
Input menggunakan karakter tunggal. Mis: '1100111'
sumber
Mathematica ,
4641Bekerja pada daftar
0
dan1
. Saya pikir saya telah melakukan cukup baik sampai saya melihat jawaban yang lain!Penjelasan untuk versi 46 karakter; Saya akan memperbarui ketika saya tidak bisa memperbaikinya lebih lanjut.
Penjelasan tentang kode ini diminta.
Setara non-kode-golf (menggunakan formulir operator versi 10) adalah:
Ini berarti suatu fungsi yang terdiri dari lima langkah (sub-fungsi) yang diterapkan secara berurutan dari atas ke bawah.
Split
: pecah menjadi elemen-elemen identik yang identik: {1,1,0,1,1,0,1} ↦ {{1,1}, {0}, {1,1}, {0,0}}Map[# Tr@# &]
: Untuk setiap sub-daftar (Map
) kalikan (#
) dengan jumlahnya (jejak vektor,Tr
): {1,1} ↦ {2, 2}# - Max[1, #] &
kurangi dari setiap elemen nilai maksimum yang muncul di mana saja dalam daftar daftar, atau satu, yang mana yang lebih tinggi. (Yang menangani kasus semua nol.)UnitStep
: sama dengan 0 untuk x <0 dan 1 untuk x> = 0, diterapkan ke setiap elemen.Apply[Join]
: gabungkan sub-daftar menjadi satu daftar. Bisa juga dilakukan denganFlatten
atauCatenate
, tetapi dalam bentukJoin@@
singkat lebih singkat.sumber
C,
135129 byteCoba Online
Tidak disatukan
sumber
JavaScript (ES6), 56 byte
Bekerja dengan memeriksa semua run 1s dan mengganti karakter dengan 0s kecuali jika run (sama) terpanjang, yang diukur dengan mencari string untuk run yang lebih lama dari 1s.
Solusi rekursif 72 byte sebelumnya:
Tidak melakukan apa-apa jika tidak ada run 1s (yaitu paling banyak single 1s). Jika tidak, kurangi satu
1
dari masing1
- masing atau jalankan, kemudian panggilan itu sendiri secara rekursif pada berjalan yang lebih pendek, kemudian tambahkan satu1
kembali pada berjalan (sekarang sama-sama terpanjang). Jumlah panggilan rekursif adalah kurang dari satu jangka waktu terpanjang.sumber
Julia, 51 byte
Cobalah online!
Bagaimana itu bekerja
replace
menemukan semua semua berjalan dari satu atau lebih 1 's di input string s melalui regexr"1+"
dan memanggil lambdat->map(c->c-contains(s,"1"t),t)
untuk menentukan string pengganti.Lambda memetakan
c->c-contains(s,"1"t)
semua karakter dalam t yang dijalankan .Jika
"1"t
(gabungan) adalah substring dari s , proses tidak maksimal,contains
mengembalikan true danc-contains(s,"1"t)
mengembalikan '1' - true = '0' , mengganti semua 1 dalam jalankan itu dengan 0 's.Jika
"1"t
(gabungan) bukan substring dari s , prosesnya adalah maksimal,contains
mengembalikan false danc-contains(s,"1"t)
mengembalikan '1' - false = '1' , meninggalkan proses yang tidak dimodifikasi.sumber
APL, 22 karakter
Dalam bahasa Inggris (dari kanan ke kiri dalam blok):
sumber
Java 8, 205 byte
Ini adalah ungkapan lambda untuk
Function<String,String>
:input / output adalah a
String
mana true diwakili oleh 1 dan false diwakili oleh 0. Tidak ada karakter pembatas yang memisahkan nilai.kode dengan penjelasan:
lihat ideone untuk test case
sumber
Clojure, 137 byte
Pertama, partisi input menjadi nol berturut-turut dan yang satu dan memetakan ini menjadi "tuple" elemen pertama partisi dan jumlah elemen. Itu kemudian mengulangi jumlah nol yang diperlukan atau yang, tergantung apakah ini adalah urutan maksimum panjang atau tidak.
Kurang bermain golf:
sumber
Perl 5, 68 byte
67, ditambah 1 untuk
-pe
bukan-e
Mengharapkan dan mencetak string (gabungan) dari 0s dan 1s.
sumber