Scopri quanti caratteri alfanumerici possono essere costituiti da un singolo numero


23

I caratteri alfanumerici hanno valori ASCII:

0-9  ->  48-57
A-Z  ->  65-90
a-z  ->  97-122

La tua sfida è quella di prendere un numero intero come input e produrre quanti caratteri possono essere fatti usando cifre consecutive di quel numero. I codici dei caratteri potrebbero sovrapporsi. 666dovrebbe risultare 2, dal momento che hai 66due volte.

Casi test:

Input: 5698
Possible characters: '8' (56), 'E' (69), 'b' (98)
Output: 3

Input: 564693
Possible characters: '8' (56), 'E' (69)
Output: 2

Input: 530923864209124521
Possible characters: '5' (53), 'V' (86), '4' (52)  
Output: 3

Input: 1111111
Possible characters: 'ooooo' (5*111)
Output: 5

Input: 5115643141276343
Possible characters: '3' (51), '8' (56), 'L' (76), 's' (115)
Output: 4

Input: 56789
Possible characters: '8' (56), 'C' (67), 'N' (78), 'Y' (89)
Output: 4

Input: 94
Possible characters: ''
Output: 0

Input: 1
Output: 0

I formati di input e output sono opzionali (sì, puoi prendere l'intero come stringa).

Risposte:


11

05AB1E , 8 7 byte

žKÇIŒÃg

Provalo online!

Spiegazione

žK       # push [a-zA-Z0-9]
  Ç      # convert to list of ascii codes
   IΠ   # push all substrings of input
     Ã   # keep only the subtrings which exist in the list of acsii codes
      g  # push length of resulting list

ŒžKÇÃgnon funziona?
Magic Octopus Urn

@carusocomputing: Sfortunatamente, il 1111111test-case fallisce .
Emigna,

Ã, ha molto più senso ora che leggo cosa sta facendo, merda.
Magic Octopus Urn,

7

Brachylog , 22 byte

∧Ạụ:Ạ:Ịcạ:?{tT&h∋~sT}ᶜ

Provalo online!

Spiegazione

       c                 Concatenate together:
∧Ạụ:                       "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    Ạ:                     "abcdefghijklmnopqrstuvwxyz"
      Ị                    "0123456789"
        ạ                Get the list of ASCII codes of that string
         :?{        }ᶜ   Count the number of results, for input [list of codes, Input], of:
            tT             Call the Input T
              &h∋          Take one ASCII code
                 ~sT       It is a substring of T

Sfortunatamente per me, fortunatamente per te, al momento non ho accesso a un computer;)
Leaky Nun

@LeakyNun Ho pensato a modi più brevi per farlo, entrambi fallendo a causa di bug.
Fatalizza il

Riesci a unire i due Tinsieme?
Leaky Nun,

1
Qual è la causa di questo errore?
Leaky Nun,

1
@LeakyNun Ad esempio l'intero 13, ci sono infiniti elenchi e infiniti numeri interi che contengono 13, e non è ovvio in quale ordine dovresti elencarli.
Fatalizza il

7

MATL , 17 13 byte

8Y2"G@oVXf]vn

Provalo online! Oppure verifica tutti i casi di test .

Spiegazione

8Y2     % Predefined literal: string with all letters, uppercase and lowercase,
        % and digits
"       % For each character in that string
  G     %   Push input, for example the string '5115643141276343'
  @     %   Push current character, such as 'A'
  o     %   Convert to its ASCII code, such as 65
  V     %   String representation, such as '65'
  Xf    %   Find string '65' within string '5115643141276343'. This gives a vector
        %   (possibly empty) with indices of occurrences
]       % End
v       % Concatenate all stack contents vertically
n       % Number of entries. Implicitly display

6

Java 7, 204 197 195 byte

int c(String n){int r=0,i=0,e=n.length()-1,t;for(;i<e;r+=((t=new Byte(n.substring(i,i+2)))>47&t<57)|(t>64&t<91)|(t>96&t<100)|((t=new Short(n.substring(i,i++>e-2?i:i+2)))>99&t<123)?1:0);return r;}

