查找一个数字可以组成多少个字母数字字符


23

字母数字字符具有ASCII值:

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

您面临的挑战是采用整数作为输入,并输出使用该数字的连续数字可以输入多少个字符。字符代码可能重叠。666应该有2,因为您有66两次。

测试用例:

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

输入和输出格式是可选的(是的,您可以将整数作为字符串)。

Answers:


11

05AB1E8 7字节

žKÇIŒÃg

在线尝试!

说明

ž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不起作用?
魔术章鱼缸

@carusocomputing:不幸的是,它未能通过1111111测试用例。
Emigna

Ã,现在我读了正在做的事情,这很有意义。
魔术章

7

Brachylog,22个字节

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

在线尝试!

说明

       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

对我来说不幸的是,对您来说幸运的是,我目前无法使用计算机;)
Leaky Nun

@LeakyNun我已经想到了更短的方法,但都由于错误而失败。
Fatalize

你能把两者T结合在一起吗?
Leaky Nun

1
此错误的原因是什么?
Leaky Nun

1
@LeakyNun例如,整数13有无限多的列表,无限多个包含13的整数,并且按什么顺序列出它们并不明显。
Fatalize

7

MATL17 13字节

8Y2"G@oVXf]vn

在线尝试!验证所有测试用例

说明

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字节

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

说明:

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

测试代码:

在这里尝试。

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

我现在无法访问计算机,因此无法确认,但是这里有两个建议:1.将启动项放入for循环中。2.使用算术运算(而不是使用字符串除法)(使用整数除法来迭代数字,并使用模运算来提取最后2或3位数字)。
Leaky Nun

@LeakyNun感谢您的建议。对于您的第一个,整数初始化在for循环之外的原因是因为我必须返回结果(r)。但是,通过将其他所有内容放在一个三进制的for循环中,我已经能够打高尔夫球7个字节。稍后再看看是否可以提出您的第二个建议。我的午餐时间又结束了,所以我必须重新上班。将牢记在心。
凯文·克鲁伊森

5

JavaScript(ES6),71 70字节

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

测试用例


4

Perl 5,47个字节

46个字节的代码+ -p标志。

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

在线尝试!

我找不到任何更短的写法48..57,65..90,97..122:(map{ord}0..9,a..z,A..Z获取字符的ascii值)再增加一个字节。并且这样做for$c(0..122){$\+=chr($c)=~/\pl|\d/ for/(?=$c)/g}}{(查找所有数字,但仅保留其数字对应于字母(\pl)或数字(\d)的ascii值)将长5个字节(请注意\pl|\d不能替换\w为后者,因为后者也包括下划线)) 。


以前的方法(49字节):

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


1

的JavaScript(ES),165个 161 156 154 153字节

是的,RegEx绝对不是此处工作的正确工具!

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

试试吧

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


正则表达式还不错。我的视网膜答案端口为78个字节。
尼尔



1

Haskell中,161个 157 138 129 126字节

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

我想知道是否有比将Data.List导入nub更好的删除列表重复项的方法?


1
如果您导入Data.Lists而不是Data.List,则可以使用:y<-tail$powerslice x
nimi

@nimi如果我必须下载并安装非标准模块,是否违反高尔夫规则?我不认为Data.Lists在GHC中是标准的。
maple_shaft

据我所知,对于什么是标准模块,我们仍然没有达成共识。在这里有两个Haskell答案,它们使用Data.Lists。甚至在Haskell高尔夫球技巧中也提到了这一点-到目前为止,还没有人抱怨。
nimi

@nimi老实说,我想如果我可以从cabal下载任何软件包,我可以编写一个解决问题的函数,上传它,然后将模块导入我的解决方案中。从技术上讲,我可以作弊。但是,那么某些基本的GHC无法完成某些挑战,比如加密货币,所以我不知道。
maple_shaft

1
返回高尔夫技巧:or $ f <$> listany f listany(elem$read y)[...]
nimi

0

Pyth,19 17 14字节

l@jGUTmr0Csd.:

需要一个字符串。

-3字节感谢@LeakyNun

试试吧!

说明

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

idT可以使用代替使用sd
Leaky Nun

另外,l@jGUTmr0Csd.:可能会更短(不确定是否可行)。
Leaky Nun

@LeakyNun谢谢,这有效!
KarlKastor

0

果冻,8字节

ØBODf@ẆL

输入是一个数字数组。

在线尝试!

怎么运行的

Ø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个字节

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

从标准输入读取;需要使用-n选项(隐式while gets循环)调用Ruby解释器。

如果允许下划线匹配,则可以减少到43个字节。

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

这不会返回字符出现的次数。另外,它失败了111,应该返回,1但是您要还给0
价值墨水

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.