1つの数字で構成できる英数字の数を調べる


23

英数字にはASCII値があります。

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

あなたの挑戦は、入力として整数を取り、その数の連続した数字を使用して作成できる文字数を出力することです。文字コードが重複している可能性があります。が2回ある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

入力および出力形式はオプションです(はい、整数を文字列として使用できます)。

回答:


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動作しませんか?
魔法のタコUr

@carusocomputing:残念ながら、1111111テストケースに失敗します。
エミグナ

Ã、それは私がそれが何をしているのか読んでいるので、もっともっと意味があります、がらくた。
魔法のタコUr

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

私にとって残念なことに、あなたにとって幸いなことに、私は現時点でコンピューターにアクセスできません;)
リーキー修道女

@LeakyNun私はそれを行うための短い方法を考えましたが、どちらもバグのために失敗します。
致命的

T一緒に参加できますか?
リーキー修道女

1
このバグの原因は何ですか?
リーキー修道女

1
@LeakyNunたとえば、整数13の場合、無限に多くのリストがあり、13を含む無限に多くの整数があり、それらをリストする順序は明らかではありません。
致命的

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

今はコンピューターにアクセスできないため、確認できませんが、2つの提案があります。1.開始をforループに入れます。2.文字列操作の代わりに、算術を使用します(整数除算を使用して数字を反復処理し、モジュロを使用して最後の2桁または3桁を抽出します)。
リーキー修道女

@LeakyNun提案をありがとう。最初の例では、整数の初期化がforループの外側にある理由は、結果(r)を返す必要があるためです。しかし、他のすべてをforループ内の単一の3進数に入れることで、7バイトをゴルフすることができました。おそらくあなたの2番目の提案を後で行うことができるかどうかを確認します。昼休みが再び終わったので、仕事に戻らなければなりません。覚えておいてください。
ケビンCruijssen

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値を取得する)は1バイト長くなります。そして、for$c(0..122){$\+=chr($c)=~/\pl|\d/ for/(?=$c)/g}}{(すべての数字を探しますが、数字が文字のアスキー値(\pl)または数字(\d)に対応する数字のみを保持する)は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


正規表現はそれほど悪くありません。Retinaの回答のポートは78バイトになりました。
ニール



1

ハスケル、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]]]

nubのData.Listをインポートするよりも、リストの重複を削除するより良い方法があるのだろうか?


1
Data.Lists代わりにインポートする場合はData.List、次を使用できますy<-tail$powerslice x
-nimi

@nimi非標準モジュールをダウンロードしてインストールする必要がある場合、ゴルフ規則に違反していますか?Data.ListsはGHCの標準だとは思いません。
maple_shaft

私の知る限り、標準モジュールと見なされるものについてはまだ意見が一致していません。ここの周りにHaskellの答えがいくつかありますData.ListsHaskellゴルフのヒントにも言及されています。これまで文句を言ったことはありません。
-nimi

@nimi正直なところ、cabalからパッケージをダウンロードできるのであれば、問題を解決する関数を記述してアップロードし、ソリューションにモジュールをインポートできると思います。技術的にはチートできました。しかし、その後、基本的なGHCでは暗号化のような特定の課題を行うことはできませんので、私は知りません。
maple_shaft

1
ヒントをゴルフに戻る:or $ f <$> listですany f listany(elem$read y)[...]
-nimi

0

Pyth、19 17 14バイト

l@jGUTmr0Csd.:

文字列を受け取ります。

@LeakyNunのおかげで-3バイト

それを試してみてください!

説明

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
リーキー修道女

また、l@jGUTmr0Csd.:短くなる場合があります(動作するかどうかはわかりません)。
リーキー修道女

@LeakyNunありがとう、これはうまくいく!
カールカストール

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

ルビー、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
バリューインク

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.