Nie dawaj mi pięciu!

38

Pytanie:

Otrzymasz początkową i końcową liczbę całkowitą sekwencji i powinieneś zwrócić liczbę liczb całkowitych, które nie zawierają cyfry 5. Należy podać numery początkowe i końcowe!

Przykłady:

1,9 → 1,2,3,4,6,7,8,9 → Wynik 8

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

50,60 → 60 → Wynik 1

-59, -50 → → Wynik 0

Wynik może zawierać pięć.

Numer początkowy zawsze będzie mniejszy niż numer końcowy. Obie liczby mogą być również ujemne!

Jestem bardzo ciekawy twoich rozwiązań i sposobu ich rozwiązania. Może ktoś z was znajdzie proste rozwiązanie z czystej matematyki.

Edytuj Jest to wyzwanie polegające na grze w golfa, więc wygrywa najkrótszy kod.

Arasuvel
źródło
3
@betseq: To blisko; ale ten ma zmienny zakres (i nie wymaga modulo).
Tytus
4
Polecam najkrótszy kod jako kryterium zwycięstwa i tag code-golf (nawet nie zauważyłem, że tak nie było!). Ponadto prawdopodobnie powinieneś umieścić przypadek testowy obejmujący 50 lub 500; także może taki, który obejmuje -50, i taki, który obejmuje 0, byłby dobrym pomysłem.
Jonathan Allan
1
@JonathanAllan: zaktualizuję przykłady.
Arasuvel
4
Przypadek testowy: 50, 59 -> 0.
Zgarb,
14
Mówisz: „Numer początkowy zawsze będzie mniejszy niż numer końcowy”. ale jeden z twoich przykładów (-50, -59) bezpośrednio temu przeczy
theonlygusti

Odpowiedzi:

21

JavaScript (ES6), 36 33 bajtów

Pobiera dane wejściowe ze składnią curry (a)(b).

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

Sformatowane i skomentowane

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

Przypadki testowe

Arnauld
źródło
(I zwykle wolą testna execkiedy trzeba tylko wartość logiczną.)
Neil
@ Neil To rzeczywiście ma więcej sensu. Zaktualizowano
Arnauld,
NB: Nie mogłem znaleźć żadnej wskazówki na temat składni curry ES6, więc napisałem jedną .
Arnauld,
5
@TheLethalCoder b<ama za zadanie zatrzymać rekurencję po zliczeniu wszystkich liczb od bdo a, więc usunięcie jej spowodowałoby nieskończoną rekurencję.
ETHprodukcje
1
@HristiyanDodov Nienazwana funkcja zewnętrzna przyjmuje ajako argument i zwraca Ffunkcję, która z kolei przyjmuje bjako argument i - jak zauważyłeś - jest wywoływana rekurencyjnie w celu iteracji od bdo a, zwiększając licznik dla wszystkich liczb całkowitych, które nie zawierają 5dziesiętnych reprezentacja.
Arnauld,
17

Galaretka , 8 7 bajtów

-1 bajt dzięki Dennisowi (użyj faktu, że indeksowanie do liczby traktuje tę liczbę jako listę dziesiętną)

rAw€5¬S

TryItOnline!

W jaki sposób?

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

* Wartość bezwzględna atom Ajest niezbędna, ponieważ liczba ujemna rzutowana na listę dziesiętną zawiera wpisy ujemne, z których żadna nigdy nie byłaby liczbą 5(podany przykład liczyłby wszystkie osiem zamiast dwóch).

Jonathan Allan
źródło
rAw€5¬Szapisuje bajt.
Dennis,
@Dennis dzięki! Czy mój opis „traktuje tę liczbę jako listę dziesiętną” jest dokładny?
Jonathan Allan,
2
Dosyć. wrzuca argument liczby całkowitej na swoje cyfry dziesiętne.
Dennis,
13

2sable , 6 5 bajtów

Oszczędność bajtu dzięki Adnanowi

Ÿ5¢_O

Wypróbuj online!

Wyjaśnienie

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

Uwaga: Działa to z powodu błędu ¢powodującego, że funkcja stosuje się do każdego elementu zamiast zliczania pasujących elementów na liście.

