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.


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


(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).


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.


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)

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

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

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!


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.

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

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



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>


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.


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


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

3

PowerShell, 42 41 byte

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

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


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


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

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.


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`

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.


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.


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 !


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;};

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 .


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

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("")).


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.