Sprawdź, ile znaków alfanumerycznych może składać się z jednej liczby

23

Znaki alfanumeryczne mają wartości ASCII:

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

Wyzwanie polega na przyjęciu liczby całkowitej jako wartości wejściowej i wyświetleniu, ile znaków można wprowadzić przy użyciu kolejnych cyfr tej liczby. Kody znaków mogą się nakładać. 666powinien skutkować 2, ponieważ masz 66dwa razy.

Przypadki testowe:

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

Formaty wejściowe i wyjściowe są opcjonalne (tak, możesz przyjąć liczbę całkowitą jako ciąg).

Stewie Griffin
źródło

Odpowiedzi:

11

05AB1E , 8 7 bajtów

žKÇIŒÃg

Wypróbuj online!

Wyjaśnienie

ž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
źródło
ŒžKÇÃgnie działa?
Magic Octopus Urn
@carusocomputing: Niestety nie powiedzie się 1111111przypadek testowy.
Emigna
Ã, to ma o wiele większy sens teraz, kiedy czytam, co robi, bzdury.
Magic Octopus Urn
7

Brachylog , 22 bajty

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

Wypróbuj online!

Wyjaśnienie

       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
Fatalizować
źródło
Niestety dla mnie, na szczęście dla ciebie, obecnie nie mam dostępu do komputera;)
Leaky Nun
@LeakyNun Myślałem o krótszych sposobach na zrobienie tego, oba zawiodły z powodu błędów.
Fatalize
Czy możesz dołączyć do nich Trazem?
Leaky Nun
1
Co jest przyczyną tego błędu?
Leaky Nun
1
@LeakyNun Dla np. Liczby całkowitej 13 istnieje nieskończenie wiele list i nieskończenie wiele liczb całkowitych zawierających 13, i nie jest oczywiste, w jakiej kolejności należy je wymienić.
Fatalize
7

MATL , 17 13 bajtów

8Y2"G@oVXf]vn

Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie

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

Java 7, 204 197 195 bajtów

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

Wyjaśnienie:

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

Kod testowy:

Wypróbuj tutaj.

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
źródło
Nie mogę teraz uzyskać dostępu do komputera, więc nie mogę potwierdzić, ale oto dwie sugestie: 1. umieść inicjacje w pętli for. 2. zamiast manipulacji ciągiem, użyj arytmetyki (użyj podziału na liczby całkowite, aby iterować cyfry i użyj modulo, aby wyodrębnić 2 lub 3 cyfry).
Leaky Nun
@LeakyNun Dzięki za sugestie. Jeśli chodzi o twój pierwszy, przyczyną inicjalizacji liczb całkowitych jest poza pętlę for, ponieważ muszę zwrócić wynik ( r). Byłem jednak w stanie zagrać w golfa 7 bajtów, umieszczając wszystko inne w pętli for, w jednej trójce. Zobaczę, czy może uda mi się zrobić twoją drugą sugestię później. Czas na lunch znów się skończył, więc muszę wracać do pracy. Będę o tym pamiętać.
Kevin Cruijssen
5

JavaScript (ES6), 71 70 bajtów

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

Przypadki testowe

Arnauld
źródło
4

Perl 5 , 47 bajtów

46 bajtów kodu + -pflaga.

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

Wypróbuj online!

Nie mogłem znaleźć krótszego sposobu na napisanie 48..57,65..90,97..122: map{ord}0..9,a..z,A..Z(uzyskanie wartości ascii znaków) jest o jeden bajt dłuższy. A robienie for$c(0..122){$\+=chr($c)=~/\pl|\d/ for/(?=$c)/g}}{(szukanie wszystkich liczb, ale zachowanie tylko tych, których liczby odpowiadają wartości ascii liter ( \pl) lub cyfr ( \d)), będzie o 5 bajtów dłuższych (uwaga, że \pl|\dnie można zastąpić nimi, \wponieważ ta ostatnia zawiera również podkreślenia)) .


Poprzednie podejście (49 bajtów):

for$@(48..57,65..90,97..122){$\+=()=/(?=$@)/g}}{
Dada
źródło
2

PHP, 68 bajtów

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

Wersja online

Jörg Hülsermann
źródło
1

JavaScript (ES), 165 161 156 154 153 bajtów

Tak, RegEx zdecydowanie nie był odpowiednim narzędziem do pracy tutaj!

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

Spróbuj

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

Kudłaty
źródło
Regexp nie jest taki zły; Port mojej odpowiedzi Retina przyszedł do 78 bajtów.
Neil
1

Python 2 , 74 64 62 bajtów

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

Wypróbuj online!

Dennis
źródło
1

Haskell, 161 157 138 129 126 bajtów

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

Zastanawiam się, czy istnieje lepszy sposób na usunięcie duplikatów z listy niż importowanie Data.List do nub?

wałek klonowy
źródło
1
Jeśli importujesz Data.Listszamiast Data.Listmożna użyć: y<-tail$powerslice x.
nimi 30.04.17
@nimi Czy to niezgodne z zasadami gry w golfa, jeśli muszę pobierać i instalować niestandardowe moduły? Nie sądzę, że Data.Lists jest standardem w GHC.
maple_shaft
O ile wiem, nadal nie mamy konsensusu co do tego, co liczy się jako moduł standardowy. W okolicy jest kilka odpowiedzi Haskella, które wykorzystują Data.Lists. Jest nawet wspomniane w wskazówkach golfowych dla Haskell - jak dotąd nikt nie narzekał.
nimi 30.04.17
@nimi Cóż, szczerze mówiąc, myślę, że jeśli mogę po prostu pobrać dowolny pakiet z cabal, mógłbym napisać funkcję, która rozwiązuje problem, załadować go, a następnie zaimportować moduł do mojego rozwiązania. Technicznie mógłbym oszukiwać. Ale wtedy pewne wyzwania nie mogą być wykonane za pomocą podstawowego GHC, takiego jak szyfrowanie, więc nie wiem.
maple_shaft
1
Powrót do wskazówek golfa: or $ f <$> listjest any f list: any(elem$read y)[...].
nimi 30.04.17
0

Pyth, 19 17 14 bajtów

l@jGUTmr0Csd.:

bierze sznurek.

-3 Bajty dzięki @LeakyNun

Spróbuj!

Wyjaśnienie

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
źródło
Zamiast używać idTmożesz użyć sd.
Leaky Nun
Ponadto l@jGUTmr0Csd.:może być krótszy (nie jestem pewien, czy to działa).
Leaky Nun
@LeakyNun Dziękuję, to działa!
KarlKastor
0

Galaretka , 8 bajtów

ØBODf@ẆL

Dane wejściowe to tablica cyfr.

Wypróbuj online!

Jak to działa

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

Rubinowy, 50 bajtów

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

Odczytuje ze standardowego wejścia; wymaga wywołania interpretera Ruby z -nopcją (niejawna while getspętla).

Można by zmniejszyć do 43 bajtów, gdyby pozwolono na dopasowanie podkreślników.

p (0..~/$/).any?{|n|$_[n,2].to_i.chr=~/\w/}
Ray Hamel
źródło
Nie zwraca to liczby wyświetleń znaków. Ponadto zawiesza się 111, co powinno wrócić, 1ale oddajesz 0.
Wartość tuszu