Tìm có bao nhiêu ký tự chữ và số có thể được tạo thành từ một số duy nhất


23

Các ký tự chữ và số có các giá trị ASCII:

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

Thử thách của bạn là lấy một số nguyên làm đầu vào và xuất ra bao nhiêu ký tự có thể được thực hiện bằng các chữ số liên tiếp của số đó. Các mã ký tự có thể được chồng chéo. 666nên kết quả 2, vì bạn có 66hai lần.

Các trường hợp thử nghiệm:

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

Các định dạng đầu vào và đầu ra là tùy chọn (có, bạn có thể lấy số nguyên dưới dạng chuỗi).

Câu trả lời:


11

05AB1E , 8 7 byte

žKÇIŒÃg

Hãy thử trực tuyến!

Giải trình

ž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ÇÃgkhông làm việc
Bạch tuộc ma thuật Urn

@carusocomputing: Thật không may, nó không thành công trong 1111111trường hợp thử nghiệm.
Emigna

Ã, điều đó làm cho rất nhiều ý nghĩa bây giờ khi tôi đọc những gì nó đang làm, tào lao.
Bạch tuộc ma thuật Urn

7

Brachylog , 22 byte

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

Hãy thử trực tuyến!

Giải trình

       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

Thật không may cho tôi, may mắn thay cho bạn, tôi không có quyền truy cập vào máy tính vào lúc này;)
Leaky Nun

@LeakyNun Tôi đã nghĩ ra những cách ngắn hơn để làm điều đó, cả hai đều thất bại vì lỗi.
Gây tử vong

Bạn có thể tham gia Tcùng nhau không?
Leaky Nun

1
Nguyên nhân của lỗi này là gì?
Leaky Nun

1
@LeakyNun Ví dụ: số nguyên 13, có vô số danh sách và vô số số nguyên chứa 13 và không rõ ràng bạn nên liệt kê chúng theo thứ tự nào.
Gây tử vong

7

MATL , 17 13 byte

8Y2"G@oVXf]vn

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình

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

Giải trình:

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

Mã kiểm tra:

Hãy thử nó ở đây.

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

Tôi không thể truy cập máy tính ngay bây giờ, vì vậy tôi không thể xác nhận, nhưng đây là hai gợi ý: 1. đặt các khởi tạo vào vòng lặp for. 2. thay vì thao tác chuỗi, sử dụng số học (sử dụng phép chia số nguyên để lặp qua các chữ số và sử dụng modulo để trích xuất 2 hoặc 3 chữ số cuối).
Leaky Nun

@LeakyNun Cảm ơn những lời đề nghị. Đối với cái đầu tiên của bạn, lý do các khởi tạo số nguyên nằm ngoài vòng lặp for là vì tôi phải trả về kết quả ( r). Tuy nhiên, tôi đã có thể chơi golf 7 byte bằng cách đặt mọi thứ khác vào vòng lặp for, trong một ternary duy nhất. Tôi sẽ xem nếu tôi có thể làm đề nghị thứ hai của bạn sau này có lẽ. Giờ ăn trưa của tôi lại kết thúc, vì vậy tôi sẽ phải quay lại làm việc. Sẽ ghi nhớ nó.
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

Các trường hợp thử nghiệm


4

Perl 5 , 47 byte

46 byte mã + -pcờ.

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

Hãy thử trực tuyến!

Tôi không thể tìm thấy bất kỳ cách nào ngắn hơn để viết rằng 48..57,65..90,97..122: map{ord}0..9,a..z,A..Z(nhận giá trị ascii của các ký tự) dài hơn một byte. Và thực hiện for$c(0..122){$\+=chr($c)=~/\pl|\d/ for/(?=$c)/g}}{(tìm kiếm tất cả các số, nhưng chỉ giữ lại những số có số tương ứng với giá trị ascii của chữ cái ( \pl) hoặc chữ số ( \d)) sẽ dài hơn 5 byte (lưu ý \pl|\dkhông thể thay thế bởi \wvì sau này cũng bao gồm dấu gạch dưới) .


Cách tiếp cận trước (49 byte):

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


1

JavaScript (ES), 165 161 156 154 153 byte

Vâng, RegEx chắc chắn không phải là công cụ phù hợp cho công việc ở đây!

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

Thử nó

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


Regapi không tệ đến thế; Một cổng của câu trả lời Retina của tôi có tới 78 byte.
Neil



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

Tôi tự hỏi liệu có cách nào tốt hơn để loại bỏ các bản sao của danh sách hơn là nhập Data.List cho nub không?


1
Nếu bạn nhập Data.Liststhay vì Data.List, bạn có thể sử dụng : y<-tail$powerslice x.
nimi

@nimi Có trái với quy tắc chơi gôn không nếu tôi phải tải xuống và cài đặt các mô-đun không chuẩn? Tôi không nghĩ Data.Lists là tiêu chuẩn trong GHC.
maple_shaft

Theo như tôi biết, chúng ta vẫn chưa có sự đồng thuận về những gì được coi là một mô-đun chuẩn. Có một vài câu trả lời của Haskell ở đây sử dụng Data.Lists. Nó thậm chí còn được đề cập trong các mẹo chơi gôn cho Haskell - cho đến nay chưa có ai phàn nàn.
nimi

@nimi Thật lòng tôi nghĩ rằng nếu tôi có thể tải xuống bất kỳ gói nào từ cabal, tôi chỉ có thể viết một hàm giải quyết vấn đề, tải nó lên, sau đó nhập mô-đun vào giải pháp của mình. Về mặt kỹ thuật tôi có thể gian lận. Nhưng sau đó, một số thách thức nhất định không thể được thực hiện với GHC cơ bản giống như công cụ tiền điện tử nên tôi không biết.
maple_shaft

1
Quay lại với mẹo chơi golf: or $ f <$> listany f list: any(elem$read y)[...].
nimi

0

Pyth, 19 17 14 byte

l@jGUTmr0Csd.:

mất một chuỗi.

-3 Byte nhờ @LeakyNun

Thử nó!

Giải trình

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

Thay vì sử dụng idT, bạn có thể sử dụng sd.
Leaky Nun

Ngoài ra, l@jGUTmr0Csd.:có thể ngắn hơn (không chắc chắn nếu nó hoạt động).
Leaky Nun

@LeakyNun Cảm ơn bạn, điều này hoạt động!
KarlKastor

0

Thạch , 8 byte

ØBODf@ẆL

Đầu vào là một mảng chữ số.

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Ø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 byte

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

Đọc từ đầu vào tiêu chuẩn; yêu cầu trình thông dịch Ruby được gọi với -ntùy chọn ( while getsvòng lặp ẩn ).

Có thể giảm xuống 43 byte nếu nó được phép khớp với dấu gạch dưới.

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

Điều này không trả về số lần các nhân vật xuất hiện. Ngoài ra, nó không thành công 111, sẽ trả lại 1nhưng bạn đang trả lại 0.
Mực giá trị

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.