Jangan beri aku lima!

38

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.

Arasuvel
sumber
3
@betseq: Sudah dekat; tetapi yang ini memiliki rentang variabel (dan tidak memerlukan modulo).
Titus
4
Saya akan merekomendasikan kode terpendek sebagai kriteria kemenangan dan kode-golf tag (saya bahkan tidak melihat itu bukan!). Juga, Anda mungkin harus meletakkan test case yang mencakup 50 atau 500; juga mungkin yang membentang -50, dan yang membentang 0 akan menjadi ide yang baik.
Jonathan Allan
1
@ JonathanAllan: Saya akan memperbarui contoh.
Arasuvel
4
Kasus uji: 50, 59 -> 0.
Zgarb
14
Anda mengatakan: "Nomor awal akan selalu lebih kecil dari nomor akhir." tetapi salah satu contoh Anda (-50, -59) secara langsung bertentangan dengan ini
theonlygusti

Jawaban:

21

JavaScript (ES6), 36 33 byte

Mengambil input dengan sintaks currying (a)(b).

a=>F=b=>b<a?0:!/5/.test(b)+F(b-1)

Diformat dan dikomentari

a =>                 // outer function: takes 'a' as argument, returns F
  F = b =>           // inner function F: takes 'b' as argument, returns the final result
    b < a ?          // if b is less than a
      0              //   return 0
    :                // else
      !/5/.test(b) + //   add 1 if the decimal representation of b does not contain any '5'
      F(b - 1)       //   and do a recursive call to F with b - 1

Uji kasus

Arnauld
sumber
(Saya biasanya lebih suka testlebih execketika Anda hanya perlu boolean.)
Neil
@ Neil Itu memang lebih masuk akal. Diperbarui.
Arnauld
NB: Saya tidak bisa menemukan tip tentang sintaks currying ES6, jadi saya menulis satu .
Arnauld
5
@TheLethalCoder b<aada untuk menghentikan rekursi setelah menghitung semua angka dari bhingga a, jadi menghapusnya hanya akan menyebabkan rekursi tak terbatas.
ETHproduk
1
@HristiyanDodov Fungsi luar yang tidak disebutkan namanya mengambil asebagai argumen dan mengembalikan Ffungsi, yang pada gilirannya mengambil bsebagai argumen dan - seperti yang Anda perhatikan - dipanggil secara berulang untuk beralih dari bke a, menambah penghitung untuk semua bilangan bulat yang tidak mengandung 5dalam desimal mereka perwakilan.
Arnauld
17

Jelly , 8 7 byte

-1 byte berkat Dennis (gunakan fakta bahwa pengindeksan ke angka memperlakukan angka itu sebagai daftar desimal)

rAw€5¬S

TryItOnline!

Bagaimana?

rAw€5¬S - Main link: from, to    e.g. -51, -44
r       - range(from, to)        e.g. [-51,-50,-49,-48,-47,-46,-45,-44]
 A      - absolute value         e.g. [51,50,49,48,47,46,45,44]
  w€    - first index of... for €ach (0 if not present)
    5   - five                   e.g. [1,1,0,0,0,0,2,0]
     ¬  - logical not            e.g. [0,0,1,1,1,1,0,1]
      S - sum                    e.g. 5

* Atom nilai absolut, Adiperlukan karena angka negatif yang dilemparkan ke daftar desimal memiliki entri negatif, tidak ada yang akan menjadi 5(contoh yang diberikan akan menghitung semua delapan daripada dua).

Jonathan Allan
sumber
rAw€5¬Smenghemat satu byte.
Dennis
@Dennis terima kasih! Apakah deskripsi saya "menganggap angka itu sebagai daftar desimal" akurat?
Jonathan Allan
2
Kurang lebih. wmelemparkan argumen integer ke digit desimalnya.
Dennis
13

2sable , 6 5 byte

Menyimpan satu byte, terima kasih kepada Adnan

Ÿ5¢_O

Cobalah online!

Penjelasan

 Ÿ      # inclusive range
  5¢    # count 5's in each element of the range
    _   # negate
     O  # sum

Catatan: Ini berfungsi karena bug dalam ¢membuat fungsi berlaku sendiri untuk setiap elemen alih-alih menghitung elemen yang cocok dalam daftar.

