Pertanyaan :
Anda akan diberi bilangan bulat awal dan akhir dari suatu urutan dan harus mengembalikan jumlah bilangan bulat di dalamnya yang tidak mengandung digit 5
. Angka awal dan akhir harus dimasukkan!
Contoh:
1,9 → 1,2,3,4,6,7,8,9 → Hasil 8
4,17 → 4,6,7,8,9,10,11,12,13,14,16,17 → Hasil 12
50,60 → 60 → Hasil 1
-59, -50 → → Hasil 0
Hasilnya mungkin berisi lima.
Nomor awal akan selalu lebih kecil dari nomor akhir. Kedua angka itu bisa juga negatif!
Saya sangat ingin tahu untuk solusi Anda dan cara Anda menyelesaikannya. Mungkin seseorang dari Anda akan menemukan solusi matematika murni yang mudah.
Sunting Ini adalah tantangan kode-golf, sehingga kode terpendek menang.
50, 59 -> 0
.Jawaban:
JavaScript (ES6),
3633 byteMengambil input dengan sintaks currying
(a)(b)
.Diformat dan dikomentari
Uji kasus
Tampilkan cuplikan kode
sumber
test
lebihexec
ketika Anda hanya perlu boolean.)b<a
ada untuk menghentikan rekursi setelah menghitung semua angka darib
hinggaa
, jadi menghapusnya hanya akan menyebabkan rekursi tak terbatas.a
sebagai argumen dan mengembalikanF
fungsi, yang pada gilirannya mengambilb
sebagai argumen dan - seperti yang Anda perhatikan - dipanggil secara berulang untuk beralih darib
kea
, menambah penghitung untuk semua bilangan bulat yang tidak mengandung5
dalam desimal mereka perwakilan.Jelly ,
87 byte-1 byte berkat Dennis (gunakan fakta bahwa pengindeksan ke angka memperlakukan angka itu sebagai daftar desimal)
TryItOnline!
Bagaimana?
* Atom nilai absolut,
A
diperlukan karena angka negatif yang dilemparkan ke daftar desimal memiliki entri negatif, tidak ada yang akan menjadi5
(contoh yang diberikan akan menghitung semua delapan daripada dua).sumber
rAw€5¬S
menghemat satu byte.w
melemparkan argumen integer ke digit desimalnya.Bash + grep, 17 byte
Cobalah online!
sumber
2sable ,
65 byteMenyimpan satu byte, terima kasih kepada Adnan
Cobalah online!
Penjelasan
Catatan: Ini berfungsi karena bug dalam
¢
membuat fungsi berlaku sendiri untuk setiap elemen alih-alih menghitung elemen yang cocok dalam daftar.sumber
`
karena berperilaku sama pada array: p.Python2,
59555251474342 byteSolusi rekursif. Terima kasih kepada @xnor karena telah memberi saya motivasi untuk menemukan solusi menggunakan operator logis! Juga, terima kasih kepada @JonathanAllan dan @xnor karena membimbing saya dan memotong byte dari 43 menjadi 42!
Upaya lain sebesar 43 byte
sumber
if!`x`.count('5')
bekerjanot
operator yang!
dalam bahasa mirip C, tetapi itu membutuhkan 3 byte :(and
danor
.not
.Utilitas Bash / Unix, 21 byte
Cobalah online!
sumber
05AB1E ,
876 byteMenyimpan satu byte, terima kasih kepada Adnan
Cobalah online!
Penjelasan
sumber
å
, yaitu.å
, sehingga Anda dapat melakukannyaŸ5.å_O
selama 6 byte.negate
artinya-n
, ataun==0?1:0
?n==0?1:0
Pyth,
98 byteMenyimpan satu byte berkat FryAmTheEggman!
Penjelasan:
Cobalah online!
sumber
Perl 6 , 23 byte
Cobalah online!
Bagaimana itu bekerja
sumber
Haskell , 39 byte
Cobalah online! Pemakaian:
Penjelasan:
sumber
R, 33 byte
Pemakaian:
sumber
Oktaf , 36 byte
Cobalah online!
sumber
Groovy,
47454340 byteIni adalah penutupan tanpa nama.
findAll
mirip dengan menambahkan sebuahif
kondisi dalam daftar pemahaman dalam python.Cobalah online!
sumber
PHP 7.1,
5755 byteJalankan dengan
php -r '<code>' <a> <b>
sumber
Mathematica,
464442 byteTerima kasih kepada alephalpha dan DavidC karena telah menghemat masing-masing 2 byte!
Fungsi tanpa nama mengambil dua argumen integer dan mengembalikan integer.
IntegerDigits@Range@##
mengubah semua angka di antara input menjadi daftar digit;FreeQ@5
menguji daftar itu untuk memutuskan mana yang tidak mengandung5
. KemudianBoole
mengkonversi booleans menjadi nol dan satu, danTr
menjumlahkan hasilnya.Solusi lain (44 dan 47 byte):
IntegerDigits@x~FreeQ~5
menentukan apakah daftar angka dari angka bebas dari angka 5, danCount[Range@##,x_/;...]&
menghitung berapa banyak angka di antara input yang lulus tes itu.1##&@@IntegerDigits@#-5
mengambil daftar digit angka, mengurangi 5 dari semuanya, dan mengalikan jawaban secara bersamaan;Sign[...]^2
kemudian mengonversi semua angka bukan nol ke 1.sumber
Count[Range@##,x_/;IntegerDigits@x~FreeQ~5]&
Tr@Boole[FreeQ@5/@IntegerDigits@Range@##]&
Ruby,
3635 byteThx IMP1 untuk -1 byte
sumber
?5
('5'
karakter) alih-alih/5
/ dalam pencarian untuk menyimpan byte.Java 7,
8078 byteTidak Disatukan:
Kode uji:
Coba di sini.
Keluaran:
sumber
PowerShell,
4241 byteDipanggil dari baris perintah sebagai. \ No5s.ps1 1 20
sumber
-replace3
atau-split1
atau-notmatch5
).Python 2,
6156 byte-5 byte terima kasih kepada tukkaaX
sumber
not "5" in
:) Juga, jika Anda menggunakan Python2, Anda bisa mengelilinginyax
dengan tanda kutip ``, alih-alih melakukanstr(x)
.[]
. Anda juga tidak membutuhkan ruang sebelumnyaif
.lambda a,b:sum(not"5"in`n`for n in range(a,b+1))
bekerja sekalipun. tio.run/nexus/…Cepat 52 byte
sumber
Batch, 95 byte
Secara manual, perulangan menyimpan beberapa byte karena saya memerlukan penghitung lingkaran dalam suatu variabel.
sumber
PHP, 56 byte
Jalankan seperti ini:
Versi untuk PHP 7.1 adalah 53 byte (dikreditkan ke Titus):
Penjelasan
sumber
trim
parameter kedua lagi.CJam "solusi matematika murni mudah", 60
Cobalah online
Dibutuhkan angka dalam urutan apa pun, dalam array.
Penjelasan:
Satu masalah inti adalah menghitung f (n) = jumlah non-5 dari 1 hingga n (inklusif) untuk setiap n positif. Dan jawabannya adalah: ambil digit desimal n, ganti semua digit setelah 5 pertama (jika ada) dengan 9, lalu ganti semua digit 5..9 dengan 4..8 (pengurangan), dan konversikan dari basis 9. Misalnya 1752 → 1759 → 1648 → 1 * 9 ^ 3 + 6 * 9 ^ 2 + 4 * 9 + 8 = 1259. Pada dasarnya, setiap posisi digit memiliki 9 nilai yang dapat diterima, dan 5xxxx setara dengan 49999 karena tidak ada angka yang lebih valid di antara mereka.
Setelah kami menyelesaikan ini, kami memiliki beberapa kasus: jika angka input (katakan a dan b, a <b) positif (ketat), maka hasilnya adalah f (b) -f (a-1). Jika hasilnya negatif, maka kita dapat mengambil nilai absolut, menyusun ulang, dan menggunakan perhitungan yang sama. Dan jika a <= 0 <= b maka hasilnya adalah f (-a) + f (b) +1.
Program pertama mengimplementasikan fungsi F seperti yang dijelaskan di atas (tetapi diterapkan pada setiap angka dalam array), kemudian membaca input, mengubah angka menjadi nilai absolut dan menata ulang, dan menggunakan salah satu dari 2 perhitungan di atas, berdasarkan apakah * b> 0 pada awalnya.
sumber
Python 2 , 54 byte
Cobalah online!
Bukan jawaban Python terpendek Menggunakan algoritme yang sama tetapi cara penerapan yang berbeda dengan loop sementara dan bukan fungsi lambda.
sumber
Java 7, 77 byte
Ini adalah peningkatan dari Jawaban Kevin , tetapi karena saya belum memiliki reputasi untuk berkomentar, jawaban baru ini harus dilakukan.
Jadi yang saya lakukan adalah:
indexOf
pernyataan dengancontains
(-1 byte)untuk-loop ( 77 byte ):
rekursif ( 79 byte ):
Keluaran:
Uji di sini !
sumber
(""+a).contains("5")?0:1
bisa diganti oleh!(""+a).contains("5")
?(""+a).contains("5")||r++
?C #, 67 byte
sumber
for(int c=0;...)
tetapi kemudian gagal untuk mengkompilasi karena pengembaliannya berada di luar ruang lingkup untukc
JavaScript (ES6),
58 5649 byteGolf 7 byte berkat produk ETH .
sumber
c+=!/5/.test(s++)
untuk menyimpan beberapa byte :-)MATL , 10 byte
Cobalah online!
Penjelasan
sumber
C #, 77 byte
Panggilan lambda anonim.
Menggunakan
n
(nomor pertama) danm
(nomor terakhir) sebagai input, lalu memeriksa melalui penahanan string ("".Contains("")
).sumber
5
dalam nomornya, jadi10
(yang jawaban Anda tidak akan dihitung) harus dihitung.g
harus diinisialisasi ketika dinyatakan seperti itu dinamaivar
sehingga Anda perluvar g="";
dan Anda dapat menggunakan currying yaitun=>m=>
Sebenarnya , 13 byte
Cobalah online!
Penjelasan:
sumber