Descubra quantos caracteres alfanuméricos podem ser compostos de um único número

23

Os caracteres alfanuméricos têm valores ASCII:

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

Seu desafio é pegar um número inteiro como entrada e gerar quantos caracteres podem ser criados usando dígitos consecutivos desse número. Os códigos de caracteres podem estar sobrepostos. 666deve resultar 2, uma vez que você tem 66duas vezes.

Casos de teste:

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

Os formatos de entrada e saída são opcionais (sim, você pode usar o número inteiro como uma sequência).

Stewie Griffin
fonte

Respostas:

11

05AB1E , 8 7 bytes

žKÇIŒÃg

Experimente online!

Explicação

ž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
Emigna
fonte
ŒžKÇÃgnão funciona?
Magic Octopus Urn
@carusocomputing: Infelizmente, falha no 1111111caso de teste.
Emigna
Ã, isso faz muito mais sentido agora que eu li o que está fazendo, merda.
Urna Mágica do Polvo
7

Braquilog , 22 bytes

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

Experimente online!

Explicação

       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
Fatalizar
fonte
Infelizmente para mim, felizmente para você, eu não tenho acesso a um computador no momento;)
Leaky Nun
@LeakyNun Eu pensei em maneiras mais curtas de fazer isso, ambas falhando por causa de bugs.
Fatalize 28/04
Você pode juntar os dois Tjuntos?
Freira vazada
1
Qual é a causa desse bug?
Leaky Nun
1
@LeakyNun Para, por exemplo, o número inteiro 13, existem infinitas listas e números inteiros que contêm 13, e não é óbvio em que ordem você deve listá-las.
Fatalize
7

MATL , 17 13 bytes

8Y2"G@oVXf]vn

Experimente online! Ou verifique todos os casos de teste .

Explicação

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
Luis Mendo
fonte
6

Java 7, 204 197 195 bytes

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

Explicação:

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

Código do teste:

Experimente aqui.

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"));
  }
}
Kevin Cruijssen
fonte
Não consigo acessar um computador agora, então não posso confirmar, mas aqui estão duas sugestões: 1. coloque as iniciações no loop for. 2. em vez de manipulação de string, use aritmética (use a divisão inteira para iterar pelos dígitos e use o módulo para extrair os últimos 2 ou 3 dígitos).
Leaky Nun
@LeakyNun Obrigado pelas sugestões. Quanto ao primeiro, o motivo pelo qual as inicializações de números inteiros estão fora do loop for é porque eu tenho que retornar o resultado ( r). No entanto, consegui obter 7 bytes de golfe colocando tudo o mais dentro do loop for, em um único ternário. Vou ver se posso fazer sua segunda sugestão mais tarde, talvez. Meu almoço terminou novamente, então terei que voltar ao trabalho. Manterá isso em mente.
Kevin Cruijssen
5

JavaScript (ES6), 71 70 bytes

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

Casos de teste

Arnauld
fonte
4

Perl 5 , 47 bytes

46 bytes de código + -psinalizador.

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

Experimente online!

Não consegui encontrar uma maneira mais curta de escrever isso 48..57,65..90,97..122: map{ord}0..9,a..z,A..Z(obter o valor ascii dos caracteres) é um byte a mais. E fazer for$c(0..122){$\+=chr($c)=~/\pl|\d/ for/(?=$c)/g}}{(procurar todos os números, mas manter apenas aqueles cujos números correspondem ao valor ASCII de letras ( \pl) ou dígitos ( \d)) terá 5 bytes a mais (observe que \pl|\dnão pode ser substituído por, \wpois este também inclui sublinhados)) .


Abordagem anterior (49 bytes):

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

PHP, 68 bytes

for(;a&($a=$argn)[$i];)$d+=ctype_alnum(chr($a[$i].$a[++$i]));echo$d;

Versão Online

Jörg Hülsermann
fonte
1

JavaScript (ES), 165 161 156 154 154 153 bytes

Sim, o RegEx definitivamente não era a ferramenta certa para o trabalho aqui!

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

Tente

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

Shaggy
fonte
Regexp não é tão ruim; Uma porta da minha resposta Retina chegou a 78 bytes.
315 Neil
1

Python 2 , 74 64 62 bytes

f=lambda n:n and chr(n%10**(3-(n%1000>122))).isalnum()+f(n/10)

Experimente online!

Dennis
fonte
1

Haskell, 161 157 138 138 129 126 bytes

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

Gostaria de saber se existe uma maneira melhor de remover dupes da lista do que importar Data.List para nub?

maple_shaft
fonte
1
Se você importar Data.Listsem vez de Data.List, você pode usar: y<-tail$powerslice x.
Nimi 30/04
@nimi É contra as regras de golfe se eu tiver que baixar e instalar módulos não padrão? Eu não acho que Data.Lists é padrão no GHC.
Maple_shaft
Até onde eu sei, ainda não temos consenso sobre o que conta como um módulo padrão. Há algumas respostas Haskell por aqui que usam Data.Lists. É até mencionado nas dicas de golfe de Haskell - ninguém se queixou até agora.
N
@nimi Bem, sinceramente, acho que se eu puder baixar qualquer pacote do cabal, eu poderia escrever uma função que resolva o problema, carregá-lo e depois importar o módulo na minha solução. Tecnicamente eu poderia trapacear. Mas então certos desafios não podem ser feitos com o GHC básico, como coisas de criptografia, então eu não sei.
Maple_shaft
1
Voltar a jogar golfe dicas: or $ f <$> listé any f list: any(elem$read y)[...].
Nimi 30/04
0

Pitão, 19 17 14 bytes

l@jGUTmr0Csd.:

pega uma corda.

-3 Bytes graças a @LeakyNun

Tente!

Explicação

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
KarlKastor
fonte
Em vez de usar idT, você pode usar sd.
Leaky Nun
Além disso, l@jGUTmr0Csd.:pode ser mais curto (não tenho certeza se funciona).
Leaky Nun
@LeakyNun Obrigado, isso funciona!
precisa saber é o seguinte
0

Geléia , 8 bytes

ØBODf@ẆL

A entrada é uma matriz de dígitos.

Experimente online!

Como funciona

Ø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.
Dennis
fonte
0

Ruby, 50 bytes

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

Lê da entrada padrão; requer que o interpretador Ruby seja chamado com a -nopção ( while getsloop implícito ).

Pode ser reduzido para 43 bytes se for permitido corresponder sublinhados.

p (0..~/$/).any?{|n|$_[n,2].to_i.chr=~/\w/}
Ray Hamel
fonte
Isso não retorna o número de vezes que os caracteres aparecem. Além disso, ele falha 111, o que deve retornar, 1mas você está devolvendo 0.
Value Ink