Spiegazione:

int c(String n){       // Method with String parameter and integer return-type
  int r=0,             //  Result
      i=0,             //  Index
      e=n.length()-1,  //  Length of String -1
      t;               //  Temp integer
  for(;i<e;            //  Loop over the String using the index
    r+=                //   Append the result-sum with:
      ((t=new Byte(n.substring(i,i+2)))>47&t<57)|(t>64&t<91)|(t>96&t<100)
                       //    If two adjacent digits are a digit or letter
      |                //    or
      ((t=new Short(n.substring(i,i++>e-2?i:i+2)))>99&t<123)?
                       //    if three adjacent digits are a letter
       1               //     Raise the sum by 1
      :                //    Else:
       0               //     Keep the sum the same (by adding 0)
  );                   //  End of loop (implicit / no body)
  return r;            //  Return result
}                      // End of method

Codice di prova:

Provalo qui.

class M{
  static int c(String n){int r=0,i=0,e=n.length()-1,t;for(;i<e;r+=((t=new Byte(n.substring(i,i+2)))>47&t<57)|(t>64&t<91)|(t>96&t<100)|((t=new Short(n.substring(i,i++>e-2?i:i+2)))>99&t<123)?1:0);return r;}

  public static void main(String[] a){
    System.out.println(c("5698"));
    System.out.println(c("564693"));
    System.out.println(c("530923864209124521"));
    System.out.println(c("1111111"));
    System.out.println(c("5115643141276343"));
    System.out.println(c("56789"));
    System.out.println(c("94"));
    System.out.println(c("1"));
  }
}

Al momento non riesco ad accedere a un computer, quindi non posso confermare, ma qui ci sono due suggerimenti: 1. metti le iniziazioni nel ciclo for. 2. invece di manipolare le stringhe, usa l'aritmetica (usa la divisione intera per scorrere le cifre e usa il modulo per estrarre le ultime 2 o 3 cifre).
Leaky Nun,

@LeakyNun Grazie per i suggerimenti. Per quanto riguarda il tuo primo, il motivo per cui le inizializzazioni di numeri interi sono al di fuori del ciclo for è perché devo restituire il risultato ( r). Tuttavia, sono stato in grado di giocare a golf 7 byte mettendo tutto il resto all'interno del for-loop, in un unico ternario. Vedrò se posso dare il tuo secondo suggerimento più tardi, forse. Il mio pranzo è finito di nuovo, quindi dovrò tornare al lavoro. Lo terrò a mente.
Kevin Cruijssen,

5

JavaScript (ES6), 71 70 byte

f=([a,...b])=>a?(a&(a+=b[0])+b[1]<123|a>47&a<58|a>64&a<91|a>96)+f(b):0

Casi test


4

Perl 5 , 47 byte

46 byte di codice + -pflag.

$"="|";$_=()=/(?=@{[48..57,65..90,97..122]})/g

Provalo online!