Emigna
sumber
Anda dapat menghapus `karena berperilaku sama pada array: p.
Adnan
@ Adnan: Terima kasih! Saya akan mengujinya tetapi lupa;)
Emigna
9

Python2, 59 55 52 51 47 43 42 byte

f=lambda a,b:a<=b and-(`5`in`a`)-~f(a+1,b)

Solusi 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

f=lambda a,b:a<=b and-~-(`5`in`a`)+f(a+1,b)
f=lambda a,b:a<=b and 1-(`5`in`a`)+f(a+1,b)
Yytsi
sumber
Akan if!`x`.count('5')bekerja
Titus
2
@Titus Python memiliki notoperator yang !dalam bahasa mirip C, tetapi itu membutuhkan 3 byte :(
Yytsi
1
Pikirkan tentang menggunakan korsleting logis dengan anddan or.
xnor
1
Yup, bagus sekali! Sekarang pikirkan tentang memperpendeknya not.
xnor
1
Anda benar-benar dekat! Terus berusaha.
xnor
6

Utilitas Bash / Unix, 21 byte

seq $*|sed /5/d|wc -l

Cobalah online!

Mitchell Spector
sumber
6

05AB1E , 8 7 6 byte

Menyimpan satu byte, terima kasih kepada Adnan

Ÿ5.å_O

Cobalah online!

Penjelasan

Ÿ         # inclusive range
 5.å      # map 5 in y for each y in the list
    _     # logical negation 
     O    # sum
Emigna
sumber
05AB1E juga memiliki vektor å, yaitu , sehingga Anda dapat melakukannya Ÿ5.å_Oselama 6 byte.
Adnan
negateartinya -n, atau n==0?1:0?
ETHproduk
@ ETHproductions: Maaf, itu tidak jelas. Maksud saya negasi logis, jadin==0?1:0
Emigna
6

Pyth, 9 8 byte

Menyimpan satu byte berkat FryAmTheEggman!

lf-\5T}E

Penjelasan:

        Q # Input
      }E  # Form an inclusive range starting from another input
          #   order is reversed, but doesn't matter
 f-\5T    # Filter by absence of '5'
l         # Count the number of elements left

Cobalah online!

busukxuan
sumber
5

Perl 6 , 23 byte

{+grep {!/5/},$^a..$^b}

Cobalah online!

Bagaimana itu bekerja

{                     }  # A lambda.
              $^a..$^b   # Range between the two lambda arguments.
  grep {!/5/},           # Get those whose string representation doesn't match the regex /5/.
 +                       # Return the size of this list.
seseorang
sumber
5

Haskell , 39 byte

s!e=sum[1|x<-[s..e],notElem '5'$show x]

Cobalah online! Pemakaian:

Prelude> 4 ! 17
12

Penjelasan:

             [s..e]                     -- yields the range from s to e inclusive
          x<-[s..e]                     -- for each x in this range
          x<-[s..e],notElem '5'$show x  -- if the char '5' is not in the string representation of x
       [1|x<-[s..e],notElem '5'$show x] -- then add a 1 to the resulting list      
s!e=sum[1|x<-[s..e],notElem '5'$show x] -- take the sum of the list
Laikoni
sumber
4

R, 33 byte

f=function(x,y)sum(!grepl(5,x:y))

Pemakaian:

> f=function(x,y)sum(!grepl(5,x:y))
> f(40,60)
[1] 10
> f(1,9)
[1] 8
> f(4,17)
[1] 12
plannapus
sumber
4

Oktaf , 36 byte

@(m,n)sum(all(dec2base(m:n,10)'-52))

Cobalah online!

Luis Mendo
sumber
4

Groovy, 47 45 43 40 byte

{a,b->(a..b).findAll{!(it=~/5/)}.size()}

Ini adalah penutupan tanpa nama. findAllmirip dengan menambahkan sebuahif kondisi dalam daftar pemahaman dalam python.

Cobalah online!

Gurupad Mamadapur
sumber
4

PHP 7.1, 57 55 byte

for([,$a,$b]=$argv;$a<=$b;)$n+=!strstr($a++,53);echo$n;

Jalankan dengan php -r '<code>' <a> <b>

Titus
sumber
Bukankah ini sintaksis PHP7.1?
aross
@aross: Benar. Tetapi PHP 7.1 lebih lama dari 5 jam ( diterbitkan pada 1 Desember )
Titus
1
tentu saja, saya hanya bertanya karena saya sudah terbiasa menentukan versi apakah 7 atau lebih. Itu juga semacam konvensi untuk Python
aross
1
Konvensi untuk PHP - sejauh yang saya lihat - adalah menggunakan versi terbaru kecuali ditentukan sebaliknya.
Titus
Saya tidak berpikir banyak orang memiliki versi minor terbaru. Penyebut yang paling tidak umum saat ini mungkin adalah 5.5. Secara pribadi saya menggunakan FC 25 (dianggap cukup canggih), yang saat ini mendistribusikan PHP 7.0. Jika Anda menggunakan Windows, Anda mungkin perlu memperbarui secara manual.
aross
4

Mathematica, 46 44 42 byte

Terima kasih kepada alephalpha dan DavidC karena telah menghemat masing-masing 2 byte!

Tr@Boole[FreeQ@5/@IntegerDigits@Range@##]&

Fungsi tanpa nama mengambil dua argumen integer dan mengembalikan integer. IntegerDigits@Range@##mengubah semua angka di antara input menjadi daftar digit; FreeQ@5menguji daftar itu untuk memutuskan mana yang tidak mengandung 5. Kemudian Boolemengkonversi booleans menjadi nol dan satu, dan Trmenjumlahkan hasilnya.

Solusi lain (44 dan 47 byte):

Count[Range@##,x_/;IntegerDigits@x~FreeQ~5]&

IntegerDigits@x~FreeQ~5menentukan apakah daftar angka dari angka bebas dari angka 5, dan Count[Range@##,x_/;...]&menghitung berapa banyak angka di antara input yang lulus tes itu.

Tr[Sign[1##&@@IntegerDigits@#-5]^2&/@Range@##]&

1##&@@IntegerDigits@#-5 mengambil daftar digit angka, mengurangi 5 dari semuanya, dan mengalikan jawaban secara bersamaan; Sign[...]^2kemudian mengonversi semua angka bukan nol ke 1.

Greg Martin
sumber
1
Count[Range@##,x_/;IntegerDigits@x~FreeQ~5]&
DavidC
1
Tr@Boole[FreeQ@5/@IntegerDigits@Range@##]&
alephalpha
3

Ruby, 36 35 byte

->a,b{(a..b).count{|x|!x.to_s[?5]}}

Thx IMP1 untuk -1 byte

GB
sumber
1
Bukankah ini mengembalikan daftar tanpa angka yang mengandung 5, bukan ukuran daftar itu?
IMP1
Anda benar, saya telah menyalin / menempel versi yang salah.
GB
1
Anda juga dapat menggunakan ?5( '5'karakter) alih-alih /5/ dalam pencarian untuk menyimpan byte.
IMP1
3

Java 7, 80 78 byte

int c(int a,int b){int r=0;for(;a<=b;)r+=(""+a++).contains("5")?0:1;return r;}

Tidak Disatukan:

int c(int a, int b){
  int r = 0;
  for (; a <= b; ) {
    r += ("" + a++).contains("5")
          ? 0
          : 1;
  }
  return r;
}

Kode uji:

Coba di sini.

class M{
  static int c(int a,int b){int r=0;for(;a<=b;)r+=(""+a++).contains("5")?0:1;return r;}

  public static void main(String[] a){
    System.out.println(c(1, 9));
    System.out.println(c(4, 17));
  }
}

Keluaran:

8
12
Kevin Cruijssen
sumber
3

PowerShell, 42 41 byte

param($a,$b)$a..$b|%{$z+=!($_-match5)};$z

Dipanggil dari baris perintah sebagai. \ No5s.ps1 1 20

mcmurdo
sumber
1
Anda dapat menjatuhkan ruang untuk menghemat satu byte. Dengan pola regex numerik ketat, Anda tidak perlu pembatas (misalnya, -replace3atau -split1atau -notmatch5).
AdmBorkBork
Ah, bagus, terima kasih @AdmBorkBork
mcmurdo
2

Python 2, 61 56 byte

lambda a,b:len([n for n in range(a,b+1) if not"5"in`n`])

-5 byte terima kasih kepada tukkaaX

sagiksp
sumber
Jangan berkecil hati! Bersenang-senang dan menantang diri sendiri adalah yang terpenting. Anda dapat menghapus dua spasi putih di not "5" in:) Juga, jika Anda menggunakan Python2, Anda bisa mengelilinginya xdengan tanda kutip ``, alih-alih melakukan str(x).
Yytsi
@TuukkaX Terima kasih! juga menghapus ruang antara di dalam dan `x`
sagiksp
Anda dapat menghapus []. Anda juga tidak membutuhkan ruang sebelumnya if.
Dennis
@ Dennis Saya sudah mencobanya, tetapi mengeluh bahwa "objek tipe 'generator' tidak memiliki len ()".
Yytsi
@ TuukkaX Benar. lambda a,b:sum(not"5"in`n`for n in range(a,b+1))bekerja sekalipun. tio.run/nexus/…
Dennis
2

Cepat 52 byte

($0...$1).filter { !String($0).contains("5") }.count
Arasuvel
sumber
Karena tantangan Anda adalah tantangan codegolf, Anda harus memasukkan bytecount Anda. Juga, dalam codegolf (setidaknya di sini), itu adalah persyaratan bahwa semua program muse benar-benar bersaing (misalnya nama fungsi Anda bisa hanya satu karakter, fungsi Anda yang sebenarnya mungkin dapat dikurangi menjadi satu baris). Saya tidak tahu Swift, Anda mungkin harus mengoreksi saya tentang beberapa hal.
clismique
2

Batch, 95 byte

@set/an=0,i=%1
:g
@if "%i%"=="%i:5=%" set/an+=1
@set/ai+=1
@if %i% leq %2 goto g
@echo %n%

Secara manual, perulangan menyimpan beberapa byte karena saya memerlukan penghitung lingkaran dalam suatu variabel.

Neil
sumber
2

PHP, 56 byte

for($i=$argv[1];$i<=$argv[2];)trim(5,$i++)&&$x++;echo$x;

Jalankan seperti ini:

php -r 'for($i=$argv[1];$i<=$argv[2];)trim(5,$i++)&&$x++;echo$x;' 1 9 2>/dev/null;echo
> 8

Versi untuk PHP 7.1 adalah 53 byte (dikreditkan ke Titus):

for([,$i,$e]=$argv;$i<=$e;)trim(5,$i++)&&$x++;echo$x;

Penjelasan

for(
  $i=$argv[1];          # Set iterator to first input.
  $i<=$argv[2];         # Loop until second input is reached.
)
  trim(5,$i++) && $x++; # Trim string "5" with the characters in the
                        # current number; results in empty string when
                        # `5` is present in the number. If that is not
                        # the case, increment `$x`

echo$x;                 # Output `$x`
aross
sumber
Ah, aku lupa tentang trimparameter kedua lagi.
Titus
2

CJam "solusi matematika murni mudah", 60

{{Ab5+_,\_5#)<\9e]);_4f>.m9b}%}:F;q~_:z$\:*0>{((+F:-}{F:+)}?

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.

aditsu
sumber
Bukan metode "murni" tapi bagus. di sini, dapatkan +1 :)
Matthew Roh
@ MatthewRoh terima kasih, tapi apa maksudmu tidak murni? Ini adalah solusi yang tidak langsung perhitungan matematis pada angka-angka input, tanpa iterasi melalui kisaran. Apa lagi yang Anda harapkan?
aditsu
2

Python 2 , 54 byte

i,j=input();k=0
while i<=j:k+=not"5"in`i`;i+=1
print k

Cobalah online!

Bukan jawaban Python terpendek Menggunakan algoritme yang sama tetapi cara penerapan yang berbeda dengan loop sementara dan bukan fungsi lambda.

ElPedro
sumber
Ini adalah program dan bukan fungsi dan menggunakan sementara bukan untuk. Apa yang tidak berbeda? OK, masih mencari string "5" di dalam input yang bertambah, setuju. Apakah ada cara yang lebih baik?
ElPedro
Itu persis seperti apa dan itulah mengapa itu berbeda. Maaf, mungkin seharusnya komentar saya berbeda.
ElPedro
Algoritma yang sama, cara implementasi yang berbeda. Tidak ada masalah dengan komentar Anda. Apakah itu lebih baik?
ElPedro
Ya, :) :) Saya akan menghapus komentar ini untuk membuat bagian komentar terlihat bersih.
Yytsi
1

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:

  • Ganti indexOfpernyataan dengan contains(-1 byte)
  • Pindahkan bagian incrementing dari for-loop ke dalam pernyataan kondisional (-2 byte)

untuk-loop ( 77 byte ):

int c(int a,int b){int r=1;for(;a++<b;)r+=(""+a).contains("5")?0:1;return r;}

rekursif ( 79 byte ):

int d(int r,int a,int b){r+=(""+a).contains("5")?0:1;return a!=b?d(r,a+1,b):r;}

Keluaran:

8
12

8
12

Uji di sini !

Tobias Meister
sumber
Selamat datang di PPCG! Temuan bagus dalam jawaban golf yang sudah cukup bagus. Saya tidak tahu banyak tentang Java tetapi tidak (""+a).contains("5")?0:1bisa diganti oleh !(""+a).contains("5")?
Christoph
1
@Christoph sayangnya tidak, karena di Jawa boolean benar-benar hanya boolean. Jadi operasi ternary adalah satu-satunya cara untuk pergi.
Tobias Meister
Hm itu menyedihkan. Bagaimana dengan (""+a).contains("5")||r++?
Christoph
1
@ Christoph itu tidak akan berhasil, karena Anda tidak dapat memiliki ekspresi boolean sendiri. Saya sudah mencoba membuatnya bekerja di tempat lain (seperti deklarasi for-loop) tetapi tidak berhasil. Ide bagus tho;)
Tobias Meister
1

C #, 67 byte

a=>b=>{int c=0;for(;a<=b;)c+=(a+++"").Contains("5")?0:1;return c;};
TheLethalCoder
sumber
Saya berharap untuk menggunakan for(int c=0;...)tetapi kemudian gagal untuk mengkompilasi karena pengembaliannya berada di luar ruang lingkup untukc
TheLethalCoder
1

JavaScript (ES6), 58 56 49 byte

let f =

(s,e)=>{for(c=0;s<=e;)c+=!/5/.test(s++);return c}

console.log(f(1, 9));
console.log(f(4, 17));
console.log(f(-9, -1));

Golf 7 byte berkat produk ETH .

Hristiyan Dodov
sumber
1
Anda dapat menggunakan c+=!/5/.test(s++)untuk menyimpan beberapa byte :-)
ETHproduk
Terima kasih banyak! Saya harus menghapus golf saya. Saya sangat bangga dengan mereka. :(
Hristiyan Dodov
Saya pikir Anda dapat menggunakan currying ie` s => e => `
TheLethalCoder
The top jawaban menggunakan currying sintaks. Saya tidak akan mengedit milik saya karena akan menjadi hampir sama. Terima kasih telah menunjukkannya!
Hristiyan Dodov
1

MATL , 10 byte

&:!V53-!As

Cobalah online!

Penjelasan

        % Implicitly grab two input arguments
&:      % Create an array from [input1....input2]
!V      % Convert to a string where each number is it's own row
53-     % Subtract ASCII '5' from each character.
!A      % Detect which rows have no false values (no 5's). Returns a logical array
s       % Sum the logical array to get the # numbers without 5's
        % Implicitly display the result
Suever
sumber
1

C #, 77 byte

(n,m)=>{var g=0;for(var i=n;i<m+1;i++)g+=(i+"").Contains("5")?0:1;return g;};

Panggilan lambda anonim.

Menggunakan n(nomor pertama) dan m(nomor terakhir) sebagai input, lalu memeriksa melalui penahanan string ( "".Contains("")).

lebih kaya
sumber
Saya bukan orang yang downvoting, tetapi modulo 5 bukan solusi yang tepat untuk tantangan yang diberikan oleh OP. Itu harus mengecualikan apa pun yang mengandung digit 5dalam nomornya, jadi 10(yang jawaban Anda tidak akan dihitung) harus dihitung.
Kevin Cruijssen
@KevinCruijssen Diperbaiki.
devRicher
Ini tidak dikompilasi seperti gharus diinisialisasi ketika dinyatakan seperti itu dinamai varsehingga Anda perlu var g="";dan Anda dapat menggunakan currying yaitun=>m=>
TheLethalCoder
Ini juga menampilkan daftar bukan hitungan
TheLethalCoder
1
@KevinCruijssen Dengan hasil edit Anda ini pada dasarnya adalah jawaban saya ...
TheLethalCoder
1

Sebenarnya , 13 byte

u@x`$'5íuY`░l

Cobalah online!

Penjelasan:

u@x`$'5íuY`░l
u@x            range(a, b+1)
   `$'5íuY`░   take where:
    $            string representation
     '5íuY       does not contain "5"
            l  length
Mego
sumber