Emigna
źródło
Możesz usunąć, `ponieważ zachowuje się tak samo na tablicach: p.
Adnan
@Adnan: Dzięki! Miałem to przetestować, ale zapomniałem;)
Emigna
9

Python2, 59 55 52 51 47 43 42 bajty

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

Rozwiązanie rekurencyjne. Dzięki @xnor za motywację do znalezienia rozwiązania za pomocą operatorów logicznych! Ponadto, dzięki @JonathanAllan i @xnor za prowadzenie mnie i dzielenie bajtu z 43 na 42!

Inne próby przy 43 bajtach

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
źródło
Czy if!`x`.count('5')zadziała?
Tytus
2
@Titus Python ma notoperatora, który jest !w językach podobnych do C, ale zajmuje 3 bajty :(
Yytsi
1
Pomyśl o użyciu logicznego zwarcia za pomocą andi or.
xnor
1
Tak, ładnie zrobione! Pomyśl teraz o skróceniu tego not.
xnor
1
Jesteś naprawdę blisko! Próbuj dalej.
xnor
6

Narzędzia Bash / Unix, 21 bajtów

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

Wypróbuj online!

Mitchell Spector
źródło
6

05AB1E , 8 7 6 bajtów

Oszczędność bajtu dzięki Adnanowi

Ÿ5.å_O

Wypróbuj online!

Wyjaśnienie

Ÿ         # inclusive range
 5.å      # map 5 in y for each y in the list
    _     # logical negation 
     O    # sum
Emigna
źródło
05AB1E ma również wektoryzację å, co oznacza , że możesz zrobić Ÿ5.å_Odla 6 bajtów.
Adnan
negateznaczenie -nlub n==0?1:0?
ETHproductions
@ETHproductions: Przepraszam, to nie było jasne. Miałem na myśli logiczną negację, więcn==0?1:0
Emigna
6

Pyth, 9 8 bajtów

Oszczędność bajtu dzięki FryAmTheEggman!

lf-\5T}E

Wyjaśnienie:

        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

Wypróbuj online!

busukxuan
źródło
5

Perl 6 , 23 bajtów

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

Wypróbuj online!

Jak to działa

{                     }  # 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.
smls
źródło
5

Haskell , 39 bajtów

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

Wypróbuj online! Stosowanie:

Prelude> 4 ! 17
12

Wyjaśnienie:

             [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
źródło
4

R, 33 bajty

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

Stosowanie:

> 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
źródło
4

Groovy, 47 45 43 40 bajtów

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

To jest nienazwane zamknięcie. findAlljest podobny do dodawania ifwarunku do listy w Pythonie.

Wypróbuj online!

Gurupad Mamadapur
źródło
4

PHP 7.1, 57 55 bajtów

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

Biegnij z php -r '<code>' <a> <b>

Tytus
źródło
Czy to nie jest składnia PHP7.1?
aross
@aross: Tak jest. Ale PHP 7.1 jest starszy niż 5 godzin ( opublikowany 1 grudnia )
Tytus
1
oczywiście, właśnie zapytałem, bo jestem przyzwyczajony do określania wersji, jeśli jest to 7 lub nowsza wersja. To także rodzaj konwencji dla Pythona
aross
1
Konwencja dla PHP - o ile widziałem - ma używać najnowszej wersji, chyba że określono inaczej.
Tytus
Nie sądzę, aby wiele osób miało najnowszą wersję pomniejszą. Najmniejszym obecnie mianownikiem byłby prawdopodobnie 5,5. Osobiście używam FC 25 (uważanego za całkiem nowatorski), który obecnie dystrybuuje PHP 7.0. Jeśli korzystasz z systemu Windows, prawdopodobnie musisz zaktualizować ręcznie.
aross
4

Mathematica, 46 44 42 bajtów

Dziękujemy alephalpha i DavidC za zaoszczędzenie 2 bajtów każdy!

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

Funkcja bez nazwy, która przyjmuje dwa argumenty liczb całkowitych i zwraca liczbę całkowitą. IntegerDigits@Range@##konwertuje wszystkie liczby między danymi wejściowymi na listy cyfr; FreeQ@5testuje te listy, aby zdecydować, które nie zawierają żadnych 5. Następnie Boolekonwertuje booleany na zera i jedynki i Trsumuje wyniki.

Inne rozwiązania (44 i 47 bajtów):

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

IntegerDigits@x~FreeQ~5określa, czy lista cyfr liczby jest wolna od 5s, i Count[Range@##,x_/;...]&zlicza, ile liczb między wejściami przechodzi ten test.

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

1##&@@IntegerDigits@#-5pobiera listę cyfr liczby, odejmuje 5 od wszystkich i mnoży odpowiedzi razem; Sign[...]^2następnie konwertuje wszystkie niezerowe liczby na 1.

Greg Martin
źródło
1
Count[Range@##,x_/;IntegerDigits@x~FreeQ~5]&
DavidC,
1
Tr@Boole[FreeQ@5/@IntegerDigits@Range@##]&
alephalpha
3

Rubin, 36 35 bajtów

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

Thx IMP1 dla -1 bajtu

GB
źródło
1
Czy to nie zwraca listy bez liczb zawierających 5 zamiast wielkości tej listy?
IMP1
Masz rację, skopiowałem / wkleiłem niewłaściwą wersję.
GB
1
Możesz także użyć ?5( '5'znaku) zamiast /5/ w wyszukiwaniu, aby zapisać bajt.
IMP1
3

Java 7, 80 78 bajtów

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

Nie golfowany:

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

Kod testowy:

Wypróbuj tutaj.

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

Wydajność:

8
12
Kevin Cruijssen
źródło
3

PowerShell, 42 41 bajtów

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

Wywoływany z wiersza poleceń jako. \ No5s.ps1 1 20

mcmurdo
źródło
1
Możesz upuścić miejsce, aby zaoszczędzić bajt. Przy ściśle numerycznych wzorcach wyrażeń regularnych nie potrzebujesz separatora (np. -replace3Lub -split1lub -notmatch5).
AdmBorkBork
Ach, miło, dziękuję @AdmBorkBork
mcmurdo
2

Python 2, 61 56 bajtów

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

-5 bajtów dzięki tukkaaX

sagiksp
źródło
Nie zniechęcaj się! Liczy się zabawa i wyzwanie. Możesz usunąć dwa białe znaki w not "5" in:) Ponadto, jeśli używasz Python2, możesz otaczać xsię cudzysłowami zamiast robić str(x).
Yytsi
@TuukkaX Thanks! usunięto również spację między in i `
x`
Możesz usunąć []. Nie potrzebujesz też wcześniej miejsca if.
Dennis,
@Dennis Próbowałem już tego, ale narzeka, że ​​„obiekt typu„ generator ”nie ma len ()”.
Yytsi
@TuukkaX Right. lambda a,b:sum(not"5"in`n`for n in range(a,b+1))działa jednak. tio.run/nexus/…
Dennis
2

Szybkie 52 bajty

($0...$1).filter { !String($0).contains("5") }.count
Arasuvel
źródło
Ponieważ twoje wyzwanie jest wyzwaniem dla kodegolfa, powinieneś podać swoją liczbę bajtów. Ponadto w codegolf (przynajmniej tutaj) wymagane jest, aby wszystkie programy musiały się ze sobą rywalizować (np. Nazwa funkcji może być tylko jednym znakiem, faktyczna funkcja może być prawdopodobnie zredukowana do jednej linii). Nie znam Swift, być może będziesz musiał mnie poprawić.
clismique
2

Partia, 95 bajtów

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

Ręczne zapętlanie oszczędza niektóre bajty, ponieważ i tak potrzebuję licznika pętli w zmiennej.

Neil
źródło
2

PHP, 56 bajtów

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

Uruchom tak:

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

Wersja dla PHP 7.1 miałaby 53 bajty (napisy dla Tytusa):

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

Wyjaśnienie

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
źródło
Ah dang, trimznowu zapomniałem o drugim parametrze.
Tytus
2

CJam „łatwe czyste matematyczne rozwiązanie”, 60

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

Wypróbuj online

Przybiera liczby w dowolnej kolejności, w tablicy.

Wyjaśnienie:

Jednym z podstawowych problemów jest obliczenie f (n) = liczby innych niż 5 liczb od 1 do n (włącznie) dla dowolnego dodatniego n. Odpowiedź brzmi: weź cyfry dziesiętne n, zamień wszystkie cyfry po pierwszych 5 (jeśli istnieją) na 9, a następnie zamień wszystkie cyfry 5..9 na 4..8 (zmniejszenie) i przekonwertuj z podstawy 9. Np. 1752 → 1759 → 1648 → 1 * 9 ^ 3 + 6 * 9 ^ 2 + 4 * 9 + 8 = 1259. Zasadniczo każda pozycja cyfr ma 9 dopuszczalnych wartości, a 5xxxx odpowiada 49999, ponieważ między nimi nie ma już żadnych poprawnych liczb.

Po rozwiązaniu tego mamy kilka przypadków: jeśli liczby wejściowe (powiedzmy aib, a <b) są (ściśle) dodatnie, to wynikiem jest f (b) -f (a-1). Jeśli są one ujemne, możemy wziąć wartości bezwzględne, zmienić ich kolejność i użyć tych samych obliczeń. A jeśli a <= 0 <= b, to wynikiem jest f (-a) + f (b) +1.

Program najpierw implementuje funkcję F, jak opisano powyżej (ale stosuje się do każdej liczby w tablicy), a następnie odczytuje dane wejściowe, konwertuje liczby na wartość bezwzględną i zmienia ich kolejność, i wykorzystuje jedno z 2 powyższych obliczeń, w oparciu o to, czy * b> 0 początkowo.

aditsu
źródło
Nie „czysta”, ale miła metoda. tutaj zdobądź +1 :)
Matthew Roh
@MatthewRoh dzięki, ale co masz na myśli mówiąc „nie czysty”? Jest to rozwiązanie, które wykonuje bezpośrednie obliczenia matematyczne na liczbach wejściowych, bez iteracji w całym zakresie. Czego jeszcze się spodziewałeś?
aditsu
2

Python 2 , 54 bajty

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

Wypróbuj online!

Nie najkrótsza odpowiedź w Pythonie Używa tego samego algorytmu, ale inny sposób implementacji z pętlą while i nie jest funkcją lambda.

ElPedro
źródło
Jest to program, a nie funkcja, i używa while zamiast zamiast. Co nie jest inaczej Zgadza się, nadal szuka ciągu „5” wewnątrz zwiększonego wejścia. Czy jest lepszy sposób?
ElPedro,
Właśnie to jest i dlatego jest uszanowany. Przepraszam, może powinienem zmienić mój komentarz.
ElPedro
Ten sam algorytm, inny sposób implementacji. Nie ma problemu z twoimi komentarzami. Czy to jest lepiej sformułowane?
ElPedro
Tak, :) Usunę te komentarze, aby sekcja komentarzy wyglądała czysto.
Yytsi
1

Java 7, 77 bajtów

To ulepszenie Kevins Answer , ale ponieważ nie mam jeszcze reputacji, aby komentować, ta nowa odpowiedź będzie musiała wystarczyć.

Więc co zrobiłem to:

  • Zamień indexOfinstrukcje na contains(-1 bajt)
  • Przenieś inkrementującą część pętli for do instrukcji warunkowej (-2 bajty)

pętla for ( 77 bajtów ):

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

rekurencyjny ( 79 bajtów ):

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

Wydajność:

8
12

8
12

Sprawdź to tutaj !

Tobias Meister
źródło
Witamy w PPCG! Niezłe wyniki w już i tak ładnie golfowej odpowiedzi. Nie znam się zbytnio na Javie, ale nie powinienem (""+a).contains("5")?0:1jej zastąpić !(""+a).contains("5")?
Christoph
1
@Christoph niestety nie, ponieważ w Javie wartość logiczna naprawdę jest tylko wartością logiczną. Tak więc operacja trójskładnikowa jest jedyną drogą.
Tobias Meister
Hm, to smutne. Co (""+a).contains("5")||r++?
Christoph
1
@Christoph, który też nie będzie działał, ponieważ nie możesz sam mieć wyrażenia boolowskiego. Próbowałem sprawić, by działał w innych miejscach (takich jak deklaracja for-loop), ale bez powodzenia. Fajny pomysł;)
Tobias Meister
1

C #, 67 bajtów

a=>b=>{int c=0;for(;a<=b;)c+=(a+++"").Contains("5")?0:1;return c;};
TheLethalCoder
źródło
Miałem nadzieję, że skorzystam, for(int c=0;...)ale potem kompilacja się nie powiedzie, ponieważ zwrot jest poza zakresemc
TheLethalCoder
1

JavaScript (ES6), 58 56 49 bajtów

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

Grał w golfa 7 bajtów dzięki produktom ETH .

Hristiyan Dodov
źródło
1
Możesz użyć, c+=!/5/.test(s++)aby zaoszczędzić kilka bajtów :-)
ETHprodukcje
Wielkie dzięki! Musiałem jednak usunąć swoje golfa. Byłem z nich taki dumny. :(
Hristiyan Dodov
Myślę, że możesz użyć curry, tj. S => e => `
TheLethalCoder
Top odpowiedź zastosowania currying składnię. Nie będę edytować mojego, ponieważ stałby się prawie taki sam. Dzięki za wskazanie tego!
Hristiyan Dodov
1

MATL , 10 bajtów

&:!V53-!As

Wypróbuj online!

Wyjaśnienie

        % 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
źródło
1

C #, 77 bajtów

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

Anonimowe połączenie lambda.

Używa n(pierwsza liczba) i m(ostatnia liczba) jako danych wejściowych, a następnie sprawdza poprzez zawarcie ciągu ( "".Contains("")).

devRicher
źródło
Nie jestem zwolennikiem głosowania, ale modulo 5 nie jest właściwym rozwiązaniem dla wyzwania postawionego przez OP. Powinno to wykluczać wszystko, co zawiera cyfrę 5w jej numerze, więc 10(której odpowiedź by się nie liczyła) należy policzyć.
Kevin Cruijssen,
@KevinCruijssen Naprawiono.
devRicher
Nie kompiluje się, jak gtrzeba zainicjować, gdy jest podana tak, jak to się nazywa, varwięc potrzebujesz var g="";i możesz używać n=>m=>
curry,
To także wyświetla listę, a nie liczbę
TheLethalCoder
1
@KevinCruijssen Z twoimi zmianami jest to zasadniczo moja odpowiedź ...
TheLethalCoder
1

Właściwie 13 bajtów

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

Wypróbuj online!

Wyjaśnienie:

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
źródło