Bana beş vermeyin!


38

Soru:

Bir dizinin başlangıç ​​ve bitiş tam sayıları size verilecektir ve içindeki rakamı içermeyen tam sayıları döndürmelisiniz 5. Başlangıç ​​ve bitiş numaraları dahil edilmelidir!

Örnekler:

1,9 → 1,2,3,4,6,7,8,9 → Sonuç 8

4,17 → 4,6,7,8,9,10,11,12,13,14,16,17 → Sonuç 12

50,60 → 60 → Sonuç 1

-59, -50 → → Sonuç 0

Sonuç beş içerebilir.

Başlangıç ​​numarası her zaman bitiş numarasından daha küçük olacaktır. Her iki sayı da negatif olabilir!

Çözümlerinizi ve çözme şeklinizi çok merak ediyorum. Belki biriniz kolay saf bir matematik çözümü bulacaksınız.

Düzenle Bu bir kod golf mücadelesidir, bu yüzden en kısa kod kazanır.


3
@ betseq: Çok yakın; fakat bunun değişken bir aralığı var (ve modulo gerektirmiyor).
Titus

4
En kısa kodu kazanma kriteri ve kod-golf etiketi olarak tavsiye ederim (öyle olmadığını bile anlamadım!). Ayrıca, muhtemelen 50 veya 500'ü kapsayan bir test davası koymalısınız; Ayrıca belki -50 ya da 0'ı da kapsayan biri iyi bir fikir olacaktır.
Jonathan Allan,

1
@ JonathanathanAlan: Örnekleri güncelleyeceğim.
Arasuvel

4
Test durumda: 50, 59 -> 0.
Zgarb

14
Diyorsunuz: "Başlangıç ​​numarası daima son numaradan küçük olacaktır." ama örneklerinden biri (-50, -59) doğrudan bununla çelişiyor
theonlygusti

Yanıtlar:


21

JavaScript (ES6), 36 33 bayt

Karıştırma sözdizimi ile girdi alır (a)(b).

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

Biçimlendi ve yorumlandı

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

Test durumları


(Ben normalde tercih testüzerinde execsadece bir boolean gerektiğinde.)
Neil

@Neil Bu gerçekten daha mantıklı. Güncellenmiş.
Arnauld,

Not: ES6 currying sözdizimi hakkında bir ipucu bulamadım, bu yüzden bir tane yazdım .
Arnauld,

5
@TheLethalCoder b<atüm numaralardan sayma sonra Özyinelemeyi kadarla etmektir biçin ayani sadece sonsuz döngüye olur kaldırarak.
ETHProductions

1
@HristiyanDodov isimsiz dış işlev alır aargüman olarak ve döner Ffonksiyonu, sırayla alır bargüman olarak ve - dan yinelemenizi yinelemeli denir - Fark olarak bkarşı abir içermeyen tüm tamsayılar için bir sayıcı 5onların ondalık temsilidir.
Arnauld,

17

Jöle , 8 7 bayt

Dennis sayesinde -1 bayt (sayıya indekslemenin bu sayıya ondalık liste gibi davranması gerçeğini kullanın)

rAw€5¬S

TryItOnline!

Nasıl?

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

