Temukan berapa banyak karakter alfanumerik yang dapat terdiri dari satu angka

23

Karakter alfanumerik memiliki nilai ASCII:

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

Tantangan Anda adalah mengambil integer sebagai input, dan menghasilkan berapa banyak karakter yang dapat dibuat menggunakan angka berurutan dari angka itu. Kode karakter mungkin tumpang tindih. 666harus menghasilkan 2, karena Anda memiliki 66dua kali.

Kasus uji:

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

Format input dan output adalah opsional (ya, Anda dapat menggunakan integer sebagai string).

Stewie Griffin
sumber

Jawaban:

11

05AB1E , 8 7 byte

žKÇIŒÃg

Cobalah online!

Penjelasan

ž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
sumber
ŒžKÇÃgtidak bekerja?
Magic Octopus Urn
@carusocomputing: Sayangnya, ini gagal dalam 1111111test-case.
Emigna
Ã, itu jauh lebih masuk akal sekarang setelah saya membaca apa yang dilakukannya, sial.
Guci Gurita Sihir
7

Brachylog , 22 byte

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

Cobalah online!

Penjelasan

       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
Fatalisasi
sumber
Sayangnya bagi saya, untungnya bagi Anda, saya tidak memiliki akses ke komputer saat ini;)
Leaky Nun
@ LeakyNun Saya telah memikirkan cara yang lebih pendek untuk melakukannya, keduanya gagal karena bug.
Fatalkan
Bisakah Anda menggabungkan keduanya T?
Leaky Nun
1
Apa penyebab bug ini?
Leaky Nun
1
@ LeakyNun Untuk mis. Integer 13, ada banyak daftar yang tak terhingga banyaknya, dan tak terhingga banyak bilangan bulat yang mengandung 13, dan tidak jelas urutan mana yang harus Anda daftarkan.
Fatalkan
7

MATL , 17 13 byte

8Y2"G@oVXf]vn

Cobalah online! Atau verifikasi semua kasus uji .

Penjelasan

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
sumber
6

Java 7, 204 197 195 byte

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

Penjelasan:

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

Kode uji:

Coba di sini.

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
sumber
Saya tidak dapat mengakses komputer saat ini, jadi saya tidak dapat mengkonfirmasi, tetapi di sini ada dua saran: 1. letakkan inisiasi ke dalam for loop. 2. alih-alih manipulasi string, gunakan aritmatika (gunakan divisi integer untuk beralih melalui digit dan gunakan modulo untuk mengekstrak 2 atau 3 digit terakhir).
Leaky Nun
@ LeakyNun Terima kasih atas sarannya. Adapun yang pertama Anda, alasan inisialisasi integer berada di luar for-loop adalah karena saya harus mengembalikan hasilnya ( r). Namun, saya bisa bermain golf 7 byte dengan meletakkan semua yang lain di dalam for-loop, dalam satu ternary. Saya akan melihat apakah saya bisa melakukan saran kedua Anda nanti. Waktu makan siang saya selesai lagi, jadi saya harus kembali bekerja. Akan mengingatnya.
Kevin Cruijssen
5

JavaScript (ES6), 71 70 byte

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

Uji kasus

Arnauld
sumber
4

Perl 5 , 47 byte

46 byte kode + -pbendera.

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

Cobalah online!

Saya tidak dapat menemukan cara yang lebih singkat untuk menulis itu 48..57,65..90,97..122: map{ord}0..9,a..z,A..Z(mendapatkan nilai karakter ascii) lebih lama satu byte. Dan melakukan for$c(0..122){$\+=chr($c)=~/\pl|\d/ for/(?=$c)/g}}{(mencari semua angka, tetapi hanya menyimpan orang-orang yang jumlahnya sesuai dengan nilai ascii huruf ( \pl) atau digit ( \d)) akan menjadi 5 byte lebih lama (catatan yang \pl|\dtidak dapat diganti oleh \wkarena yang terakhir juga termasuk garis bawah)) .


Pendekatan sebelumnya (49 byte):

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

PHP, 68 Bytes

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

Versi Online

Jörg Hülsermann
sumber
1

JavaScript (ES), 165 161 156 154 153 byte

Ya, RegEx jelas bukan alat yang tepat untuk pekerjaan di sini!

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

Cobalah

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

Shaggy
sumber
Regexp tidak terlalu buruk; Port jawaban Retina saya mencapai 78 byte.
Neil
1

Python 2 , 74 64 62 byte

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

Cobalah online!

Dennis
sumber
1

Haskell, 161 157 138 129 126 byte

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

Saya ingin tahu apakah ada cara yang lebih baik untuk menghapus dupes dari daftar daripada mengimpor Data.List untuk nub?

maple_shaft
sumber
1
Jika Anda mengimpor Data.Listsbukan Data.List, Anda dapat menggunakan: y<-tail$powerslice x.
nimi
@nimi Apakah melanggar aturan main golf jika saya harus mengunduh dan memasang modul non standar? Saya tidak berpikir Data. Daftar adalah standar dalam GHC.
maple_shaft
Sejauh yang saya tahu kami masih belum memiliki konsensus tentang apa yang dianggap sebagai modul standar. Ada beberapa jawaban Haskell di sekitar sini yang digunakan Data.Lists. Bahkan disebutkan dalam tips golf untuk Haskell - tidak ada yang mengeluh sejauh ini.
nimi
@nimi Yah jujur ​​saya pikir jika saya bisa mengunduh paket apa saja dari komplotan rahasia, saya hanya bisa menulis fungsi yang memecahkan masalah, mengunggahnya, lalu mengimpor modul dalam solusi saya. Secara teknis saya bisa curang. Tapi kemudian tantangan tertentu tidak dapat dilakukan dengan GHC dasar baik seperti hal-hal kripto jadi saya tidak tahu.
maple_shaft
1
Kembali ke golf tips: or $ f <$> listadalah any f list: any(elem$read y)[...].
nimi
0

Pyth, 19 17 14 byte

l@jGUTmr0Csd.:

mengambil string.

-3 Bytes berkat @LeakyNun

Cobalah!

Penjelasan

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
sumber
Alih-alih menggunakan idT, Anda bisa menggunakan sd.
Leaky Nun
Juga, l@jGUTmr0Csd.:mungkin lebih pendek (tidak yakin apakah itu berfungsi).
Leaky Nun
@ LeakyNun Terima kasih, ini berhasil!
KarlKastor
0

Jelly , 8 byte

ØBODf@ẆL

Input adalah array digit.

Cobalah online!

Bagaimana itu bekerja

Ø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
sumber
0

Ruby, 50 byte

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

Membaca dari input standar; mengharuskan penerjemah Ruby dipanggil dengan -nopsi ( while getsloop implisit ).

Bisa dikurangi menjadi 43 byte jika diizinkan untuk cocok dengan garis bawah.

p (0..~/$/).any?{|n|$_[n,2].to_i.chr=~/\w/}
Ray Hamel
sumber
Ini tidak mengembalikan berapa kali karakter muncul. Juga, gagal 111, yang seharusnya kembali 1tetapi Anda memberi kembali 0.
Nilai Tinta