Trouver combien de caractères alphanumériques peuvent être constitués d'un seul numéro


23

Les caractères alphanumériques ont des valeurs ASCII:

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

Votre défi consiste à prendre un entier en entrée et à afficher le nombre de caractères pouvant être créés à l'aide de chiffres consécutifs de ce nombre. Les codes de caractères peuvent se chevaucher. 666devrait se traduire par 2, puisque vous avez 66deux fois.

Cas de 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

Les formats d'entrée et de sortie sont facultatifs (oui, vous pouvez prendre l'entier comme une chaîne).

Réponses:


11

05AB1E , 8 7 octets

žKÇIŒÃg

Essayez-le en ligne!

Explication

ž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ÇÃgne fonctionne pas?
Urne de poulpe magique

@carusocomputing: Malheureusement, il échoue au 1111111test.
Emigna

Ã, cela fait beaucoup plus de sens maintenant que j'ai lu ce qu'il fait, merde.
Urne de poulpe magique

7

Brachylog , 22 octets

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

Essayez-le en ligne!

Explication

       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

Malheureusement pour moi, heureusement pour vous, je n'ai pas accès à un ordinateur pour le moment;)
Leaky Nun

@LeakyNun J'ai pensé à des moyens plus courts de le faire, les deux échouant à cause de bugs.
Fatalize

Pouvez-vous joindre les deux Tensemble?
Leaky Nun

1
Quelle est la cause de ce bug?
Leaky Nun

1
@LeakyNun Pour par exemple le nombre entier 13, il existe une infinité de listes et un nombre infini de nombres entiers qui contiennent 13, et il n'est pas évident dans quel ordre vous devez les lister.
Fatalize

7

MATL , 17 13 octets

8Y2"G@oVXf]vn

Essayez-le en ligne! Ou vérifiez tous les cas de test .

Explication

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 octets

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

Explication:

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

Code de test:

Essayez-le ici.

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

Je ne peux pas accéder à un ordinateur pour le moment, je ne peux donc pas confirmer, mais voici deux suggestions: 1. mettez les initiations dans la boucle for. 2. au lieu de manipuler des chaînes, utilisez l'arithmétique (utilisez la division entière pour parcourir les chiffres et utilisez modulo pour extraire les 2 ou 3 derniers chiffres).
Leaky Nun

@LeakyNun Merci pour les suggestions. Quant à votre premier, la raison pour laquelle les initialisations d'entiers sont en dehors de la boucle for est parce que je dois retourner le résultat ( r). Cependant, j'ai pu jouer au golf 7 octets en mettant tout le reste à l'intérieur de la boucle for, dans un seul ternaire. Je verrai si je peux faire votre deuxième suggestion plus tard peut-être. Mon déjeuner est de nouveau terminé, je vais donc devoir retourner au travail. Gardera cela à l'esprit.
Kevin Cruijssen

5

JavaScript (ES6), 71 70 octets

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

Cas de test


4

Perl 5 , 47 octets

46 octets de code + -pindicateur.

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

Essayez-le en ligne!

Je n'ai pas trouvé de moyen plus court pour écrire cela 48..57,65..90,97..122: map{ord}0..9,a..z,A..Z(obtenir la valeur ascii des caractères) est un octet de plus. Et faire for$c(0..122){$\+=chr($c)=~/\pl|\d/ for/(?=$c)/g}}{(en recherchant tous les nombres, mais en ne gardant que ceux dont les nombres correspondent à la valeur ascii des lettres ( \pl) ou des chiffres ( \d)) sera 5 octets de plus (notez que \pl|\dcela ne peut pas être remplacé \wcar ce dernier inclut également des traits de soulignement)) .


Approche précédente (49 octets):

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


1

JavaScript (ES) 165 161 156 154 153 octets

Ouais, RegEx n'était certainement pas le bon outil pour le travail ici!

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

Essayez-le

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 n'est pas si mal; Un port de ma réponse Retina est venu à 78 octets.
Neil



1

Haskell, 161 157 138 129 126 octets

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

Je me demande s'il existe un meilleur moyen de supprimer les dupes de la liste que d'importer Data.List pour nub?


1
Si vous importez au Data.Listslieu de Data.List, vous pouvez utiliser: y<-tail$powerslice x.
nimi

@nimi Est-ce contraire aux règles du golf si je dois télécharger et installer des modules non standard? Je ne pense pas que Data.Lists soit standard dans GHC.
maple_shaft

Pour autant que je sache, nous n'avons toujours pas de consensus sur ce qui compte comme module standard. Il y a quelques réponses Haskell ici qui utilisent Data.Lists. Il est même mentionné dans les conseils de golf pour Haskell - personne ne s'est plaint jusqu'à présent.
nimi

@nimi Eh bien, honnêtement, je pense que si je peux simplement télécharger n'importe quel paquet depuis cabal, je pourrais simplement écrire une fonction qui résout le problème, le télécharger, puis importer le module dans ma solution. Techniquement, je pouvais tricher. Mais alors certains défis ne peuvent pas être faits avec le GHC de base, comme les trucs de crypto donc je ne sais pas.
maple_shaft

1
Retour aux conseils de golf: or $ f <$> listest any f list: any(elem$read y)[...].
nimi

0

Pyth, 19 17 14 octets

l@jGUTmr0Csd.:

prend une chaîne.

-3 octets grâce à @LeakyNun

Essayez!

Explication

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

Au lieu d'utiliser idT, vous pouvez utiliser sd.
Leaky Nun

En outre, l@jGUTmr0Csd.:peut être plus court (je ne sais pas si cela fonctionne).
Leaky Nun

@LeakyNun Merci, cela fonctionne!
KarlKastor

0

Gelée , 8 octets

ØBODf@ẆL

L'entrée est un tableau de chiffres.

Essayez-le en ligne!

Comment ça marche

Ø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

Rubis, 50 octets

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

Lit à partir de l'entrée standard; nécessite que l'interpréteur Ruby soit invoqué avec l' -noption ( while getsboucle implicite ).

Peut être réduit à 43 octets s'il était autorisé à faire correspondre les traits de soulignement.

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

Cela ne renvoie pas le nombre de fois que les personnages apparaissent. En outre, il échoue 111, ce qui devrait revenir, 1mais vous redonnez 0.
Value Ink

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.