"Nomor yang Cocok"
Sam punya ide "brilian" untuk kompresi! Dapatkah kamu menolong?
Berikut ini adalah ikhtisar skema kompresi Sam. Pertama, ambil representasi basis 10 dari bilangan asli mana pun yang benar-benar lebih kecil dari 2 ^ 16, dan tulislah sebagai string biner tanpa nol di depan.
1 -> 1 9 -> 1001 15 -> 1111 13 -> 1101 16 -> 10.000 17 -> 10001 65535 -> 111111111111111
Sekarang ganti grup mana pun dari satu nol atau lebih dengan nol tunggal. Ini karena jumlahnya semakin ramping. String biner Anda sekarang akan terlihat seperti ini.
1 -> 1 -> 1 9 -> 1001 -> 101 15 -> 1111 -> 1111 13 -> 1101 -> 1101 16 -> 10.000 -> 10 17 -> 10001 -> 101 65535 -> 111111111111111 -> 111111111111111
Sekarang Anda mengonversi string biner kembali ke representasi basis 10, dan mengeluarkannya dalam format apa pun yang dapat diterima. Berikut ini adalah kasus pengujian Anda. Integer pertama mewakili input, dan integer terakhir mewakili output. Perhatikan bahwa beberapa angka tidak berubah, dan dengan demikian dapat disebut "cocok"
1 -> 1 -> 1 -> 1 9 -> 1001 -> 101 -> 5 15 -> 1111 -> 1111 -> 15 13 -> 1101 -> 1101 -> 13 16 -> 10.000 -> 10 -> 2 17 -> 10001 -> 101 -> 5 65535 -> 1111111111111111 -> 1111111111111111 -> 65535 65000 -> 1111110111101000 -> 11111101111010 -> 16250
Anda dapat menggunakan bahasa apa pun, tetapi harap dicatat bahwa Sam membenci celah standar. Ini adalah kode golf sehingga kode dapat sesingkat mungkin untuk memberikan ruang bagi angka "terkompresi".
Catatan: Ini BUKAN skema kompresi yang dapat diterima. Menggunakan ini akan segera membuat Anda dipecat.
Citation-Needed: Saya tidak menerima pujian untuk konsep ini. Ini berasal dari blog @Conor O 'Brien di sini lihat OEIS nomor yang pas ini. https://oeis.org/A090078
10000
?Jawaban:
05AB1E ,
86 bytePenjelasan
Cobalah online
Disimpan 2 byte berkat Adnan
sumber
„00'0
dengan00¬
:).Utilitas Bash + GNU, 27
Masukan dibaca dari STDIN.
sumber
dc
:)JavaScript (ES6), 41 byte
sumber
Ubur-ubur , 20 byte
Cobalah online!
Penjelasan
i
adalah input.b
mengubahnya menjadi biner (daftar angka)\d
dengan argumen2
dan daftar digit berlakud
(binary digit ke nomor) untuk setiap panjang-2 substring dari daftar digit.*
mengambil signum dari hasil: 00 pergi ke 0, yang lainnya ke 1.,1
paku 1 sampai akhir, sehingga digit terakhir tidak hilang.# S
menyeleksi daribi
mereka digit yang memiliki 1 pada daftar dihitung di atas: mereka yang tidak belahan kiri 00.d
mengkonversi kembali ke angka, danp
mencetak hasilnya.sumber
Python 2, 36 byte
Implementasi rekursif langsung tanpa built-in konversi atau operasi string. Kurang bermain golf:
Ketika
n
kelipatan dari 4, itu berakhir dengan dua 0 dalam biner, jadi kami memotong satu dengan pembagi-lantai dengan 2. Jika tidak, kita membaginyan
menjadi(n%2) + 2*(n/2)
, meninggalkan digit biner terakhirn%2
sendirian, dan berulang pada digit lainnyan/2
.sumber
n%2
berlebihan?|n
memberi hasil yang salah.(n%4>0)|n%2
dengan(n%4>0)
.(f(n/2)<<(n%4>0)) | n%2
.Bash (sed + bc),
605543 byteedit:
sed -E 's/0+
menjadised 's/00*
dan mengubah gema dan pipa yang digunakan untuk meneruskan nilai ke bc dengan<<<
.contoh:
sumber
echo "obase=2;$1"|bc|sed 's/00*/0/g;s/^/ibase=2;/'|bc
lebih pendek 2 byteecho $[2#`bc<<<obase=2\;$1|sed s/00\*/0/g`]
. Tapidc
dantr
membuatnya jauh lebih pendek .bc<<<"obase=2;$1"|sed 's/00*/0/g;s/^/ibase=2;/'|bc
tr -s 0
alih-alih sed Anda bisa turun ke 36 bytePerl 6 ,
3127 bytePenjelasan:
Contoh:
sumber
MATL,
1198 byteVersi ini hanya berfungsi di MATLAB karena
strrep
di MATLAB dapat menangani input logis. Berikut adalah versi yang akan bekerja dalam Oktaf (9 byte) (dan dengan demikian penerjemah online) yang secara eksplisit melemparkan input logis untuk diketikdouble
.Cobalah online
Penjelasan
sumber
Python 3,
55, 50 byte.Disimpan 4 byte berkat Sp3000.
Solusi yang sangat mudah.
sumber
0b
daneval
sebaliknya?lambda x:eval(re.sub('0+','0',bin(x))) <insert newline here> import re
Javascript (ES6), 40 byte
sumber
console.log(+('0b'+parseInt(process.argv[1]).toString(2).replace(/0+/g,0)))
.N=>
yang akan membuatnya menjadi penyerahan fungsi yang valid.Sebenarnya, 14 byte (tidak bersaing)
Cobalah online!
Kiriman ini tidak bersaing karena perbaikan bug
Æ
dilakukan setelah tantangan ini diposting.Penjelasan:
sumber
Ruby,
3531 byte-2 byte terima kasih kepada @Doorknob
Lihat di repl.it: https://repl.it/CnnQ/2
sumber
Jelly ,
137 byte6 byte terima kasih kepada Zgarb untuk algoritme-nya .
Cobalah online!
sumber
PHP,
5351 BytesMengambil argumen dari konsol.
Terimakasih untuk:
@manatwork ganti "0" dengan 0
sumber
"0"
dan0
ditangani dengan cara yang sama.Perl, 38 + 1 (
-p
) = 39 byteMembutuhkan
-p
flag untuk dijalankan (saya menambahkan-l
flag agar lebih mudah dibaca, tetapi tidak diperlukan sebaliknya):Perhatikan banyak hal tentang kode: ia mengubah angka menjadi biner (
sprintf"%b"
), lalu mengganti blok nol dengan hanya satu nol, dan mengubah hasilnya menjadi desimal (oct"0b".
).sumber
C #,
11291 byte-8 byte berkat TuukkaX
sumber
int f(int x){var a=Regex.Replace(Convert.ToString(x,2),"0+","0");return Convert.ToInt32(a,2);}
- 94 byte menggunakan regex. Saya telah melihat banyak solusi C # tidak termasukSystem.Text.RegularExpressions
jadi mungkin itu diizinkan di sini juga ...?int f(int x){return Convert.ToInt32(Regex.Replace(Convert.ToString(x,2),"0+","0"),2);}
86 byteJawa, 75
Program uji:
sumber
PARI / GP ,
5443 bytesumber
PowerShell v2 +, 69 byte
( fitur-permintaan Cara yang lebih singkat untuk mengonversi ke / dari biner di PowerShell )
Mengambil input
$args[0]
, menggunakan .NET built-in[convert]::ToString(int,base)
untuk mengubah integer input menjadi string basis biner. Itu disaring melalui-replace
untuk menghapus setiap berjalan satu atau lebih-nol hanya0
. String yang dihasilkan dikirim kembali melalui arah lain via[convert]::ToInt32(string,base)
untuk mengubah kembali biner menjadi bilangan bulat. Bilangan bulat itu ditinggalkan di jalur pipa dan hasilnya tersirat.Uji Kasus
sumber
Implementasi Referensi dalam SILOS "hanya" 417 byte
Golf
Berikut ini adalah implementasi referensi sepenuhnya ungolfed. Sebagai fitur bonus menghasilkan langkah-langkah yang diperlukan untuk mendapatkan jawaban.
Dengan permintaan, transpilasi telah dihapus. Jangan ragu untuk melihat riwayat edit untuk memulihkannya, jika tidak pergi ke repo ini untuk penerjemah.
Output sampel untuk 65000
sumber
Pyth, 12
On line.
sumber
Retina , 30 byte
Cobalah online!
Dan di sini saya pikir Retina akan menjadi jawaban pertama ...
sumber
Java,
152143138 bytesumber
Integer i;
itu sederhana dan fantastis!Dyalog APL , 19 byte
TryAPL online!
Fungsi ini benar-benar merupakan "puncak" dari dua fungsi, fungsi pertama adalah:
2∘⊥⍣¯1
yang terbalik dari binary- untuk konversi -decimal, yaitu binary- dari -decimal konversidua
2
terikat∘
untuk -untuk-desimal⊥
berulang operasi
⍣
negatif satu waktu¯1
(yaitu sekali, tapi terbalik)Dalam fungsi kedua, hasil biner di atas diwakili oleh
⍵
:{2⊥⍵/⍨~0 0⍷⍵}
0 0⍷⍵
Boolean untuk tempat {0, 0} dimulai pada ⍵~
Boolean negasi, jadi sekarang kita memiliki ᴛʀᴜᴇ di mana-mana tetapi di nol pertama di nol-lari⍵/⍨
gunakan itu untuk menyaring ⍵, jadi ini menghapus nol yang tidak diinginkan kita2⊥
mengkonversi biner-ke-desimalsumber
TSQL, 143 byte
Tidak menggunakan build in untuk mengkonversi dari dan ke biner.
Golf:
Tidak Disatukan:
Biola
sumber
CJam, 16
Cobalah online
Cukup lama karena kurangnya regex.
Penjelasan:
sumber
Java, 64 byte
Program Tes
sumber
CJam , 23 byte
Cobalah online!
Penjelasan
sumber
Ruby,
3735 byteDisimpan dua byte berkat manatwork.
Pendekatan naif. (:
sumber
"0"
, lihat poin 2 di tip sepp2k . Mengenai.to_i(2)
, di mana tidak ada ambiguitas di mana parameter berada, tanda kurung adalah opsional.C, 37 byte
sumber