Tek bir sayının kaç alfanümerik karakterden oluşabileceğini bulma


23

Alfanümerik karakterler ASCII değerlerine sahiptir:

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

Buradaki zorluk, girdi olarak bir tamsayı almak ve bu sayının ardışık rakamları kullanılarak kaç karakterin yapılabileceğini ortaya çıkarmaktır. Karakter kodları çakışıyor olabilir. iki kez olduğundan, bununla 666sonuçlanmalı .266

Test durumları:

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

Giriş ve çıkış formatları isteğe bağlıdır (evet, tamsayıyı dizge olarak alabilirsiniz).

Yanıtlar:


11

05AB1E , 8 7 bayt

žKÇIŒÃg

Çevrimiçi deneyin!

açıklama

ž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ÇÃgçalışmıyor
Magic Octopus Urn,

@ carusocomputing: Ne yazık ki, 1111111test durumunda başarısız olur .
Emigna

ÃBu, ne yaptığını okuduğumda artık çok daha mantıklı geliyor, bok.
Magic Octopus Urn,

7

Brachylog , 22 bayt

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

Çevrimiçi deneyin!

açıklama

       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

Maalesef benim için, neyse ki, sizin için şu anda bir bilgisayara erişimim yok;)
Leaky Nun

@LeakyNun Her ikisi de hatalardan dolayı başarısız olan, bunu yapmanın daha kısa yollarını düşündüm.
17'de

İkisine Tbirlikte katılabilir misiniz ?
Leaky Nun

1
Bu hatanın nedeni nedir?
Sızdıran Rahibe

1
@LeakyNun Örneğin, tamsayı 13 için, sonsuz sayıda liste ve 13 içeren sonsuz sayıda tam sayı vardır ve bunları hangi sırayla listelemeniz gerektiği açık değildir.
17'de

7

MATL , 17 13 bayt

8Y2"G@oVXf]vn

Çevrimiçi deneyin! Veya tüm test durumlarını doğrulayın .

açıklama

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 bayt

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

Açıklama:

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

Test kodu:

Burada dene.

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

Şu anda bir bilgisayara erişemiyorum, bu yüzden onaylayamıyorum, ancak işte iki öneri: 1. başlatmaları for döngüsüne yerleştirin. 2. string manipülasyonu yerine, aritmetik kullanın (rakamları tekrarlamak için tamsayıyı kullanın ve son 2 veya 3 rakamı çıkarmak için modulo kullanın).
Sızdıran Rahibe

@LeakyNun Önerileriniz için teşekkürler. Birincinize gelince, tamsayıların başlatılmasının for döngüsü dışında kalmasının nedeni sonucu döndürmem gerekmesidir ( r). Ancak, forge içindeki diğer her şeyi tek bir üçlü halinde koyarak 7 baytlık bir golf oynadım. İkinci önerinizi daha sonra yapabilir miyim, göreceğim. Öğle yemeğim tekrar bitti, bu yüzden işe dönmem gerekecek. Akılda tutacak.
Kevin Cruijssen

5

JavaScript (ES6), 71 70 bayt

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

Test durumları


4

Perl 5 , 47 bayt

46 bayt kodu + -pbayrak.

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

Çevrimiçi deneyin!

Bunu yazmak için daha kısa bir yol bulamadım 48..57,65..90,97..122: map{ord}0..9,a..z,A..Z(karakterlerin ascii değerini almak) bir bayt daha uzun. Ve yapmak for$c(0..122){$\+=chr($c)=~/\pl|\d/ for/(?=$c)/g}}{(tüm sayıları aramak, ancak sadece rakamları harflerin ( \pl) veya rakamların ( \d) ascii değerine tekabül edenleri) tutmak, 5 byte daha uzun olacaktır ( ikincisi aynı zamanda alt çizgiler de içerecek \pl|\dşekilde değiştirilemez \w). .


Önceki yaklaşım (49 bayt):

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


1

JavaScript (ES), 165 161 156 154 153 bayt

Evet, RegEx kesinlikle buradaki iş için doğru araç değildi!

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

Dene

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 o kadar da kötü değil; Retina cevabımın bir limanı 78 bayta ulaştı.
Neil,



1

Haskell, 161 157 138 129 126 bayt

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

Listedeki kopyaları kaldırmak için Data.List for nub almaktan daha iyi bir yol olup olmadığını merak ediyorum.


1
İçe Eğer Data.Listsyerine Data.List, şunları kullanabilirsiniz: y<-tail$powerslice x.
nimi

@nimi Standart olmayan modülleri indirmek ve kurmak zorunda kalırsam golf kurallarına aykırı mıyım? Data.Lists GHC standart olduğunu sanmıyorum.
maple_shaft

Bildiğim kadarıyla, standart bir modül olarak neyin önemli olduğu konusunda hala fikir birliğine sahip değiliz. Burada kullanılan birkaç Haskell cevabı var Data.Lists. Haskell'in golf ipuçlarında bile bahsedilir - şimdiye kadar kimse şikayet etmedi.
nimi

@nimi Dürüst olmak gerekirse, cabal'dan herhangi bir paketi indirebilirsem, sorunu çözen, yükleyen ve sonra da modülü çözümüme aktaran bir işlev yazabilirim. Teknik olarak hile yapabilirim. Ama sonra bazı zorluklar kripto gibi ya da temel GHC ile yapılamaz, bu yüzden bilmiyorum.
maple_shaft

1
İpuçları golf dön: or $ f <$> listolup any f list: any(elem$read y)[...].
nimi

0

Pyth, 19 17 14 bayt

l@jGUTmr0Csd.:

bir dize alır.

@LeakyNun sayesinde -3 Bayt

Dene!

açıklama

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

Kullanmak yerine idTkullanabilirsiniz sd.
Leaky Nun

Ayrıca, l@jGUTmr0Csd.:daha kısa olabilir (çalışıp çalışmadığından emin değilim).
Sızdıran Rahibe

@LeakyNun Teşekkürler, bu işe yarıyor!
KarlKastor

0

Jöle , 8 bayt

ØBODf@ẆL

Giriş bir rakam dizisidir.

Çevrimiçi deneyin!

Nasıl çalışır

Ø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

Ruby, 50 bayt

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

Standart girdiden okur; Ruby yorumlayıcısının -nseçenekle çağrılmasını gerektirir (örtülü while getsdöngü).

Alt çizgi eşleşmesine izin verilirse 43 bayta düşürülebilir.

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

Bu, karakterlerin gösterilme sayısını döndürmez. Ayrıca, başarısız 111olması gerekir, ki geri dönmesi gerekir 1ama geri veriyorsunuz 0.
Değerli Mürekkep

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.