Non darmi cinque!


38

Domanda:

Ti verranno dati i numeri interi iniziali e finali di una sequenza e dovresti restituire il numero di numeri interi al suo interno che non contengono la cifra 5. I numeri di inizio e fine dovrebbero essere inclusi!

Esempi:

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

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

50,60 → 60 → Risultato 1

-59, -50 → → Risultato 0

Il risultato può contenere cinque.

Il numero iniziale sarà sempre inferiore al numero finale. Entrambi i numeri possono anche essere negativi!

Sono molto curioso di conoscere le tue soluzioni e il modo in cui le risolvi. Forse qualcuno di voi troverà una semplice soluzione matematica pura.

Modifica Questa è una sfida di code-golf, quindi vince il codice più corto.


3
@betseq: è vicino; ma questo ha un intervallo variabile (e non richiede alcun modulo).
Tito

4
Consiglierei il codice più breve come criterio vincente e il tag code-golf (non ho nemmeno notato che non lo era!). Inoltre, dovresti probabilmente mettere un caso di test che si estende su 50 o 500; anche forse uno che si estende su -50 e uno che si estende su 0 sarebbe una buona idea.
Jonathan Allan,

1
@JonathanAllan: aggiornerò degli esempi.
Arasuvel,

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

14
Dici: "Il numero iniziale sarà sempre più piccolo del numero finale". ma uno dei tuoi esempi (-50, -59) contraddice direttamente questo
theonlygusti,

Risposte:


21

JavaScript (ES6), 36 33 byte

Riceve input con la sintassi del curry (a)(b).

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

Formattato e commentato

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

Casi test


(Io di solito preferisco testpiù di execquando hai solo bisogno di un valore booleano.)
Neil

@Neil Questo ha davvero più senso. Aggiornato.
Arnauld,

NB: Non sono riuscito a trovare alcun suggerimento sulla sintassi del curry ES6, quindi ne ho scritto uno .
Arnauld,

5
@TheLethalCoder b<aè lì per fermare la ricorsione dopo aver contato tutti i numeri da ba a, quindi rimuoverlo causerebbe solo una ricorsione infinita.
ETHproductions

1
@HristiyanDodov La funzione esterna senza nome prende acome argomento e restituisce la Ffunzione, che a sua volta prende bcome argomento e - come hai notato - viene chiamata ricorsivamente per iterare da ba a, incrementando un contatore per tutti i numeri interi che non contengono un 5nel loro decimale rappresentazione.
Arnauld,

17

Gelatina , 8 7 byte

-1 byte grazie a Dennis (usa il fatto che l'indicizzazione in un numero considera quel numero come un elenco decimale)

rAw€5¬S

TryItOnline!

Come?

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

* L'atomo del valore assoluto Aè necessario poiché un numero negativo trasmesso in un elenco decimale ha voci negative, nessuna delle quali sarebbe mai una5 (l'esempio dato conterebbe tutte e otto anziché due).


rAw€5¬Ssalva un byte.
Dennis,

@Dennis grazie! La mia descrizione "tratta quel numero come un elenco decimale" è accurata?
Jonathan Allan,

2
Abbastanza. wlancia un argomento intero con le sue cifre decimali.
Dennis,


13

2 cifre , 6 5 byte

Salvato un byte grazie ad Adnan

Ÿ5¢_O

Provalo online!

Spiegazione

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

Nota: funziona a causa di un bug nel ¢fare in modo che la funzione si applichi a ciascun elemento invece di contare gli elementi corrispondenti nell'elenco.