* Mutlak değer atomu, Aondalık bir listeye yapılan bir negatif sayının, hiçbiri asla olmayacak olan negatif girişlere sahip olması nedeniyle gereklidir 5(verilen örnek, iki yerine sekiz'in tamamını sayar).


rAw€5¬Sbir bayt kaydeder.
Dennis

@Dennis teşekkürler! Açıklamam "bu sayıyı ondalık liste olarak görür" doğru mu?
Jonathan Allan,

2
Hemen hemen. wondalık basamağa bir tamsayı argümanı yazar.
Dennis


13

2sable , 6 5 bayt

Adnan sayesinde bir bayt kaydedildi

Ÿ5¢_O

Çevrimiçi deneyin!

açıklama

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

Not: Bu ¢, işlevin listedeki eşleşen öğeleri saymak yerine her bir öğeye kendisini uygulamasını sağlamadaki bir hata nedeniyle çalışır .


`Dizilerde aynı davrandığı gibi kaldırabilirsiniz : s.
Adnan

@Adnan: Teşekkürler! Bunu test
edecektim

9

Python2, 59 55 52 51 47 43 42 bayt

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

Özyinelemeli bir çözüm. Mantıksal operatörleri kullanarak bir çözüm bulma konusunda bana motivasyon verdiği için @xnor'a teşekkürler ! Ayrıca, beni yönlendiren ve baytı 43'ten 42'ye kesen @JonathanAllan ve @ xnor'a teşekkürler !

43 byte'taki diğer denemeler

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)

Çalışır if!`x`.count('5')mı?
Titus,

2
@Titus Python, C benzeri dillerde olan bir notoperatöre sahiptir !, ancak bu 3 bayt alır :(
Yytsi

1
Mantıksal kısa devreyi andve ile kullanmayı düşünün or.
xnor

1
Evet, güzel bitti! Şimdi bunu kısaltmayı düşünün not.
xnor

1
Gerçekten yakınsın! Denemeye devam et.
xnor


6

05AB1E , 8 7 6 bayt

Adnan sayesinde bir bayt kaydedildi

Ÿ5.å_O

Çevrimiçi deneyin!

açıklama

Ÿ         # inclusive range
 5.å      # map 5 in y for each y in the list
    _     # logical negation 
     O    # sum

05AB1E ayrıca vektörleştirildi å, yani Ÿ5.å_O6 bayt için yapabilirsiniz .
Adnan

negateanlamı -nya da n==0?1:0?
ETHProductions

@ETHproductions: Üzgünüm, belirsizdi. Mantıksal olumsuzlama demek istemiştim, yanin==0?1:0
Emigna

6

Pyth, 9 8 bayt

FryAmTheEggman sayesinde bir bayt kaydedildi!

lf-\5T}E

Açıklama:

        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

Çevrimiçi deneyin!


5

Perl 6 , 23 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır

{                     }  # 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 bayt

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

Çevrimiçi deneyin! Kullanımı:

Prelude> 4 ! 17
12

Açıklama:

             [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 bayt

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

Kullanımı:

> 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 bayt

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

İle koş php -r '<code>' <a> <b>


Bu PHP7.1 sözdizimi değil mi?
17'de

@ aross: Öyle. Fakat PHP 7.1 5 saatten daha eski ( 1 Aralık'ta yayınlandı )
Titus

1
Tabii ki, sadece 7 ya da üstü ise sürümü belirtmeye alıştığım için sordum. Bu aynı zamanda Python için yapılan bir tür
kongredir

1
PHP Sözleşmesi - gördüğüm kadarıyla - aksi belirtilmediği sürece en son sürümü kullanmaktır.
Titus

Çoğu insanın en son sürümüne sahip olduğunu sanmıyorum. Şu anda en az yaygın payda muhtemelen 5.5 olacaktır. Şahsen ben şu anda PHP 7.0 dağıtan FC 25 (oldukça gelişmiş sayılır) kullanıyorum. Windows kullanıyorsanız, muhtemelen el ile güncellemeniz gerekir.
17:17

4

Mathematica, 46 44 42 bayt

Her biri 2 bayt kurtardığı için alephalpha ve DavidC'ye teşekkürler!

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

Adsız işlev, iki tamsayı argümanı alarak ve bir tamsayı döndürür. IntegerDigits@Range@##girişler arasındaki tüm sayıları sayı listelerine dönüştürür; FreeQ@5hangilerinin içermediğine karar vermek için bu listeleri test eder 5. Daha sonra Boole, booleans'ı sıfırlara ve Trbunlara dönüştürür ve sonuçları toplar.

Diğer çözümler (44 ve 47 bayt):

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

IntegerDigits@x~FreeQ~5Bir sayının hane listesinin 5s içermediğini belirler Count[Range@##,x_/;...]&ve girişler arasındaki kaç sayıyı o testi geçeceğini sayar.

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

1##&@@IntegerDigits@#-5bir sayının hane listesini alır, hepsinden 5 çıkarır ve cevapları bir araya getirir; Sign[...]^2daha sonra sıfır olmayan tüm sayıları 1'e dönüştürür.


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

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

3

Ruby, 36 35 bayt

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

-1 bayt için IMP1


1
Bu, listeyi, listenin boyutundan ziyade 5 içeren sayılar olmadan döndürmez mi?
IMP 1

Haklısın, yanlış sürümü kopyaladım / yapıştırdım.
GB

1
Ayrıca kullanabilirsiniz ?5( '5'yerine karakterini) /5bir byte kaydetmek için arama / '.
IMP 1

3

Java 7, 80 78 bayt

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

Ungolfed:

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

Test kodu:

Burada dene.

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

Çıktı:

8
12

3

PowerShell, 42 41 bayt

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

Komut satırından çağırıldı. \ No5s.ps1 1 20


1
Bir bayttan tasarruf etmek için alanı bırakabilirsiniz. Kesinlikle sayısal regex modelleriyle, sınırlayıcıya (örneğin -replace3veya -split1veya -notmatch5) ihtiyacınız yoktur.
AdmBorkBork

Ah, güzel, teşekkürler @AdmBorkBork
mcmurdo

2

Python 2, 61 56 bayt

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

TukkaaX sayesinde -5 bayt


Cesaretini kırma! Eğlenmek ve kendinize meydan okumak önemli olan şeydir. İki boşluk not "5" inalanını :) 'dan kaldırabilirsiniz. Ayrıca, Python2 kullanıyorsanız x, yapmak yerine `` quotes ile kuşatabilirsiniz str(x).
Yytsi,

@TuukkaX Teşekkürler! ayrıca ve x arasındaki boşluk kaldırıldı
sagiksp

Kaldırabilirsiniz []. Ayrıca daha önce boşluğa ihtiyacınız yok if.
Dennis

@Dennis Ben zaten denedim, ama "jeneratör" türünde nesnenin len () olmadığından şikayetçi.
Yytsi,

@TuukkaX Sağ. lambda a,b:sum(not"5"in`n`for n in range(a,b+1))olsa çalışır. tio.run/nexus/…
Dennis

2

Swift 52 bayt

($0...$1).filter { !String($0).contains("5") }.count

Mücadeleniz bir kodlama mücadelesi olduğu için, bayt sayınızı eklemelisiniz. Ayrıca, codegolf'ta (en azından burada), tüm programların gerçekten yarışması gereken bir gerekliliktir (örneğin, işlev adınız yalnızca tek bir karakter olabilir, gerçek işleviniz muhtemelen tek bir satıra indirgenebilir). Bilmiyorum Swift, beni düzeltmem gerekebilir.
clismique

2

Toplu, 95 bayt

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

El ile döngü bazı baytları kurtarır, çünkü yine de bir değişkende döngü sayacına ihtiyacım var.


2

PHP, 56 bayt

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

Bu şekilde koş:

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

PHP 7.1 için bir sürüm 53 bayttır (Titus'a verilen krediler):

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

açıklama

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, trimtekrardan ikinci parametreyi unuttum .
Titus

2

CJam "kolay saf matematik çözümü", 60

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

Çevrimiçi deneyin

Bir dizideki sayıları herhangi bir sırayla alır.

Açıklama:

Bir çekirdek problem, f (n) = herhangi bir pozitif n için 1'den n'ye (dahil olmayan) 5 olmayan sayıların sayısını hesaplamaktır. Cevap şudur: n'in ondalık hanesini alın, ilk 5'ten sonra (varsa) tüm basamakları 9 ile değiştirin, ardından tüm basamakları 5..9 ile 4..8 (azalış) ile değiştirin ve taban 9'dan dönüştürün. Örneğin 1752 → 1759 → 1648 → 1 * 9 ^ 3 + 6 * 9 ^ 2 + 4 * 9 + 8 = 1259. Temel olarak, her basamak konumu 9 kabul edilebilir değere sahiptir ve 5xxxx 49999'a eşdeğerdir, çünkü aralarında artık geçerli sayılar yoktur.

Bunu çözdükten sonra birkaç vakamız var: eğer giriş sayıları (a ve b diyelim, a <b) (kesinlikle) pozitifse, sonuç f (b) -f (a-1) olur. Eğer negatiflerse, mutlak değerleri alabilir, yeniden sıralayabilir ve aynı hesaplamayı kullanabiliriz. Ve eğer bir <= 0 <= b ise sonuç f (-a) + f (b) +1 olur.

Program ilk önce yukarıda açıklandığı gibi F işlevini uygular (ancak bir dizideki her sayıya uygulanır), daha sonra girişi okur, sayıları mutlak değere dönüştürür ve yeniden sıralar ve aşağıdaki 2 hesaplamadan birini kullanır. * b> 0 başlangıçta.


"Saf" değil ama güzel bir yöntem. burada, +1 :) olsun
Matthew Roh

@MatthewRoh teşekkürler, ama saf değil derken ne demek istiyorsun? Bu, giriş sayıları üzerinde matematiksel hesaplamaları doğrudan aralık içinde yineleme yapmadan doğrudan yönlendiren bir çözümdür. Başka ne bekliyordun?
aditsu

2

Python 2 , 54 bayt

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

Çevrimiçi deneyin!

En kısa Python cevabı değil Aynı algoritmayı kullanır, ancak bir süre döngüsü ile uygulamanın farklı bir yoludur ve bir lambda işlevi değildir.


Bir programdır, bir fonksiyon değildir ve yerine kullanılır. Farklı olmayan ne? Tamam, hala artan girdi içinde bir "5" stringi arıyor, kabul etti. Daha iyi bir yolu var mı?
ElPedro

Bu tam olarak ne ve bu yüzden ertelemeli. Üzgünüm, belki de yorumumu farklı yapmalıydım.
ElPedro,

Aynı algoritma, uygulamanın farklı yolu. Yorumlarınızla bir sorunum yok. Bu daha iyi ifade edilmiş mi?
ElPedro

Evet, :) Yorum bölümünün temiz görünmesini sağlamak için bu yorumları kaldıracağım.
Yytsi,

1

Java 7, 77 bayt

Bu Kevins Cevabının bir gelişimidir , ancak henüz yorum yapacak itibarımız olmadığından, bu yeni cevabın yapması gerekecek.

Öyleyse yaptığım şey:

  • indexOfİfadeleri contains(-1 bayt) ile değiştir
  • For-loop'un artan kısmını koşullu ifadeye (-2 bayt) taşıyın

döngü için ( 77 bayt ):

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

özyinelemeli ( 79 bayt ):

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

Çıktı:

8
12

8
12

Burada test et !


PPCG'ye Hoşgeldiniz! Zaten oldukça güzel bir golf cevabında güzel bulgular. Ben çok ama olmaması gerektiğini Java bilmem (""+a).contains("5")?0:1tarafından Değişebilir olmak !(""+a).contains("5")?
Christoph

1
@Christoph ne yazık ki hayır, çünkü Java'da bir boole gerçekten sadece bir boole. Yani üçlü bir operasyon gitmek için tek yoldur.
Tobias Meister,

Hm bu üzücü. Ne hakkında (""+a).contains("5")||r++?
Christoph

1
@Christoph da işe yaramaz, çünkü kendi başına bir boole ifadesi olamaz. Başka yerlerde (for döngüsü beyanı gibi) çalışmasını sağlamaya çalıştım ama çok başarılı olamadım. Güzel fikir tho;)
Tobias Meister


1

JavaScript (ES6), 58 56 49 bayt

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

ETHproductions sayesinde 7 bayt golf oynadı .


1
c+=!/5/.test(s++)Birkaç byte tasarruf yapmak için kullanabilirsiniz :-)
ETHproductions

Çok teşekkürler! Yine de golfleri silmek zorunda kaldım. Onlarla çok gurur duyuyordum. :(
Hristiyan Dodov

Sanırım currying'i kullanabilirsiniz yani `s => e =>`
TheLethalCoder

En üstteki cevap körleme sözdizimini kullanıyor. Benimkini düzenlemeyeceğim çünkü neredeyse aynı olacaktı. Buna dikkat çektiğin için teşekkürler!
Hristiyan Dodov

1

MATL , 10 bayt

&:!V53-!As

Çevrimiçi deneyin!

açıklama

        % 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 bayt

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

İsimsiz lambda çağrısı.

Giriş olarak n(ilk sayı) ve m(son sayı) kullanır , daha sonra dize tutma ( "".Contains("")) ile denetlenir .


Oyu düşüren ben değilim, ama Modulo 5 OP tarafından verilen zorluk için doğru çözüm değil. Rakamıyla rakam içeren herhangi bir şeyi hariç tutmalı 5, bu nedenle 10(cevabınız sayılmaz) sayılmalıdır.
Kevin Cruijssen

@KevinCruijssen Sabit.
devRicher

Bu şekilde derleme değil gbelirtti zaman adlandırılmıştır olarak başlatılmak zorundadır varihtiyacınız böylece var g="";ve kullanabileceğiniz tımar yanin=>m=>
TheLethalCoder

Ayrıca bu sayı sayılmaz, listenin çıktısını alır
TheLethalCoder

1
@KevinCruijssen Düzenlemelerinizle bu aslında benim cevabım ...
TheLethalCoder

1

Aslında , 13 bayt

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

Çevrimiçi deneyin!

Açıklama:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.