Dalam banyak font (khususnya font Consolas ), 5 dari 10 digit desimal memiliki "lubang" di dalamnya. Kami akan menyebut angka-angka suci ini:
46890
Dengan demikian, 5 digit tidak suci:
12357
Jadi bilangan bulat dapat diklasifikasikan sebagai "suci" jika hanya berisi angka suci, dan "tidak suci" sebaliknya. Karena -
tidak suci, tidak ada bilangan bulat negatif yang dapat menjadi kudus.
Bilangan bulat suci dapat diklasifikasikan lebih lanjut berdasarkan berapa banyak lubang yang mereka miliki. Misalnya, angka-angka berikut memiliki kekudusan 1:
469
Dan digit ini memiliki kekudusan 2:
80
Kami mengatakan bahwa keseluruhan kekudusan bilangan bulat adalah jumlah dari kekudusan digitnya. Karena itu, 80
akan memiliki kekudusan 4, dan 99
akan memiliki kekudusan 2.
Tantangan
Diberi dua bilangan bulat n > 0
dan h > 0
, n
hasilkan bilangan bulat suci ke-2 yang kesuciannya setidaknya h
. Anda dapat mengasumsikan bahwa input dan output tidak akan lebih besar dari integer maksimum yang dapat diwakili dalam bahasa Anda atau 2^64 - 1
, mana yang kurang.
Berikut adalah daftar 25 bilangan bulat suci pertama dengan kekudusan h >= 1
, untuk referensi:
0, 4, 6, 8, 9, 40, 44, 46, 48, 49, 60, 64, 66, 68, 69, 80, 84, 86, 88, 89, 90, 94, 96, 98, 99
25 bilangan bulat suci pertama dengan kekudusan h >= 2
adalah:
0, 8, 40, 44, 46, 48, 49, 60, 64, 66, 68, 69, 80, 84, 86, 88, 89, 90, 94, 96, 98, 99, 400, 404, 406
0
memiliki kekudusan dua" sebelum saya akhirnya mengklik tautan wikipedia ke ConsolasJawaban:
Pyth, 32 byte
Penjelasan
Coba di sini
Mengambil input dalam formulir
h \n n
sumber
Ruby,
1091059582 byteIni adalah pendekatan "hitung dari 0 hingga 99999999999 ..." yang mengerikan, yang kebetulan 13 byte lebih pendek daripada rekannya yang malas. Namun, versi ini tidak mungkin selesai sebelum kematian panas alam semesta. Layak, bernilai 13 byte, ¯ ¯ _ (ツ) _ / ¯
Anda dapat mengujinya untuk nilai yang lebih kecil dengan mengubah
?9*99
ke, katakanlah'99999'
,.Ini versi lama (95 byte, dengan evaluasi malas, yang berjalan dekat-langsung daripada hampir tidak pernah):
sumber
take
bukanfirst
?take
kembaliLazy
, yang tidak dapat diindeks ke.Python 3, 103
Berikut adalah solusi yang menggunakan pendekatan yang lebih efisien memori, tetapi sebaliknya menggunakan algoritma yang sama jika Anda ingin mengujinya.
Kasus uji:
sumber
2**64-1
; lihat stackoverflow.com/questions/34113609/…PowerShell,
1631501411019896 byteMengambil input, lalu loop sampai
$n
nol. Kami awalnya mengatur$i=-1
dengan menggunakan trik pra-pemrosesan, yang bekerja karena$i
, setelah sebelumnya tidak dinyatakan, adalah$null
. Lalu kita--
, yang menyebabkan PowerShell untuk mengevaluasinya sebagai$i = $null - 1
, yang$i=-1
.Setiap loop kami bertambah
$i
dan kemudian jalankanif
pernyataan panjang . Bagian pertama dari kondisional memverifikasi yang$i
tidak memiliki bagian12357
di dalamnya dengan menggunakan-notmatch
operator , untuk menyaring angka-angka yang tidak suci.Bagian kedua dari kondisi memeriksa jumlah lubang di
$i
. Ia menggunakan-replace
operator untuk mengganti masing8
- masing atau0
dengan11
, dan kemudian membandingkan apakah panjangnya> =$h
. Kita tidak perlu khawatir melucuti angka-angka yang tidak suci, karena itu ada di bagian pertama dari persyaratan, dan angka satu-lamanya sama panjangnya1
, jadi kita juga tidak perlu menggantinya.Jika itu masih benar, kami mengurangi
$n
(karena itu berarti kami telah menemukan nomor lain yang memenuhi persyaratan input). Jadi ketikafor
kondisi dihitung ulang untuk memeriksa apakah$n
nol, itu berarti kami telah menemukan yang ke - n , jadi kami keluar darifor
loop, output,$i
dan berakhir.Edit - disimpan 13 byte dengan menggunakan sebuah array bukan string untuk
$l
dan mengubah cara$n
decremented / diperiksaEdit 2 - disimpan tambahan 9 byte dengan memeriksa
$n
difor
kondisional dan bergerak output di luar lingkaranEdit 3 - disimpan kekalahan sebuah 40 byte lebih banyak dengan secara radikal mengubah cara kita menghitung lubang
Edit 4 - menyimpan 3 byte tambahan dengan memindahkannya
++
menjadi pra-kenaikan pada bagian pertama dari Edit bersyarat5 - menyimpan 2 byte lainnya berkat TessellatingHeckler
sumber
for(--$i;$n)
dan-replace"8|0"
?$i=-1
membuat saya benar-benar gila. Saya masih mencoba mencari cara agar kita tidak harus menginisialisasi$i
sejak awal, tetapi hal yang saya coba sejauh ini lebih lama (dan, sekarang mengingat ini, kemungkinan akan lebih lama lagi).CJam,
3634 byteTerima kasih kepada aditsu karena telah menghemat 2 byte.
Uji di sini.
sumber
Utilitas Bash + GNU, 67
seq
hanya menghasilkan bilangan bulat mulai dari0
atassed -r
:h
salin baris input ke ruang penahanan/12357/d
hapus nomor yang tidak sucis/8|0/&&/g
ganti dua kali lipat angka suci dengan diri mereka sendiri. Jadi digit suci tunggal dihitung satu kali dan digit suci ganda dihitung dua kali./^.{$1}/!d
Jika tidak cocok dengan setidaknya$1
lubang, hapus dan lanjutkan ke baris berikutnyax
bawa nomor asli kembali ke ruang polased
$2!d
pada baris mana saja sebelum baris$2
, hapus dan lanjutkan ke baris berikutnyaq
harus tepat$2
- keluar (dan cetak tersirat)Ideone.
sumber
sed -r "h;/[12357]/d;s/8|0/&&/g;/^.{$1}/!d;x"
. Dan lain 4:sed $2!d\;q
. Dan jika Anda senang dengan batas atas hanya 4611686018427387904, Anda bisa lolosseq 0 $[1<<62]
seq
terimaNaN
: Sekarang saya milikiseq 0 NaN|sed -r "h;/[12357]/d;s/8|0/&&/g;/^.{$1}/!d;x"|sed $2!d\;q
, nilai 67.-sh: !d\: event not found
` before
! `Tidak diperlukan dalam skrip . Ini hanya diperlukan ketika menjalankan ini secara langsung pada command-line, yang menurut saya bukan persyaratan.MATL , 39
40byteInpunts
n
danh
dalam urutan itu.Cobalah online!
Kita perlu melacak dua angka: nomor kandidat saat ini (untuk memeriksa kekudusannya) dan jumlah angka yang ditemukan cukup kudus. Yang pertama adalah bagian atas tumpukan, dan yang terakhir disimpan sebagai jumlah elemen dalam tumpukan. Ketika program selesai, hanya bagian atas yang perlu ditampilkan.
sumber
R,
109107 byteDengan baris dan lekukan baru:
Pemakaian:
sumber
JavaScript (ES6), 110 byte
Solusi rekursif ekor yang mengakumulasikan bilangan suci dalam sebuah array.
Tanpa minat, tidak mengharuskan angka untuk sepenuhnya (!) Kudus membuat kekudusan lebih canggung, tetapi masih menghemat 10% secara keseluruhan:
sumber
i
danr
parameter pada satu titik, dan gagal mengedit perubahan dengan benar.JavaScript ES6, 191 byte
Tentu, ini bukan cara yang paling efisien. Tapi Anda tahu saya, saya suka generator <3
Sedikit tidak berbulu:
sumber
C # 6, 168 byte
Ini adalah Ekspresi Lambda dari tipe Func <int, int, int>. Kode ini diautimisasi untuk ukuran minimum (tidak berkinerja).
Di bawah ini, kode yang dipercantik dalam deklarasi metode (dengan lebih banyak kinerja):
sumber
JavaScript (ES6), 87
Kurang golf
Uji
sumber
Lua, 169 byte
Tidak Disatukan:
sumber
Lua,
155141140 BytesMengambil kedua input dengan argumen baris perintah (argumen pertama adalah n, lalu h)
Sunting: Terima kasih kepada @DavisDude, yang membantu saya mencukur 14 byte dan mengingatkan saya bahwa saya tidak harus mencetak semua angka suci hingga n, tetapi hanya n.
Tidak terseret dan penjelasan
sumber
print(a[arg[1]])
n
. Sebenarnya,print(a[#a])
menyimpan byte lebih banyak lagi. Terima kasih atas komentarnya!x=0a={}
alih-alihx,a=0,{}
.0a
akan diartikan sebagai angka heksadesimal, tapi saya bisa melakukannyaa={}x=0while
tanpa masalah :)Oracle SQL 11.2, 229 byte
Tidak bermain golf
sumber
Python 2, 96 byte
Kondisi kesucian
k
diperiksa olehsum(map(s.count,`k`))>=h
, yang menghitung jumlah lubang dengan menjumlahkan jumlah untuk setiap karakters="0046889"
, di mana0
dan8
muncul dua kali.set(str(k))<=set(s))
, yang memeriksa bahwa semua angka adalah kudus.str
digunakan daripada backticks untuk menghindari akhiranL
untuk waktu yang lama.Ini dirantai ke dalam kesetaraan tunggal menggunakan fakta Python 2 bahwa jumlahnya lebih kecil dari set.
Fungsi ini didefinisikan secara rekursif untuk menghitung angka
k
, mengurangi penghitungn
setiap kali jumlah hit suci kecuali jika hit0
. Kemudian dapat mengembalikank
yang memicu ini, tetapi lebih pendek untuk menjaga penghitungan secara rekursif dengan menambahkan1
setiap waktu, meskipun off-by-one membutuhkan hitungan dasar-1
untuk memperbaikinya.sumber
Haskell, 94 byte
c
adalah kekudusan digit,v
kekudusan angka,n!h
melakukan sisanya.Catatan: Saya pikir ini adalah satu-satunya jawaban tanpa karakter
4,6,8
.sumber
Cepat
sumber