È possibile rimuovere `come si comporta allo stesso modo sugli array: p.
Adnan,

@Adnan: grazie! Lo stavo provando ma ho dimenticato;)
Emigna il

9

Python2, 59 55 52 51 47 43 42 byte

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

Una soluzione ricorsiva. Grazie a @xnor per avermi dato la motivazione per trovare una soluzione usando operatori logici! Inoltre, grazie a @JonathanAllan e @xnor per avermi guidato e tagliato il byte da 43 a 42!

Altri tentativi di 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)

Funzionerebbe if!`x`.count('5')?
Tito

2
@Titus Python ha un notoperatore che si trova !in linguaggi simili a C, ma che richiede 3 byte :(
Yytsi

1
Pensa all'utilizzo del corto circuito logico con ande or.
xnor

1
Sì, ben fatto! Ora pensa ad accorciarlo not.
xnor

1
Sei davvero vicino! Continua a provare cose.
xnor


6

05AB1E , 8 7 6 byte

Salvato un byte grazie ad Adnan

Ÿ5.å_O

Provalo online!

Spiegazione

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

05AB1E ha anche vettorializzato å, che è , quindi puoi fare Ÿ5.å_Oper 6 byte.
Adnan,

negatesignificato -n, o n==0?1:0?
ETHproductions

@ETHproductions: mi dispiace, non è chiaro. Intendevo negazione logica, quindin==0?1:0
Emigna,

6

Pyth, 9 8 byte

Salvato un byte grazie a FryAmTheEggman!

lf-\5T}E

Spiegazione:

        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

Provalo online!


5

Perl 6 , 23 byte

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

Provalo online!

Come funziona

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

Provalo online! Uso:

Prelude> 4 ! 17
12

Spiegazione:

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

Uso:

> 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

Groovy, 47 45 43 40 byte

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

Questa è una chiusura senza nome. findAllè simile all'aggiunta di unif condizione nella comprensione di un elenco in Python.

Provalo online!


4

PHP 7.1, 57 55 byte

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

Corri con php -r '<code>' <a> <b>


Questa sintassi di PHP7.1 non è?
aross

@aross: lo è. Ma PHP 7.1 ha più di 5 ore ( pubblicato il 1 ° dicembre )
Tito

1
ovviamente, l'ho appena chiesto perché sono abituato a specificare la versione se è 7 o superiore. Questo è anche il tipo di convenzione per Python
aross

1
La convenzione per PHP - per quanto ho visto - è quella di utilizzare la versione più recente se non diversamente specificato.
Tito

Non credo che molte persone abbiano l'ultima versione secondaria. Il minimo comune denominatore al momento sarebbe probabilmente il 5,5. Personalmente sto usando FC 25 (considerato piuttosto all'avanguardia), che attualmente distribuisce PHP 7.0. Se sei su Windows, probabilmente dovrai aggiornarlo manualmente.
aross

4

Mathematica, 46 44 42 byte

Grazie ad alephalpha e DavidC per aver salvato 2 byte ciascuno!

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

Funzione senza nome che accetta due argomenti interi e restituisce un numero intero. IntegerDigits@Range@##converte tutti i numeri tra gli ingressi in elenchi di cifre; FreeQ@5verifica tali elenchi per decidere quali non ne contengono 5. Quindi Booleconverte i booleani in zeri e uno e Trsomma i risultati.

Altre soluzioni (44 e 47 byte):

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

IntegerDigits@x~FreeQ~5determina se l'elenco delle cifre di un numero è privo di 5 secondi e Count[Range@##,x_/;...]&conta quanti numeri tra gli ingressi superano quel test.

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

1##&@@IntegerDigits@#-5prende l'elenco delle cifre di un numero, sottrae 5 da tutte e moltiplica le risposte insieme; Sign[...]^2quindi converte tutti i numeri diversi da zero in 1.


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

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

3

Rubino, 36 35 byte

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

Grazie IMP1 per -1 byte


1
Questo non restituisce l'elenco senza i numeri contenenti 5, piuttosto che le dimensioni di tale elenco?
IMP1

Hai ragione, ho copiato / incollato la versione sbagliata.
GB

1
Puoi anche usare ?5(il '5'carattere) invece di /5/ nella ricerca per salvare un 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;}

Ungolfed:

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

Codice di prova:

Provalo qui.

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

Produzione:

8
12

3

PowerShell, 42 41 byte

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

Chiamato dalla riga di comando come. \ No5s.ps1 1 20


1
È possibile rilasciare lo spazio per salvare un byte. Con schemi regex strettamente numerici, non è necessario un delimitatore (ad es. -replace3Oppure -split1oppure -notmatch5).
AdmBorkBork,

Ah, bello, grazie @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 grazie a tukkaaX


Non scoraggiarti! Divertirsi e sfidare te stesso è ciò che conta. Puoi rimuovere due spazi bianchi su not "5" in:) Inoltre, se stai usando Python2, puoi circondare xcon `` virgolette, invece di farlo str(x).
Yytsi,

@TuukkaX Grazie! rimosso anche lo spazio tra in e `x`
sagiksp il

È possibile rimuovere il []. Inoltre, non è necessario lo spazio prima if.
Dennis,

@Dennis L'ho già provato, ma si lamenta che "l'oggetto del tipo 'generatore' non ha len ()".
Yytsi,

@TuukkaX Giusto. lambda a,b:sum(not"5"in`n`for n in range(a,b+1))funziona però. tio.run/nexus/…
Dennis il

2

Swift 52 byte

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

Poiché la tua sfida è una sfida di codegolf, dovresti includere il tuo bytecount. Inoltre, in codegolf (almeno qui), è necessario che tutti i programmi muse contengano effettivamente (ad es. Il nome della tua funzione può essere solo un singolo carattere, la tua funzione effettiva può probabilmente essere ridotta a una sola riga). Non conosco Swift, potresti dovermi correggere su cose.
clismique,

2

Lotto, 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%

Il ciclo manuale salva alcuni byte perché ho comunque bisogno del contatore di cicli in una variabile.


2

PHP, 56 byte

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

Esegui in questo modo:

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

Una versione per PHP 7.1 sarebbe 53 byte (crediti verso Titus):

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

Spiegazione

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, ho dimenticato di nuovo il secondo trimparametro.
Tito

2

CJam "facile soluzione matematica pura", 60

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

Provalo online

Prende i numeri in qualsiasi ordine, in un array.

Spiegazione:

Un problema fondamentale è calcolare f (n) = il numero di numeri non 5 da 1 a n (compreso) per ogni n positivo. E la risposta è: prendi le cifre decimali di n, sostituisci tutte le cifre dopo le prime 5 (se ce ne sono) con 9, quindi sostituisci tutte le cifre 5..9 con 4..8 (decremento) e converti dalla base 9. Es. 1752 → 1759 → 1648 → 1 * 9 ^ 3 + 6 * 9 ^ 2 + 4 * 9 + 8 = 1259. Fondamentalmente, ogni posizione della cifra ha 9 valori accettabili e un 5xxxx equivale a un 49999 perché non ci sono più numeri validi tra di loro.

Una volta risolto questo, abbiamo alcuni casi: se i numeri di input (diciamo aeb, a <b) sono (rigorosamente) positivi, allora il risultato è f (b) -f (a-1). Se sono negativi, allora possiamo prendere i valori assoluti, riordinarli e utilizzare lo stesso calcolo. E se a <= 0 <= b il risultato è f (-a) + f (b) +1.

Il programma implementa prima la funzione F come descritto sopra (ma applicato a ciascun numero in un array), quindi legge l'input, converte i numeri in valore assoluto e li riordina e utilizza uno dei 2 calcoli sopra, in base al fatto che un * b> 0 inizialmente.


Metodo non "puro" ma piacevole. qui, ottieni un +1 :)
Matthew Roh il

@MatthewRoh grazie, ma cosa vuoi dire non puro? È una soluzione che dirige in modo equo i calcoli matematici sui numeri di input, senza iterare nell'intervallo. Cos'altro ti aspettavi?
aditsu,

2

Python 2 , 54 byte

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

Provalo online!

Non la risposta Python più breve Utilizza lo stesso algoritmo ma un modo diverso di implementare con un ciclo while e non è una funzione lambda.


È un programma e non una funzione e utilizza while anziché for. Cosa non è diverso? OK, sta ancora cercando una stringa "5" all'interno dell'input incrementato, concordato. Esiste un modo migliore?
ElPedro,

Questo è esattamente quello che è ed è per questo che è differito. Scusa, forse avrei dovuto rendere il mio commento diverso.
ElPedro,

Stesso algoritmo, diverso modo di implementare. Nessun problema con i tuoi commenti. È meglio formulato?
ElPedro,

Sì, rimuoverò questi commenti per rendere pulita la sezione dei commenti.
Yytsi,

1

Java 7, 77 byte

Questo è un miglioramento della risposta Kevins , ma poiché non ho ancora la reputazione di commentare, questa nuova risposta dovrà fare.

Quindi quello che ho fatto è stato:

  • Sostituisci le indexOfdichiarazioni concontains (-1 byte)
  • Sposta la parte incrementale del for-loop nell'istruzione condizionale (-2 byte)

for-loop ( 77 byte ):

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

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

Produzione:

8
12

8
12

Provalo qui !


Benvenuti in PPCG! Belle scoperte in una risposta già abbastanza ben giocata. Non so molto di Java ma non dovrebbe (""+a).contains("5")?0:1essere sostituibile con !(""+a).contains("5")?
Christoph,

1
@Christoph purtroppo no, poiché in Java un booleano è davvero solo un booleano. Quindi un'operazione ternaria è l'unica strada da percorrere.
Tobias Meister,

Hm, è triste. Che dire (""+a).contains("5")||r++?
Christoph,

1
@Christoph non funzionerà neanche, perché non puoi avere un'espressione booleana da sola. Ho cercato di farlo funzionare in altri posti (come la dichiarazione for-loop) ma non con molto successo. Bella idea però;)
Tobias Meister,

1

C #, 67 byte

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

Speravo di usare for(int c=0;...)ma poi non riesce a compilare perché il ritorno non rientra nell'ambito dic
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));

Golfato 7 byte grazie a ETHproductions .


1
È possibile utilizzare c+=!/5/.test(s++)per salvare alcuni byte :-)
ETHproductions

Molte grazie! Ho dovuto cancellare i miei golf, però. Ero così orgoglioso di loro. :(
Hristiyan Dodov il

Penso che puoi usare il curry, ovvero `s => e =>`
TheLethalCoder

La risposta principale utilizza la sintassi del curry. Non modificherò il mio perché diventerebbe quasi lo stesso. Grazie per averlo sottolineato, però!
Hristiyan Dodov,

1

MATL , 10 byte

&:!V53-!As

Provalo online!

Spiegazione

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

Chiamata lambda anonima.

Utilizza n(primo numero) e m(ultimo numero) come input, quindi verifica tramite il contenimento delle stringhe ( "".Contains("")).


Non sono io il downvoting, ma il modulo 5 non è la soluzione corretta per la sfida data dall'OP. Dovrebbe escludere qualsiasi cosa contenga la cifra 5nel suo numero, quindi 10(che la tua risposta non conterebbe) dovrebbe essere conteggiata.
Kevin Cruijssen,

@KevinCruijssen Risolto.
devRicher

Questo non viene compilato come gdeve essere inizializzato quando indicato come è stato chiamato, varquindi è necessario var g="";e puoi usare il curry, cioèn=>m=>
TheLethalCoder

Anche questo restituisce l'elenco non il conteggio
TheLethalCoder

1
@KevinCruijssen Con le tue modifiche questa è essenzialmente la mia risposta ...
TheLethalCoder

1

In realtà , 13 byte

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

Provalo online!

Spiegazione:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.