Pertimbangkan proses berikut:
Ambil beberapa bilangan bulat non-negatif N.
misal N =
571
Ekspresikan dalam biner tanpa nol terkemuka. (Nol itu sendiri adalah satu-satunya pengecualian, menjadi
0
.)misalnya
571
=1000111011
dalam binerPecah berturut-turut satu dan nol dalam representasi biner ini.
misalnya
1000111011
→1
,000
,111
,0
,11
Sortir proses dari yang terpanjang hingga terpendek.
misalnya
1
,000
,111
,0
,11
→000
,111
,11
,1
,0
Timpa semua digit di setiap jalankan dengan
1
's dan0
' s, selalu dimulai dengan1
's.misalnya
000
,111
,11
,1
,0
→111
,000
,11
,0
,1
Menggabungkan hasilnya untuk mendapatkan nomor biner baru.
misalnya
111
,000
,11
,0
,1
→1110001101
=909
dalam desimal
Saat Anda memplot nilai yang dihasilkan oleh proses ini, Anda mendapatkan grafik yang cukup rapi:
Dan semoga jelas mengapa saya memanggil urutan yang dihasilkan urutan Temple Skyline :
Tantangan
Tulis program atau fungsi yang mengambil bilangan bulat non-negatif N dan mencetak atau mengembalikan nomor urut Temple Skyline yang sesuai. Input dan output Anda harus dalam desimal.
mis. Jika input adalah 571
output seharusnya 909
.
Kode terpendek dalam byte menang.
Untuk referensi, berikut adalah istilah dalam urutan dari N = 0 hingga 20:
0 1
1 1
2 2
3 3
4 6
5 5
6 6
7 7
8 14
9 13
10 10
11 13
12 12
13 13
14 14
15 15
16 30
17 29
18 26
19 25
20 26
.BQ
alih-alihjQ2
, yang berarti Anda bisa kehilangan ruang antara8
dan sebelumnya2
.is*R`s=!Z_ShMr.BQ8 2
adalah solusi sama panjang yang menarik. Sebagian besar memposting karena saya tidak benar-benar berharap penetapan dalam argumen peta berfungsi.`s
dengan]
. Menghemat satu byte.Python 2, 121 byte
125121: Terima kasih kepada Sp3000 karena telah memangkas 4 byte!
125
sumber
n*`~i%2`for
daripada"10"[i%2]*n for
sorted(...,key=len)
daripada menggunakanmap(len,...
tetapi saya tidak sepenuhnya memahami program Anda sekarang jadi saya tidak positif yang akan menguntungkan Anda.len
karena hanya itu informasi yang saya butuhkan untuk mereplikasi jumlah 1 dan 0. Saya mencoba saran Anda dan menambahkan 2 byte, karena saya harus menggunakanlen
dua kali, tetapi terima kasih atas sarannya!JavaScript ES6, 110 byte
113116119120Disimpan 3 byte berkat @intrepidcoder
Disimpan 3 byte berkat @NinjaBearMonkey
Pendekatan lurus ke depan. Tidak suka panjang fungsi sortir, tapi saya tidak bisa memikirkan cara untuk golf itu.
sumber
+
bukaneval
.split(/(0+)/g)
harus dapat menggantikanmatch(/(.)\1*/g)
.+(s=0, ... .map(l=>l.replace(/./g,s^=1))...)
C ++,
535527 Bytes(Terima kasih nol untuk mencukur beberapa byte.)
Sekarang setelah kita menghapus byte-byte itu, programnya sekarang kompetitif;)
Saya baru bermain golf, jadi tolong beri saya beberapa tips di komentar .
Hal-hal seperti "Anda tidak membutuhkan tanda kurung itu" atau "gunakan printf" semuanya membantu, tetapi saya juga menghargai saran tentang logika. Terima kasih sebelumnya!
Untuk memudahkan membaca, saya sajikan versi yang tidak disolf:
Versi golf EDIT menurunkan beberapa byte, versi tidak diubah tidak berubah
sumber
int a; int b;
menggunakanint a,b;
. Juga variabel dalam lingkup global diinisialisasi dengan0
. Anda juga tidak harus menggunakan kurung keriting ketika hanya ada satu perintah yang harus dieksekusi. Jugaones=!ones;
dapat disederhanakan sebagaiones ^= 1;
for
loop pertama Anda dengan1
, yaitufor(int i=D;i;i--)
dan gunakanpow(2,i-1)
di dalam loop.ones
bisa jugaint
. Mungkin macroingint(pow(i))
keP(i)
. Saya sarankan Anda membaca diskusi di siniHaskell,
132131 byteContoh penggunaan:
Bagaimana itu bekerja:
sumber
J - 30 byte
Fungsi mengambil integer di sebelah kanan. Menangani dengan benar 0.
#:
- Ambil representasi biner.1,2~:/\]
- Di antara setiap digit, laporkan Benar jika mereka berbeda. Prepend a True sehingga daftar memiliki True di awal setiap "run".(#;.1~...)
- Menggunakan vektor boolean di atas, ambil panjang masing-masing proses.\:~
- Urutkan panjang ini dari terpanjang ke terpendek.2|#\
- Ambil daftar bolak-balik1 0 1 0 ...
sepanjang daftar panjang.(...#...)
- Untuk setiap angka di sebelah kiri (panjang yang diurutkan), ambil sebanyak mungkin item yang sesuai di sebelah kanan (bergantian angka 1 dan 0)&.
- Konversi representasi biner baru ini kembali ke angka.Contoh:
sumber
Perl 5.10,
121101Saya pikir bagian semacam itu bisa lebih pendek.
Sunting: -20 byte, terima kasih untuk symbabque!
sumber
\n
, danm
tidak diperlukan untuk pencocokan ekspresi reguler. Dalam subtitusi Anda, cukup gunakan.
sebagai ganti grup char.grep
bagian itu juga. Inioct
rapi meskipun :)Python 3,
146136 bytesumber
map
denganlambda
, apakah lebih baik dilakukan''.join(... for ... in ...)
?Mathematica, 83 byte
Ini mendefinisikan fungsi yang tidak disebutkan namanya.
sumber
Ruby,
107104102 byte(disimpan 3 byte berkat nimi )
Tidak akan mengalahkan orang-orang seperti CJam, tapi saya mendapatkannya cukup kecil untuk bahasa yang waras.
sumber
(i+=1)%2
adalahi=1-i
.Java 8,
179176 byteSaya menggunakan dua impor statis:
java.util.Integer.highestOneBit
danjava.util.Arrays.sort
.Agar mudah dibaca, berikut adalah kode yang tidak ditandai:
sumber
Python 2, 170 byte
sumber
t(0) = 0
kapan1
diharapkan dant(4) = 1
kapan 6 diharapkan