Terinspirasi oleh, dan untuk mengenang, teman dan kolega saya yang terkasih,
Dan Baronet , 1956 - 2016. RIP
Dia menemukan solusi APL sesingkat mungkin untuk tugas ini:
Tugas
Diberikan daftar Boolean, hitung jumlah nilai kebenaran yang tertinggal.
Contoh kasus
{}
→ 0
{0}
→ 0
{1}
→ 1
{0, 1, 1, 0, 0}
→ 0
{1, 1, 1, 0, 1}
→ 1
{1, 1, 0, 1, 1}
→ 2
{0, 0, 1, 1, 1}
→ 3
{1, 1, 1, 1, 1, 1}
→ 6
01100
?Jawaban:
Dyalog APL,
62 byteUji di TryAPL .
Bagaimana itu bekerja
⊥ (uptack, dyadic: decode) melakukan konversi basis. Jika operan kiri adalah vektor, ia melakukan konversi basis campuran , yang sempurna untuk tugas ini.
Untuk vektor basis b = b n , ⋯, b 0 dan vektor digit a = a n , ⋯, a 0 , b ⊥ a mengonversi a ke basis campuran b , yaitu, menghitung b 0 ⋯ b n-1 a n + ⋯ + b 0 b 1 a 2 + b 0 a 1 + a 0 .
Sekarang, ⍨ (tilde dieresis , commute ) memodifikasi operator ke kiri sebagai berikut. Dalam konteks monadik, operator memanggil operator dengan argumen kiri dan kanan yang sama.
Misalnya, ⊥⍨ sebuah didefinisikan sebagai suatu ⊥ sebuah , yang menghitung sebuah 0 ⋯ sebuah n + ⋯ + a 0 a 1 a 2 + a 0 a 1 + a 0 , jumlah semua produk kumulatif dari kanan ke kiri .
Untuk k trailing, produk k paling kanan adalah 1 dan yang lainnya 0 , jadi jumlah mereka sama dengan k .
sumber
b⊥b
dan⊥⍨b
menyerah untuk mempercepat yang tak terbatas.JavaScript (ES6), 21 byte
Uji kasus
Tampilkan cuplikan kode
sumber
f(l)+1
mengembalikan nilai> 2
?l.pop()?(l.pop()?(l.pop()?(...etc...)+1:0)+1:0)+1:0
.Jelly , 4 byte
Cobalah online! atau Verifikasi semua kasus uji.
Untuk kasus di mana daftar kosong, ada beberapa pengamatan yang aneh. Pertama, run-length encoding daftar kosong
[]
mengembalikan daftar kosong lain[]
. Kemudian retreiving elemen terakhir dari yang menggunakan ekorṪ
kembali0
bukan pasangan[value, count]
yang merupakan elemen reguler dari array yang dikodekan run-length. Kemudian produkP
kembali0
ketika dipanggil0
yang merupakan hasil yang diharapkan.Penjelasan
sumber
ŒgṪS
bekerja juga!Ṫ
di Jelly diimplementasikan sebagai:lambda z: iterable(z).pop() if iterable(z) else 0
.iterable
ketika dipanggil pada daftar hanya mengembalikan daftar, dan daftar kosong ini tentu saja palsu.Brachylog ,
765 byteCobalah online!
Penjelasan
Sejak
@] - Suffix
mulai dari sufiks terbesar hingga yang terkecil, ia akan menemukan jangka waktu terpanjang pertama.sumber
CJam (8 byte)
Test suite online
Pembedahan
sumber
Haskell,
2625 bytePemakaian:
Versi pointfree (26 byte):
Menggunakan daftar integer alih-alih daftar bool (21 byte, terima kasih kepada Christian Sievers):
Pemakaian:
Versi pointfree (25 byte)
sumber
foldl
ide tersebut bekerja dengana%b=b*(a+1)
Retina ,
75 byteCobalah online! (Baris pertama memungkinkan suite tes yang dipisahkan dengan linefeed.)
Menentukan format input untuk Retina tidak sepenuhnya ambigu. Karena Retina tidak memiliki konsep jenis apa pun kecuali string (dan juga tidak ada nilai yang dapat digunakan untuk definisi biasa kita tentang kebenaran dan kepalsuan), saya biasanya menggunakan
0
dan1
(atau sesuatu yang positif secara umum) untuk berhubungan dengan kebenaran dan kepalsuan, karena mereka mewakili nol atau beberapa pertandingan, masing-masing.Dengan representasi karakter tunggal, kita juga tidak memerlukan pemisah untuk daftar (yang sedikit banyak, lebih banyak representasi daftar alami untuk bahasa yang hanya memiliki string). Adm mengkonfirmasi bahwa ini adalah format input yang dapat diterima.
Adapun regex itu sendiri, itu cocok dari
r
ight ke kiri dan\G
jangkar setiap pertandingan ke yang sebelumnya. Oleh karena itu, ini menghitung berapa banyak yang1
dapat kita cocokkan dari akhir string.sumber
05AB1E ,
121065 byteDisimpan 1 byte berkat carusocomputing .
Cobalah online!
Penjelasan
sumber
0¡¤g
adalah empat byte.J0¡¤g
juga masih lebih pendek;).Î
menangani input yang kosong, tetapi masih byte yang disimpan, terima kasih :)Python, 31 byte
sumber
Jelly , 4 byte
TryItOnline! , atau semua tes
Bagaimana?
sumber
MATL , 4 byte
Cobalah online!
sumber
Mathematica,
2524 bytesumber
FromDigits[b=Boole@#,MixedRadix@b]&
(35 byte).Pyth, 6 byte
Coba di sini!
Menambahkan 0, membalikkan dan menemukan indeks 0 pertama
sumber
C90 (gcc), 46 byte
Input melalui argumen baris perintah (satu integer per argumen), output melalui kode keluar .
Cobalah online!
Bagaimana itu bekerja
r adalah variabel global. Jenisnya default ke int dan, karena bersifat global, nilainya default ke 0 .
Argumen fungsi c juga default untuk int . Ini akan menyimpan integer n +1 untuk array n Boolean; argumen pertama dari utama adalah selalu path dari executable.
Argumen fungsi v dinyatakan sebagai
int**
. Jenis sebenarnya dari v adalahchar**
, tetapi karena kita hanya akan memeriksa bit paling tidak signifikan dari setiap argumen untuk memberi tahu karakter 0 (titik kode 48 ) dan 1 (titik kode 49 ), ini tidak akan berpengaruh pada little-endian mesin.Loop sementara menurunkan c dan membandingkannya dengan 0 . Setelah c mencapai 0 , kami akan keluar dari loop. Ini diperlukan hanya jika array mengandung no 0 's.
Selama
0<--c
pengembalian 1 , kita mengambil c th argumen baris perintah (v[c]
) dan ekstrak karakter pertama dengan oleh dereferencing pointer (*
). Kami mengambil bitwise AND dari Boolean0<--c
dan titik kode karakter (dan tiga byte sampah yang mengikutinya), sehingga kondisinya akan mengembalikan 0 sekali 0 ditemui, keluar dari loop.Dalam kasus yang tersisa, sedangkan argumen baris perintah adalah 1 ,
r++
bertambah r dengan 1 , sehingga menghitung jumlah trailing 1 's.Akhirnya,
c=r
simpan nilai yang dihitung dari r in c . Dengan pengaturan default, kompiler mengoptimalkan dan menghapus tugas; sebenarnya menghasilkanmovl %eax, -4(%rbp)
instruksi. Karenaret
mengembalikan nilai register EAX, ini menghasilkan output yang diinginkan.Perhatikan bahwa kode ini tidak berfungsi dengan C99, yang mengembalikan 0 dari main jika akhir main tercapai.
sumber
argc
setidaknya1
(argv[0]
berisi nama file)? Anda dapat menyimpan satu byte dengan--c&&
alih - alih0<--c&
. kode keluar gcc diambil dariargc
? Rapi.*v[c]
adalah titik kode 1 atau 0 , jadi 49 atau 48 dan karenanya selalu benar.k, 6 byte
Komposisi fungsi ini diterjemahkan ke
sum mins reverse
dalamq
, saudara lebih mudah dibaca bahasa, di mana menit adalah minimum bergulir.sumber
J,
93 byteIni adalah konversi basis campuran refleksif. Karena ini sama dengan konversi basis campuran. Lagi.
Uji kasus
sumber
R,
40 3925 byteSolusi yang sepenuhnya dikerjakan ulang berkat @Dason
Baca input dari stdin, balikkan vektor dan jika elemen pertama adalah
!=0
output, panjang pertama dari run-length encoding (rle
), yang lain0
.sumber
ifelse(r$v,r$l,0)[1]
. (Vektor jika, dan kemudian ambil elemen pertama.)Haskell, 24 byte
Iterate atas daftar, tambahkan satu untuk setiap elemen, ulang ke
0
setelah itu hits aFalse
.16 byte dengan 0/1 input:
Jika daftar dijamin tidak kosong, kami bisa mendapatkan 14 byte:
Ini menghitung produk kumulatif dari belakang, lalu menjumlahkannya. Produk kumulatif tetap 1 hingga 0 terkena, dan kemudian menjadi 0. Jadi, 1 sesuai dengan tertinggal 1.
sumber
Pyke,
106 byteCoba di sini!
sumber
C # 6,
10372 byteMenggunakan daftar non-generik, ketuk daftar generik sebanyak 1 byte lol
-31 byte terima kasih kepada Scott
sumber
int
s, Anda dapat menggunakanint a(int[] l)=>l.Reverse().TakeWhile(i=>i>0).Sum();
Func<bool[], int>
57 byte yaituusing System.Linq;l=>l.Reverse().TakeWhile(x=>x).Count();
Python, 37 byte
sumber
DASH , 16 byte
Ini bukan solusi DASH terpendek yang mungkin, tetapi solusi DASH terpendek yang mungkin mengganggu saya. Saya memposting pendekatan novel ini sebagai gantinya.
Pemakaian:
Penjelasan
sumber
Scala, 25 byte
Tidak Disatukan:
Membalik daftar, menambahkan 0 dan menemukan indeks pertama 0, yang merupakan jumlah elemen sebelum 0 pertama
sumber
Batch, 57 byte
Mengambil input sebagai parameter baris perintah. Bekerja dengan mengalikan akumulator dengan nilai saat ini sebelum menambahkannya, sehingga nol di baris perintah mereset hitungan. Perhatikan bahwa
%%n
tidak sama dengan variabeln
atau%n%
.sumber
GolfSharp, 14 byte
sumber
Java 7, 62 byte
Tidak digabungkan & kode uji:
Coba di sini.
Keluaran:
sumber
Perl 5.10, 22 byte
21 byte + 1 byte untuk
-a
flag. Sejak ekspresi berbasis regex dilakukan ...: halNilai input untuk array harus dipisahkan oleh spasi.
Cobalah online!
sumber
perl -E '$_++while pop;say' 0 1 1 0 1 1 1
tapi ini tidak menghasilkan apa pun untuk0
(meskipun tidak yakin apakah itu masalah!)Perl, 22 byte
21 byte kode + 1 byte untuk
-p
flag.Untuk menjalankannya:
(Sebenarnya, format input tidak peduli banyak:
0110111
,0 1 1 0 1 1 1
,[0,1,1,0,1,1,1]
dll akan semua pekerjaan)Versi 18 bytes dari @Dom Hastings tetapi harus memasok input sebagai string 0 dan 1, yang tidak diizinkan:
sumber
;
trik itu :) Jika format adalah satu string berkelanjutan:perl -pE '/1*$/;$_=length$&' <<< '0110111'
untuk 18, tidak yakin apakah itu membengkokkan aturan atau tidak ...PHP, 50 byte
Anehnya percobaan pertama saya dengan regex ternyata lebih pendek daripada percobaan saya dengan array ...
Gunakan seperti:
sumber
Ruby
3732 byteMembuat fungsi anonim yang menemukan instance paling kanan dari nilai palsu, dan menghitung ukuran subarray mulai dari nilai itu.
Ini digunakan
!0
sebagai salah, karena 0 adalah nilai kebenaran di Ruby.rindex
menemukan indeks terakhir dari nilai dalam array.Penggunaan :
Pengembalian 1
Jika saya diizinkan untuk melewatkan string 0s dan 1s sebagai parameter baris perintah (yang bukan bagaimana ruby mewakili daftar booleans), saya bisa menurunkannya menjadi 24:
Ini menggunakan ekspresi reguler dan mencetak panjang string yang dikembalikan oleh ekspresi reguler
/(1*)\z/
, di mana\z
ujung string.$*[0]
adalah argumen pertama yang diloloskan dan merupakan string 0s dan 1s.Pemakaian:
Pengembalian 1.
sumber