ค้นหาจำนวนตัวอักษรและตัวเลขที่สามารถสร้างขึ้นจากตัวเลขเดียว


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

รูปแบบอินพุตและเอาต์พุตเป็นตัวเลือก (ใช่คุณอาจใช้จำนวนเต็มเป็นสตริง)

คำตอบ:


11

05AB1E , 8 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ไม่ทำงานใช่ไหม
Magic Octopus Urn

@carusocomputing: น่าเสียดายที่มันไม่ผ่านการ1111111ทดสอบ
Emigna

Ãที่เหมาะสมมากขึ้นตอนนี้ฉันอ่านสิ่งที่มันทำอึ
Magic Octopus Urn

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 ฉันคิดว่าวิธีที่สั้นกว่าในการทำทั้งสองอย่างล้มเหลวเนื่องจากข้อบกพร่อง
ลดขนาด

คุณสามารถเข้าร่วมทั้งสองTด้วยกันได้หรือไม่
Leun Nun

1
อะไรคือสาเหตุของข้อผิดพลาดนี้?
แม่ชีที่รั่วไหล

1
@LeakyNun สำหรับเช่นจำนวนเต็ม 13 มีหลายรายการไม่สิ้นสุดและจำนวนเต็มมากมายที่มี 13 และไม่ชัดเจนว่าคุณควรเรียงลำดับรายการใด
ลดขนาด

7

MATL , 17 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. นำการเริ่มต้นไปสู่การวนซ้ำ 2. แทนการจัดการสตริงใช้เลขคณิต (ใช้การหารจำนวนเต็มเพื่อวนซ้ำตามหลักและใช้โมดูโลเพื่อแยก 2 หรือ 3 หลักสุดท้าย)
Leun Nun

@LeakyNun ขอบคุณสำหรับคำแนะนำ สำหรับอันแรกของคุณเหตุผลที่การกำหนดค่าเริ่มต้นของจำนวนเต็มอยู่นอก for-loop นั้นก็เพราะฉันต้องส่งคืนผลลัพธ์ ( r) อย่างไรก็ตามฉันสามารถเล่นกอล์ฟได้ 7 ไบต์ด้วยการวางทุกอย่างไว้ในวงเดียว ฉันจะดูว่าฉันสามารถทำตามคำแนะนำที่สองของคุณในภายหลังได้ไหม เวลาอาหารกลางวันของฉันสิ้นสุดลงอีกครั้งดังนั้นฉันจะต้องกลับไปทำงาน จะเก็บไว้ในใจ
Kevin 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 ของตัวอักษร) เป็นอีกหนึ่งไบต์ และทำfor$c(0..122){$\+=chr($c)=~/\pl|\d/ for/(?=$c)/g}}{(มองหาตัวเลขทั้งหมด แต่เก็บเฉพาะผู้ที่ตัวเลขสอดคล้องกับค่า ASCII ของตัวอักษร ( \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


Regexp นั้นไม่เลวเลย พอร์ตของคำตอบจอประสาทตาของฉันมาถึง 78 ไบต์
Neil



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 สุจริตฉันคิดว่าถ้าฉันสามารถดาวน์โหลดแพคเกจใด ๆ จากพันธมิตรฉันก็สามารถเขียนฟังก์ชั่นที่แก้ปัญหาอัปโหลดแล้วนำเข้าโมดูลในการแก้ปัญหาของฉัน ในทางเทคนิคฉันสามารถโกง แต่แล้วความท้าทายบางอย่างก็ไม่สามารถทำได้กับ GHC พื้นฐานเช่นเดียวกับ crypto stuff ดังนั้นฉันไม่รู้
maple_shaft

1
กลับไปเคล็ดลับการเล่นกอล์ฟ: or $ f <$> listคือ:any f list any(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
Leun Nun

และl@jGUTmr0Csd.:อาจสั้นกว่านี้ (ไม่แน่ใจว่าใช้งานได้หรือไม่)
Leun 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}/}

อ่านจากอินพุตมาตรฐาน ต้องการให้ตัวแปล Ruby ถูกเรียกใช้ด้วย-nตัวเลือก ( while getsloop implicit )

อาจลดลงเหลือ 43 ไบต์หากได้รับอนุญาตให้จับคู่ขีดล่าง

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

สิ่งนี้จะไม่ส่งคืนจำนวนครั้งที่อักขระปรากฏขึ้น นอกจากนี้ก็ล้มเหลวบน111ซึ่งควรจะกลับแต่คุณให้กลับ1 0
มูลค่าหมึก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.