Angka-angka unary biasanya hanya mewakili bilangan bulat non-negatif, tetapi kita dapat memperluasnya untuk mewakili semua bilangan bulat sebagai berikut:
- Bilangan bulat positif N direpresentasikan sebagai N
1
:5 -> 11111
- Integer negatif -N direpresentasikan sebagai
0
diikuti oleh N1
's:-5 -> 011111
- Nol direpresentasikan sebagai
0
Kami kemudian dapat mewakili daftar angka-angka ini dengan jelas jika kami gunakan 0
sebagai pemisah:
3,-2,0,1
111,011,0,1
111 0 011 0 0 0 1
11100110001
Tugas Anda: ambil string yang mewakili daftar nomor yang belum ditandatangani, dan terjemahkan ke dalam daftar angka desimal.
Detail
Anda dapat berasumsi bahwa input adalah daftar lengkap nomor unary yang ditandatangani. Secara khusus, program Anda tidak perlu menangani 1) input kosong atau 2) input yang berakhir dengan pemisah.
Anda dapat mengasumsikan bahwa besarnya setiap angka tidak akan melebihi 127. Untuk bahasa dengan ukuran string atau daftar maksimum, Anda dapat mengasumsikan bahwa input dan output akan sesuai dengan struktur data bahasa Anda, tetapi algoritma Anda secara teoritis harus bekerja untuk daftar ukuran apapun.
Program atau fungsi Anda dapat melakukan I / O dengan salah satu cara standar . Input dapat berupa string atau daftar karakter, string karakter tunggal, bilangan bulat, atau boolean. Anda dapat menggunakan dua karakter apa saja untuk mewakili 1
dan 0
; jika Anda tidak menggunakan 1
dan 0
, tentukan karakter yang Anda gunakan.
Output harus angka desimal dalam format daftar yang masuk akal (khususnya, harus ada semacam pemisah antara angka). Angka negatif harus ditunjukkan dengan tanda minus, meskipun jika bahasa Anda memiliki format berbeda untuk bilangan bulat negatif, saya juga akan menerimanya. Nol dapat direpresentasikan dalam output sebagai 0
atau -0
.
Uji kasus
1 -> 1
0 -> 0 (or -0, and similarly for the other test cases)
011 -> -2
1101 -> 2,1
1100 -> 2,0
11001 -> 2,-1
110001 -> 2,0,1
11100110001 -> 3,-2,0,1
00000001 -> 0,0,0,-1
01111011111111001111111111111110111111111111111100111111111111111111111110111111111111111111111111111111111111111111 -> -4,8,-15,16,-23,42
01111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 -> -127
'0's
, itu secara teknis tidak unary. Tantangan bagus!0
) dan awalan tanda negatif (0
) adalah sama, meskipun masih tidak ambigu, karena Anda tidak dapat memiliki tanda-tanda negatif di tengah-tengah angka (apakah182--693-1
angka? Tidak, dan tidak ada1111011000101111
untuk alasan yang sama persis).Jawaban:
Python 2 ,
7370 byteFungsi yang mengambil string sebagai input dan mengembalikan representasi string dari daftar Python. Nol dapat direpresentasikan baik oleh
0
dan-0
(saat datang terakhir):Penjelasan
split
string inputs
pada nol.map
).Itu membawa kita jauh. Nol adalah pemisah. Dan jumlahnya tidak jelas, sehingga
len
mudah dikonversi menjadi desimal. Tapi sekarang kami telah mengacaukan semua penggunaan non-separator0
. Untungnya, semua penggunaan non-pemisah memimpin nol sehingga mereka datang setelah pemisah-nol dan memberi kami string panjang nol ('00'.split('0') == ['', '', '']
). String nol-panjang itu kemudian juga menjadi0
karenalen
.replace
setiap nol yang mendahului nomor lain dengan tanda negatif pada nomor itu sebagai gantinya. Itu memperbaiki penggunaan0
sebagai tanda tetapi itu menghancurkan nol harfiah. Nol literal juga didahului oleh pemisah, jadi mereka sekarang menjadi pasangan tanda hubung ekstra pada nomor berikutnya.replace
masing-masing--
kembali menjadi0
elemen dalam "daftar".sumber
Retina ,
2321 byteCobalah online!
Tahap pertama
(.)0<newline>$1<space>
cocok dengan karakter apa pun yang diikuti oleh a0
. Pertandingan digantikan oleh karakter pertama diikuti oleh spasi. Ini membagi string dalam angka individual.Tahap kedua
01<newline>-1
menggantikan0
's sebelum blok1
' s ke-
tanda.Tahap terakhir
1+<newline>$.&
cocok dengan semua blok1
's dan menggantinya dengan panjang grup.Berikut ini adalah contoh dengan output dari setiap tahapan.
sumber
Vim, 56 byte
Cobalah online!
Saya belum memposting di vim untuk sementara waktu. Saya kebanyakan menggunakan vim karena V kadang terasa menyakitkan. Karena
count
perintah, yang sempurna untuk mendapatkan angka '1 di telepon akan menimpa angka' 0 di telepon, jadi kita tidak bisa meniadakannya setelah itu.Penjelasan:
Ini adalah satu byte lebih pendek daripada cara langsung:
karena perintah chaining. Karena yang memisahkan perintah, saya akan menggunakannya untuk penjelasan.
Sekarang, setiap nomor unary yang ditandatangani ada pada satu baris. Menggunakan '11100110001' sebagai contoh, pada titik ini kita akan memiliki:
Karena kami menambahkan baris baru di akhir setiap pertandingan, kami memiliki garis kosong sebelum menjalankannya. Setelah menjalankan itu, kita akan memiliki '0' (karena cocok dengan menjalankan 0 '1). Jadi kami hanya menelepon
D
untuk menghapus baris ini, membiarkannya kosongsumber
:%s/1+$/
akan membuat Anda satu byte lebih pendek jika bukan karena kebutuhan untuk backslash+
:(-
bukannya0
atau-0
Haskell ,
6866 byteCobalah online! Mengambil input sebagai daftar nol dan satu. Contoh penggunaan:
f [0,0,0,1,1]
hasil[0,-2]
.Penjelasan:
Pola yang cocok di dalam
f(x:r)|(a,b)<-span(>0)r
mengikatx
elemen pertama input,a
ke daftar (berpotensi kosong) dari1
s berikut , danb
ke seluruh input. Diberikan input[0,1,1,1,0,0,1]
, kita dapatkanx=0
,a=[1,1,1]
danb=[0,0,1]
.Angka saat ini adalah jumlah dari
a
negasi jikax=0
, atau jumlaha
plus satu jikax=1
. Hal ini dicapai dengan mengindeks denganx
menjadi daftar yang berisi negasi dan peningkatan fungsi, dan menerapkan fungsi yang dihasilkan dengan jumlah daria
:[(0-),(1+)]!!x$sum a
.Daftar sisanya
b
kosong atau berisi nol yang memisahkan dan nomor berikutnya. Pemahaman daftar[z|_:t<-[b],z<-f t]
mencoba untuk mencocokkanb
pada pola_:t
, yaitu melupakan elemen kepala dan mengikat sisa daftart
. Jikab
kosong, kecocokan ini gagal dan pemahaman daftar akan dievaluasi[]
, yang merupakan kasus dasar untuk rekursi. Kalau tidak, fungsif
ini diterapkan secara rekursift
dan pemahaman daftar mengevaluasi semua elemenz
dari hasilf t
.sumber
Bahasa Wolfram (Mathematica) , 80 byte
Cobalah online!
Menyalahgunakan mekanisme
StringCases
, karena tidak memeriksa pola yang tumpang tindih. Karena kita mencari dari kiri ke kanan, tanpa tumpang tindih, kita selalu mendapatkan hanya bilangan bulat yang kita butuhkan.Penjelasan
Tambahkan nol di bagian akhir
Temukan semua pola berikut ...
Satu karakter (sebut saja
x
), diikuti oleh senar nol panjang atau terpanjang yang mungkin (sebut sajay
), diikuti oleh nol.Berlaku untuk pola yang cocok: ambil panjangnya
y
. Jikax
nol, maka negasikan nilainya. Lain, tambah satu.Ini mencakup
00
juga, karenay
akan menjadi string kosong, dan kami akan menghitung-0
(== 0
).sumber
Brain-Flak , 94 (70?) Byte
Cobalah online!
Ini sebenarnya sangat singkat untuk brain-flak.
Ini adalah versi yang dikomentari / dibaca:
Jika hasilnya bisa terbalik, kita bisa melakukan ini untuk 70 sebagai gantinya:
Tip saya ini hampir sempurna untuk situasi ini. Tapi itu tidak berhasil karena kita harus menekan 0 sebelum melakukan operasi (menghitung '1), dan operasi terjadi dalam satu lingkaran. Cara terpendek yang dapat saya lakukan untuk menggunakan tip ini adalah:
yang juga 94 byte.
sumber
Perl 5 , 40 + 1 (
-n
) = 41 byteCobalah online!
sumber
Sekam ,
20 18 17 1514 byteCobalah online!
Penjelasan
Pemisahannya bekerja seperti ini.
ġ/
memecah argumennya antara setiap pasangan elemena,b
yang/a b
palsu./a b
adalah pembagian dengan argumen terbalik, sehinggab
dibagi dengana
. Nilai yang relevan dalam program ini adalah:/1 1
memberi1
(kebenaran)./1 0
memberi0
(falsy)./0 1
memberiInf
(infinity positif, kebenaran)./0 0
memberiAny
(nilai seperti-NaN khusus, falsy).sumber
Acc !! ,
252237 bytePenggunaan
-0
. Menghasilkan angka yang dipisahkan oleh karakter tab, dengan tab tambahan. Cobalah online!Jumlah waktu menulis algoritma yang sebenarnya: 20 menit. Jumlah waktu debugging kode output desimal saya: 45 menit. : ^ P
Dengan komentar
Saya tidak tahu apakah komentar-komentar ini menjelaskan kode dengan sangat baik - mereka didasarkan pada catatan saya untuk diri saya sendiri ketika saya sedang menulisnya, jadi mereka menganggap beberapa pemahaman tentang bagaimana Acc !! bekerja. Jika ada yang butuh penjelasan lebih lanjut, beri tahu saya dan saya akan mencoba membuatnya lebih jelas.
sumber
Python 2 ,
9692 byteCobalah online!
Thx to ovs dan DLosc untuk masing-masing 2 byte.
sumber
R , 119 byte
Cobalah online!
Kode menggunakan solusi ini dari stackoverflow untuk masalah terkait (Terima kasih kepada iri untuk idenya). Outputnya adalah string yang dipisahkan ruang yang dicetak ke stdout.
sumber
Jelly ,
1918 bytePasti ada cara yang lebih baik ...
Program lengkap mencetak setiap nomor diikuti dengan linefeed.
Cobalah online!
Bagaimana?
sumber
QBasic,
8886 byteIni sangat menyenangkan. Berbagai revisi yang dimulai dari versi 107-byte menghasilkan salah satu bit QBasic yang paling dikaburkan yang saya pikir pernah saya tulis. (Sunting: Anehnya, saya bisa bermain golf 2 byte dengan membuat kode lebih jelas.)
Catatan: program ini membaca input pengguna satu karakter pada satu waktu tanpa menggemakannya ke layar (hasil dari menggunakan
INPUT$(1)
bukanINPUT
pernyataan yang biasa ). Jadi saat Anda mengetik, Anda tidak akan melihat angka 1 dan 0, tetapi angka desimal akan muncul saat dihitung. Pastikan untuk menekan Enterdi akhir input untuk melihat nomor terakhir dan mengakhiri program.Versi tidak disatukan
Penjelasan
(AKA "Apa ?? Itu masih tidak masuk akal!")
Strategi dasarnya adalah menjalankan loop yang mengambil satu karakter dari
INPUT$(1)
setiap kali, melakukan hal-hal dengannya, dan terus mengulang selama karakter tersebut memiliki nilai ASCII lebih besar dari itu!
(yaitu, bukan baris baru).Kami melacak angka yang sedang berlangsung menggunakan dua variabel.
num
adalah jumlah karakter dalam nomor unary yang ditandatangani saat ini (termasuk nol di depannya).sign
adalah1
jika angka memiliki nol di depan,0
jika tidak. Kedua hal ini perlu diinisialisasi0
, yang bagus untuk versi golf karena variabel numerik dalam QBasic secara otomatis diinisialisasi0
.Setiap kali kita membaca karakter, hal pertama adalah menentukan apakah karakter itu
1
atau bukan0
. Kami akan menggunakan hasil ini dua kali, jadi kami menyimpannya diisZero
. Secara teknis, nama itu menyesatkan, karena nilainya juga akan benar jika karakternya adalah baris baru. Perhatikan bahwa kebenaran dalam QBasic adalah-1
dan falsey adalah0
.Sekarang, jika kita sedang membaca angka (
num > 0
) dan kami menekan nol atau akhir input (isZero
), kita perlu menghitung angka mana yang sudah kita baca.sign
menyimpan0
untuk positif,1
untuk negatif. Untuk mendapatkan1
positif dan-1
negatif, kita perlu1-2*sign
.num
menyimpan besaran yang benar untuk positif tetapi satu lebih dari besarnya untuk negatif (karena itu termasuk penanda tanda). Jadi bisa kita gunakannum-sign
untuk besarnya.Lipat gandakan dan cetak; kemudian reset
sign
dannum
untuk0
persiapan membaca nomor berikutnya.Kalau tidak (jika kita belum mencapai nol, atau jika kita sudah mencapai nol di awal angka), kami memperbarui
sign
dannum
sebagai berikut:sign
menjadi1
jika kita melihat nol di depan; jika tidak, jika kita melihat satu, itu tetap apa pun yang sudah ada. Kode golf adalahs=s-z
, yang sama dengan jumlah yang sama:z
adalah-1
. Karenas
dijamin0
(karena ini adalah awal dari nomor baru),s-z
akan menjadi1
.z
adalah0
. Kemudians-z
tetap pada nilai berapa puns
sebelumnya.num
bertambah.Itu dia!
sumber
JavaScript (ES6), 60 byte
Mengembalikan daftar bilangan bulat yang dipisahkan oleh ruang.
Uji kasus
Tampilkan cuplikan kode
sumber
Lua , 58 byte
Cobalah online!
Program penuh, mengambil input dari baris perintah dan mencetak angka ke stdout dipisahkan oleh baris baru.
sumber