Non sono riuscito a trovare un modo più breve per scrivere che 48..57,65..90,97..122: map{ord}0..9,a..z,A..Z(ottenere il valore ASCII dei caratteri) è più lungo di un byte. E facendo for$c(0..122){$\+=chr($c)=~/\pl|\d/ for/(?=$c)/g}}{(cercando tutti i numeri, ma mantenendo solo quelli il cui numero corrisponde al valore ASCII di lettere ( \pl) o cifre ( \d)) sarà più lungo di 5 byte (nota che \pl|\dnon può essere sostituito dal fatto \wche quest'ultimo include anche trattini bassi)) .


Approccio precedente (49 byte):

for$@(48..57,65..90,97..122){$\+=()=/(?=$@)/g}}{


1

JavaScript (ES), 165 161 156 154 153 byte

Sì, RegEx sicuramente non era lo strumento giusto per il lavoro qui!

n=>[/\d{2}/g,/\d{3}/g].map(e=>eval("while(x=e.exec(n)){a.push(m=x[0]);e.lastIndex-=m.length-1}"),a=[])|a.filter(x=>x>47&x<58|x>64&x<91|x>96&x<123).length

Provalo

f=

n=>[/\d{2}/g,/\d{3}/g].map(e=>eval("while(x=e.exec(n)){a.push(m=x[0]);e.lastIndex-=m.length-1}"),a=[])|a.filter(x=>x>47&x<58|x>64&x<91|x>96&x<123).length

console.log(f(5698))//3
console.log(f(564693))//2
console.log(f(530923864209124521))//3
console.log(f(1111111))//5
console.log(f(5115643141276343))//4
console.log(f(56789))//4
console.log(f(94))//0
console.log(f(1))//0


Regexp non è poi così male; Una porta della mia risposta Retina arrivò a 78 byte.
Neil,



1

Haskell, 161 157 138 129 126 byte

import Data.List
f x=sum[1|y<-nub$concat$words.concat<$>mapM(\c->[[c],c:" "])x,any(elem$read y)[[48..57],[65..90],[97..122]]]

Mi chiedo se esiste un modo migliore per rimuovere i duplicati dell'elenco rispetto all'importazione di Data.List per nub?


1
Se si importano Data.Listsinvece Data.List, è possibile utilizzare: y<-tail$powerslice x.
nimi,

@nimi È contro le regole del golf se devo scaricare e installare moduli non standard? Non credo che DataLists sia standard in GHC.
maple_shaft

Per quanto ne so, non abbiamo ancora consenso su ciò che conta come un modulo standard. Ci sono un paio di risposte Haskell qui intorno che usano Data.Lists. È anche menzionato nei consigli sul golf di Haskell : nessuno si è mai lamentato finora.
nimi,

@nimi Beh, onestamente penso che se potessi semplicemente scaricare qualsiasi pacchetto dalla cabala, potrei semplicemente scrivere una funzione che risolva il problema, caricarlo, quindi importare il modulo nella mia soluzione. Tecnicamente potrei barare. Ma poi alcune sfide non possono essere affrontate con GHC di base come le cose crittografiche, quindi non lo so.
maple_shaft

1
Torna a golf suggerimenti: or $ f <$> listè any f list: any(elem$read y)[...].
nimi,

0

Pyth, 19 17 14 byte

l@jGUTmr0Csd.:

prende una stringa.

-3 byte grazie a @LeakyNun

Provalo!

Spiegazione

l@jGUTmr0Csd.:
    UT                # the list of digits [0,1,2,...,9]
  jG                  # join that on the lowercase alphabet (repetition doesn't matter)
              Q       # implicit input
            .:        # all substrings of the input
      m               # for each of those substrings
          sd          # Convert the string to a base 10 integer
         C            # convert that integer to the character with that number
       r0             # make that character lowercase
l@                    # length of the intersection of those two list of chars we generated

Invece di usare idT, puoi usare sd.
Leaky Nun,

Inoltre, l@jGUTmr0Csd.:potrebbe essere più breve (non sono sicuro che funzioni).
Leaky Nun,

@LeakyNun Grazie, funziona!
KarlKastor,

0

Gelatina , 8 byte

ØBODf@ẆL

L'input è un array di cifre.

Provalo online!

Come funziona

ØBODf@ẆL  Main link. Argument: A (digit array)

ØB        Base 62; yield all alphanumeric ASCII characters.
  O       Ordinal; get their code points.
   D      Decimal; convert the code points into digit arrays.
      Ẇ   Window; yield all contiguous subarrays of A.
    f@    Filter swapped; keep all elements of the result to the right that appear
          in the result to the left.
       L  Length; count the matches.

0

Rubino, 50 byte

p (0..~/$/).any?{|n|$_[n,2].to_i.chr=~/\p{Alnum}/}

Legge dallo standard input; richiede che l'interprete Ruby sia invocato con l' -nopzione ( while getsciclo implicito ).

Potrebbe essere ridotto a 43 byte se fosse consentito corrispondere ai trattini bassi.

p (0..~/$/).any?{|n|$_[n,2].to_i.chr=~/\w/}

Questo non restituisce il numero di volte in cui appaiono i personaggi. Inoltre, non riesce 111, che dovrebbe tornare 1ma stai dando indietro 0.
Value Ink

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.