นับพัลส์หมุนหน้าปัดในหมายเลขโทรศัพท์ (รวมถึงตัวอักษร)


34

ในวันปู่ย่าตายายของคุณการหมุนหมายเลขโทรศัพท์ทำได้ด้วยการหมุนหน้าปัดเช่นนี้:

หากต้องการหมุนแต่ละหลักให้วางนิ้วของคุณในช่องที่เกี่ยวข้องดึงไปที่จุดหยุดนิ้วแล้วปล่อย กลไกจะทำให้หมุนหมุนกลับไปยังตำแหน่งพักและโทรศัพท์จะตัดการเชื่อมต่อและเชื่อมต่อวงจรตามจำนวนครั้งที่กำหนดทำให้มีเสียงคลิก

โทรหลักNต้องไม่มี “พัลส์” เช่นยกเว้น N = 0 ซึ่งเป็นพัลส์ที่สิบ

โทรศัพท์แบบหมุนมีคุณสมบัติที่ตัวเลขขนาดใหญ่ (8, 9, 0) ใช้เวลาในการโทรนานกว่าตัวเลขขนาดเล็ก (1, 2, 3) นี่คือการพิจารณาที่สำคัญในการวาดแผนที่รหัสพื้นที่ในช่วงต้นและทำไมมหานครนิวยอร์กที่มีประชากรหนาแน่น (และสายโทรศัพท์) มีความหนาแน่น212 (เพียง 5 พัลส์) ในขณะที่907 (26 พัลส์) ไปที่อะแลสกา แน่นอนว่าทั้งหมดนี้ไม่เกี่ยวข้องเมื่อการโทรออกด้วยระบบสัมผัสกลายเป็นที่นิยม

ความท้าทาย

เขียนเป็นสองสามไบต์เป็นไปได้โปรแกรมหรือฟังก์ชั่นที่ใช้เป็นสายอักขระ (หรือลำดับของตัวอักษร) ที่มีหมายเลขโทรศัพท์และส่งออกจำนวนพัลส์หมุนหน้าปัด สิ่งเหล่านี้จะถูกนับดังนี้:

ตัวเลข

  • ตัวเลข 1-9 จะนับเป็นจำนวนพัลส์นั้น
  • หลัก 0 นับเป็น 10 พัลส์

จดหมาย

โปรดทราบว่าตัวเลข 2-9 บนหน้าปัดมีตัวอักษรของตัวอักษรละตินที่เกี่ยวข้อง เหล่านี้เดิมทีตั้งใจสำหรับการแลกเปลี่ยนชื่อแต่หลังใหม่ที่เหมาะสมสำหรับphonewordsและสำหรับข้อความระบบการป้อนข้อความ

คุณต้องสนับสนุนการมีตัวอักษรในหมายเลขโทรศัพท์ของคุณโดยใช้E.161 การกำหนดตัวอักษรเป็นตัวเลข:

  • A, B, C = 2
  • D, E, F = 3
  • G, H, I = 4
  • J, K, L = 5
  • M, N, O = 6
  • P, Q, R, S = 7
  • T, U, V = 8
  • W, X, Y, Z = 9

คุณอาจสันนิษฐานว่าอินพุตได้รับการแบ่งเป็นตัวพิมพ์เล็กและตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็ก

ตัวละครอื่น ๆ

คุณต้องอนุญาตให้ใช้อักขระ()+-./และช่องว่างโดยพลการเพื่อจัดรูปแบบตัวคั่น คุณอาจเลือกที่จะช่วยให้การใด ๆของตัวละครที่ไม่ใช่ตัวเลขเพื่อการนี้ถ้ามันง่ายต่อการใช้

อักขระเหล่านี้ไม่ได้มีส่วนช่วยนับจำนวนพัลส์

รหัสตัวอย่าง

ตารางค้นหาและฟังก์ชั่นที่ไม่ใช่กอล์ฟใน Python:

PULSES = {
    '1': 1,
    '2': 2, 'A': 2, 'B': 2, 'C': 2,
    '3': 3, 'D': 3, 'E': 3, 'F': 3,
    '4': 4, 'G': 4, 'H': 4, 'I': 4,
    '5': 5, 'J': 5, 'K': 5, 'L': 5,
    '6': 6, 'M': 6, 'N': 6, 'O': 6,
    '7': 7, 'P': 7, 'Q': 7, 'R': 7, 'S': 7,
    '8': 8, 'T': 8, 'U': 8, 'V': 8,
    '9': 9, 'W': 9, 'X': 9, 'Y': 9, 'Z': 9,
    '0': 10
}

def pulse_count(phone_num):
    return sum(PULSES.get(digit, 0) for digit in phone_num)

ตัวอย่างอินพุทและเอาท์พุท

  • 911 → 11
  • 867-5309 → 48
  • 713 555 0123 → 42
  • +1 (212) PE6-5000 → 57
  • 1-800-FLOWERS → 69
  • PUZZLES → 48

ฉันคิดว่าเครื่องหมายวรรคตอนและช่องว่างของArbitrary ASCIIนั้นถูก จำกัด เฉพาะที่ใช้สำหรับหมายเลขโทรศัพท์ ( +- ()*#.) เช่นเดียวกับตัวอักษรที่ถูก จำกัด ให้เป็นตัวพิมพ์ใหญ่ ช่วยแก้ให้ด้วยนะถ้าฉันผิด.
อดัม

1
@ Adám: ฉันได้ จำกัด เครื่องหมายวรรคตอนที่จำเป็นให้กับตัวคั่นทั่วไปสองสามตัว มันไม่รวม*และจงใจ#ซึ่งมีความหมายพิเศษบนโทรศัพท์แบบกดปุ่มและไม่สามารถหมุนได้ใน rotaries
dan04

1
เราสามารถใช้อินพุตตัวพิมพ์เล็กทั้งหมดแทนตัวพิมพ์ใหญ่ทั้งหมดได้หรือไม่? เราสามารถใช้ชุดอักขระแทนชุดอักขระได้หรือไม่?
Grimmy

1
ฉันเป็นนักเดินทางข้ามเวลา! ฉันเป็นนักเดินทางข้ามเวลา! ฉันเป็นนักเดินทางข้ามเวลา! เนื่องจากฉันใช้โทรศัพท์อย่างนี้เมื่อฉันยังเป็นเด็กฉันเป็นของฉันเอง GRANDFATHER !!!!!!! ซึ่งจริง ๆ แล้วมันค่อนข้างลำบากเมื่อฉันคิดถึงมัน Bleah !!!
Bob Jarvis

3
ฉันเป็นปู่ ฉันใช้โทรศัพท์ในลักษณะนี้ในปี 1950 และเมื่อฉันย้ายไปอยู่ที่เมืองในพื้นที่ชนบทฉันพบว่า บริษัท โทรศัพท์ไม่ได้ให้บริการระบบสัมผัส นี่คือในปี 1985! ไม่ได้ล้อเล่น! ยายของฉันมีโทรศัพท์ในห้องนั่งเล่นที่มีตะขอและข้อเหวี่ยง คุณถอดหูฟังออกจากตะขอแล้วหมุนข้อเหวี่ยงเพื่อรับโอเปอเรเตอร์สวิตช์บอร์ด เธอต้องเปลี่ยนเมื่อตั้งค่าการโทรทางไกลโดยตรง
Walter Mitty

คำตอบ:


25

05AB1E , 19 18 17 15 ไบต์

AÁ0ªā6+žq÷9š‡þO

ลองออนไลน์!

นี่เป็นคำตอบแรกที่ใช้π ทำไมต้องใช้πคุณอาจถาม 22233344455566677778889999 ตามลำดับ สังเกตว่าตัวเลขส่วนใหญ่ซ้ำ 3 ครั้ง แต่ 7 ซ้ำ 4 ครั้ง คุณสามารถพูดได้ว่าโดยเฉลี่ยแต่ละหลักซ้ำ (3 + 1/7) ครั้งโดยเฉลี่ย ฉันสงสัยว่ามีจำนวนใดที่ประมาณ 3 + 1/7 และใช้จำนวนไบต์น้อยกว่า 22/7 ...

สิ่งนี้ให้ 4 7s ไม่ใช่ 4 9s ดังนั้นเรายังต้องจัดการ Z เป็นกรณีพิเศษ

A               # alphabet (abcdefghijklmnopqrstuvwxyz)
 Á              # rotate right (zabcdefghijklmnopqrstuvwxy)
  0ª            # append 0 (zabcdefghijklmnopqrstuvwxy0)

ā6+             # range [7..33]
   žq÷          # divide by π (22233344455566677778889991010)
      9š        # prepend 9 (922233344455566677778889991010)

‡               # transliterate the implicit input with the two lists above
                # this replaces z → 9, a → 2, … y → 9, 0 → 10
 þ              # remove all non-digits
  O             # sum

ทำไมต้องเป็นตัวพิมพ์เล็กแทนที่จะเป็นตัวพิมพ์ใหญ่?
dan04

1
@ dan04 เพราะ 05AB1E มี built-in เพื่อผลักดันแต่ไม่ได้สำหรับ"abcdefghijklmnopqrstuvwxyz" "ABCDEFGHIJKLMNOPQRSTUVWXYZ"ฉันสามารถแปลงตัวอักษรเป็นตัวพิมพ์ใหญ่แทนที่จะแปลงอินพุตเป็นตัวพิมพ์เล็ก แต่นั่นก็เป็นจำนวนไบต์เดียวกัน
Grimmy

1
ฉันได้แก้ไขคำถามเพื่อทำให้คำสั่งสองคำแรกของคุณไม่จำเป็น
dan04

3
@Jonah ฉันเริ่มต้นด้วยความคิดในการแบ่งช่วงด้วยค่าคงที่เพื่อให้ได้ลำดับที่ต้องการจากนั้นในขณะที่มองหาวิธีที่ดีที่สุดในการแสดง "มากกว่า 3 เล็กน้อย" ใน 05AB1E ฉันจำได้ว่า Pi เป็นแบบในตัว
Grimmy

2
+1 สำหรับการใช้ pi
Draconis

9

C # (Visual C # Interactive คอมไพเลอร์) , 51 ไบต์

n=>n.Sum(x=>x>64?(x-59-x/83-x/90)/3:x>47?1-~x%~9:0)

บันทึกแล้ว 1 ไบต์ขอบคุณ @recursive

บันทึก 10 ไบต์ด้วยการสังเกตของ @ ExpiredData ว่า() +-/.จะอยู่ในอินพุตเท่านั้น

ลองออนไลน์!

n =>                     // Function taking input as string
  n.Sum(x =>             // Map each value 'x' through the following
    x>64 ?               //   If 'x' is an uppercase letter
      (x-59-x/83-x/90)/3 //     Take each char's ASCII value subtracted by 59, and subtract
                         //     one if the char is 'S' and one if the char is 'Z'
    : x>47 ?             //   Else if the char is a digit
      1-~x%~9            //   Take 1 - (-x - 1) % -10 (Maps 0 to 10, and 1-9 to themselves
    : 0                  //   Else, 0
  )                      // And sum it all up, then return it

4
-10คือ~9ซึ่งควรทำงานในบริบท
เรียกซ้ำ

@ recursive นั่นคือสมาร์ทขอบคุณ
ศูนย์รวมของความไม่รู้

1
x <91 การตรวจสอบซ้ำซ้อนเนื่องจากอินพุตจะประกอบด้วย () + -. / คีย์พื้นที่และตัวเลขทั้งหมด <64 ดังนั้นเราสามารถตรวจสอบว่าอักขระเป็นตัวพิมพ์ใหญ่เพียงแค่ตรวจสอบ x> 64 (ดังนั้น -5 ไบต์)
ข้อมูลที่หมดอายุ

กันไปสำหรับการตรวจสอบ x <58 เนื่องจากไม่มีสิ่งใดในช่วง 58-64 จะอยู่ในอินพุต
ข้อมูลหมดอายุ


5

APL (Dyalog Unicode) , 27 ไบต์SBCS

ฟังก์ชันนำหน้าเงียบโดยไม่ระบุชื่อ

+/'@ADGJMPTW'∘⍸+11|(1⌽⎕D)∘⍳

ลองออนไลน์!

(... )∘⍳ ค้นหาɩ ndex * ของอักขระแต่ละตัวในสตริงต่อไปนี้:
  * องค์ประกอบที่ไม่พบ, รับดัชนี 1 + ดัชนีสูงสุด, เช่น 11
⎕D  หลัก:"0123456789"

1⌽ หมุนไปทางซ้ายหนึ่งก้าว "1234567890"

11| ส่วนที่เหลือเมื่อหารด้วย 11 *
  * สิ่งนี้จะให้ 0 สำหรับทุกคนที่ไม่ใช่ตัวเลข
... + เพิ่มที่ต่อไปนี้:

'@ADGJMPTW'∘⍸ɩ nterval ɩ nDex * สำหรับตัวละครแต่ละตัว
  * ดังนั้น [-∞ "@") ให้ 0, [ "@", "A") ให้ 1 [ "A", "D") ให้ 2 ฯลฯ
+/  จำนวนเงินนั้น


5

Python 2 , 74 ไบต์

lambda s:sum([(n-59-n/83-n/90)/3,1-~n%~9][n<58]for n in map(ord,s)if n>47)

ลองออนไลน์!

ทำการคำนวณทางคณิตศาสตร์บางอย่างสำหรับค่า ASCII สำหรับแต่ละอักขระ ตัวเลือกแรกจะตรวจสอบตัวอักษรและตัวเลือกที่สองจะตรวจสอบตัวเลข การชี้แจงว่าอักขระเครื่องหมายวรรคตอนทั้งหมดที่ได้รับอนุญาตในอินพุตเป็นอักขระที่มีค่า ASCII น้อยกว่า 48 ให้ฉันทำให้ตรรกะง่ายขึ้น แต่วิธีการใหม่ทั้งหมดอาจดีกว่า

Python 2 , 84 ไบต์

lambda s:sum(1+'1xxxx2ABCx3DEFx4GHIx5JKLx6MNOx7PQRS8TUVx9WXYZ0'.find(c)/5for c in s)

ลองออนไลน์!

ใช้สตริงการค้นหาแบบ hardcoded โดยแต่ละบล็อกมีอักขระ 5 ตัวที่สอดคล้องกับอักขระที่ให้แต่ละค่าเริ่มต้นด้วย 1 ช่องว่างเต็มไปด้วยxซึ่งไม่สามารถอยู่ในอินพุตที่เป็นตัวพิมพ์ใหญ่ โชคดีที่ตัวละครที่ไม่ปรากฏในการผลิตสตริง-1สำหรับ.findที่ให้สรุปของศูนย์


5

JavaScript (Node.js) , ... 76 69 ไบต์

s=>s.replace(/\w/g,q=>w+=1/q?+q||10:parseInt(q,35)*.32-1|0||9,w=0)&&w

ลองออนไลน์!

-7 ขอบคุณ @Arnauld!

คำอธิบาย

 q |     1/q     |  +q  | parseInt(q,35)*.32 | parseInt(q,35)*.32-1|0 | Output
---+-------------+------+--------------------+------------------------+--------
 0 | Infinity(T) | 0(F) |         N/A        |           N/A          |   10
 1 |  1.0000(T)  | 1(T) |         N/A        |           N/A          |    1
 2 |  0.5000(T)  | 2(T) |         N/A        |           N/A          |    2
 3 |  0.3333(T)  | 3(T) |         N/A        |           N/A          |    3
 4 |  0.2500(T)  | 4(T) |         N/A        |           N/A          |    4
 5 |  0.2000(T)  | 5(T) |         N/A        |           N/A          |    5
 6 |  0.1666(T)  | 6(T) |         N/A        |           N/A          |    6
 7 |  0.1428(T)  | 7(T) |         N/A        |           N/A          |    7
 8 |  0.1250(T)  | 8(T) |         N/A        |           N/A          |    8
 9 |  0.1111(T)  | 9(T) |         N/A        |           N/A          |    9
 A |    NaN(F)   |  N/A |        3.20        |          2(T)          |    2
 B |    NaN(F)   |  N/A |        3.52        |          2(T)          |    2
 C |    NaN(F)   |  N/A |        3.84        |          2(T)          |    2
 D |    NaN(F)   |  N/A |        4.16        |          3(T)          |    3
 E |    NaN(F)   |  N/A |        4.48        |          3(T)          |    3
 F |    NaN(F)   |  N/A |        4.80        |          3(T)          |    3
 G |    NaN(F)   |  N/A |        5.12        |          4(T)          |    4
 H |    NaN(F)   |  N/A |        5.44        |          4(T)          |    4
 I |    NaN(F)   |  N/A |        5.76        |          4(T)          |    4
 J |    NaN(F)   |  N/A |        6.08        |          5(T)          |    5
 K |    NaN(F)   |  N/A |        6.40        |          5(T)          |    5
 L |    NaN(F)   |  N/A |        6.72        |          5(T)          |    5
 M |    NaN(F)   |  N/A |        7.04        |          6(T)          |    6
 N |    NaN(F)   |  N/A |        7.36        |          6(T)          |    6
 O |    NaN(F)   |  N/A |        7.68        |          6(T)          |    6
 P |    NaN(F)   |  N/A |        8.00        |          7(T)          |    7
 Q |    NaN(F)   |  N/A |        8.32        |          7(T)          |    7
 R |    NaN(F)   |  N/A |        8.64        |          7(T)          |    7
 S |    NaN(F)   |  N/A |        8.96        |          7(T)          |    7
 T |    NaN(F)   |  N/A |        9.28        |          8(T)          |    8
 U |    NaN(F)   |  N/A |        9.60        |          8(T)          |    8
 V |    NaN(F)   |  N/A |        9.92        |          8(T)          |    8
 W |    NaN(F)   |  N/A |       10.24        |          9(T)          |    9
 X |    NaN(F)   |  N/A |       10.56        |          9(T)          |    9
 Y |    NaN(F)   |  N/A |       10.88        |          9(T)          |    9
 Z |    NaN(F)   |  N/A |         NaN        |          0(F)          |    9

ทั้งหมด[space]().+-/ยังไม่ได้บันทึกโดย/\w/gดังนั้นพวกเขาจะไม่ส่งผลกระทบทั้งหมด




4

เรติน่า 0.8.2 , 34 ไบต์

T`WTPMJGDA`Rd
}T`L`2L
0
55
\d
$*
1

ลองออนไลน์! ลิงค์มีกรณีทดสอบ คำอธิบาย:

T`WTPMJGDA`Rd

แปลงตัวอักษรให้กับตัวเลขWTPMJGDA9..0

}T`L`2L

สลับตัวอักษรที่เหลือทั้งหมดลง 1 และทำซ้ำจนกว่าตัวอักษรทั้งหมดจะถูกแปลงเป็นตัวเลข

0
55

แทนที่0ด้วย55เมื่อพวกเขาใช้จำนวนพัลส์เท่ากันเพื่อโทรออก

\d
$*
1

นำผลรวมดิจิตอล


3

K4 , 44 ไบต์

วิธีการแก้:

+/(1+(1+&(5#3),4 3 4),!10)(.Q.A,1_.Q.n,"0")?

ตัวอย่าง:

q)k)+/(1+(1+&(5#3),4 3 4),!10)(.Q.A,1_.Q.n,"0")?"911"
11
q)k)+/(1+(1+&(5#3),4 3 4),!10)(.Q.A,1_.Q.n,"0")?"867-5309"
48
q)k)+/(1+(1+&(5#3),4 3 4),!10)(.Q.A,1_.Q.n,"0")?"+1 (212) PE6-5000"
57
q)k)+/(1+(1+&(5#3),4 3 4),!10)(.Q.A,1_.Q.n,"0")?"1-800-FLOWERS"
69

คำอธิบาย:

วิธีการไร้เดียงสาน่าจะเล่นได้สวย ดัชนีการค้นหาของตัวละครคะแนนการค้นหาผลรวม

+/(1+(1+&(5#3),4 3 4),!10)(.Q.A,1_.Q.n,"0")? / the solution
                                           ? / lookup
                          (               )  / do this together
                                       "0"   / string "0"
                                      ,      / join with
                                  .Q.n       / string "0123456789"
                                1_           / drop first
                               ,             / join with
                           .Q.A              / "A..Z"
  (                      )                   / do this together
                      !10                    / range 0..9
                     ,                       / join with
     (              )                        / do this together
               4 3 4                         / list (4;3;4)
              ,                              / join with
         (5#3)                               / list (3;3;3;3;3)
        &                                    / where, creates list 0 0 0 1 1 1 2 2 etc
      1+                                     / add 1
   1+                                        / add 1
+/                                           / sum up

3

Perl 6 , 53 ไบต์

{sum +<<m:g/\d/X||10}o{S:g[<:L>]=$/.ord*.313-28+|0+9}

ลองออนไลน์!

คูณรหัส ASCII กับ 0.313 แทน 1/3 และการใช้ OR ระดับบิตซึ่งรอบให้เป็นศูนย์ที่จะได้รับอคติที่ถูกต้อง



2

Bash , 256 ไบต์

คุณสามารถแทนที่(( … ))โครงสร้างด้วยletจำนวนไบต์ที่เหมือนกัน อาจมีอัลกอริทึมที่ดีในการลดคำสั่ง case แต่ไม่พบจนถึงตอนนี้ ด้วยการทำงานซ้ำเล็กน้อยคุณสามารถทำให้เป็นฟังก์ชั่นได้เช่นกัน (แต่ไม่ได้อยู่ในไบต์เดียวกันหรือน้อยกว่าเว้นแต่ว่าคุณสามารถลดส่วนfunction fname { … }บนและส่วนท้าย)

read p;while ((${#p}>0));do case ${p:0:1} in ([1-9]) ((d+=${p:0:1}));; ([0]) ((d+=10));; ([ABC) ((d+=2));; ([P-S]) ((d+=7));; ([W-Z]) ((d+=9));;([DEF]) ((d+=3));; ([GHI]) ((d+=4));; ([JKL]) ((d+=5));; ([MNO]) ((d+=6));; (?) d=$d; esac;p=${p#?};done;echo $d

ลองออนไลน์!

ทางออกที่ดีกว่าโดยใช้เทคนิคตัวละครแผนที่ทำให้การใช้trเครื่องมือ:

[Bash with tr], 173 ไบต์

read p;p=$(echo $p|tr A-Z 22233344455566677778889999);while ((${#p}>0));do case ${p:0:1} in ([1-9]) ((d+=${p:0:1}));; ([0]) ((d+=10));; (?) d=$d; esac;p=${p#?}; done;echo $d

ลองออนไลน์!


อัลกอริทึมหนึ่งที่ฉันพลาดแน่นอนคือการทำการเปลี่ยน / แปลสตริงใน AZ มันจะดี ฉันจะแก้ไขด้านบนให้เหมาะสม
PJF

while((${#p}))ทำงานประหยัดสามไบต์ c=${p:0:1};case c in ([0-9]) ((d+=c?c:10));;ช่วยประหยัดอีกด้วย 16. tr -dc 0-9เพิ่มไปยังท่อทีอาร์ที่คุณไม่จำเป็นต้องมีคำสั่งกรณีที่ทั้งหมดและนอกจากนี้สามารถพับลงไปในสภาพที่มีwhile &&
โอ้พระเจ้าของฉัน

ขอบคุณ OMG ฉันไม่ได้ใช้งานที่ได้รับมอบหมายบ่อยครั้งดังนั้นฉันจึงพลาดมันไป การใช้งานส่วนประกอบเสริมการลบที่น่าสนใจเช่นกัน (แต่ถือว่าเป็นวิธีแก้ปัญหาของฉันไม่สนใจอักขระอื่น ๆ ) ฉันจัดการเพื่อให้มันลงไปที่ 133 ไบต์เช่นเดียวกับใน: read p;p=$(echo $p|tr A-Z 22233344455566677778889999|tr -dc [0-9]);while ((${#p}));do c=${p:0:1}&&((d+=c?c:10));p=${p#?};done;echo $d
PJF

1
118: p=$(head -1|tr A-Z 22233344455566677778889|tr -dc 0-9);while((${#p}));do((d+=(c=${p:0:1})?c:10));p=${p#?};done;echo $d.. ไม่จำเป็นต้องใช้สาม 9 ตัวสุดท้ายเพราะ tr จะใช้อักขระการแทนที่ล่าสุดอีกครั้งหากอาร์กิวเมนต์ที่สองสั้นเกินไป
โอ้พระเจ้าของฉัน

1
ตัวอย่างแรกสามารถแยกได้จาก 256 ถึง 236 โดยการลบช่องว่างที่ไม่จำเป็นออกไป read p;while((${#p}>0));do case ${p:0:1} in ([1-9])((d+=${p:0:1}));;([0])((d+=10));;([ABC)((d+=2));;([P-S])((d+=7));;([W-Z])((d+=9));;([DEF])((d+=3));;([GHI])((d+=4));;([JKL])((d+=5));;([MNO])((d+=6));;(?)d=$d;esac;p=${p#?};done;echo $d
สตีฟ

2

เจลลี่ , 33 24 ไบต์

7r32:ØP«9Ṿ€ØAżFyfØDV€o⁵S

ลองออนไลน์!

ลิงก์ monadic ที่ใช้สตริงเป็นอาร์กิวเมนต์และส่งคืนจำนวนพัล เขียนซ้ำโดยได้แรงบันดาลใจจากคำตอบ 05AB1E ของ @ Grimyดังนั้นโปรดอัปเกรดพวกเขาด้วย!


2

PowerShell , 109 102 87 ไบต์

$(switch -r($args|% t*y){\d{$_}[A-Y]{("{0}"-f(.313*$_-18))[0]}[Z]{9}0{10}})-join'+'|iex

ลองออนไลน์!

แก้ไข: ใช้ความคิดของ @ mazzy สำหรับสวิตช์ regex ด้วยการจัดรูปแบบสตริงบางอย่างเพื่อแปลงอักขระ -> int -> สตริงและคว้าเฉพาะ 'หลัก' ตัวแรก

เดิม:

[char[]]"$args"|%{$a+=(48,(('22233344455566677778889999')[$_-65],(58,$_)[$_-ne48])[$_-lt64])[$_-gt47]-=48};$a

ฉันหวังว่าจะได้รับ <100 ไบต์ดังนั้นฉันจะดูต่อไปเพื่อดูว่ามีอะไรที่ฉันสามารถทำได้ อาจมีวิธีลบสตริงตัวเลข

ขออภัยถ้ามันสับสนเพราะฉันซ้อนอาร์เรย์ด้วยคำสั่งการจัดทำดัชนีบูลีน แต่ -

คำอธิบาย:

[char[]]"$args"|%{อ่านการป้อนข้อมูลที่หล่อเป็นสตริงแล้วระเบิดไปยังแถวถ่านและเริ่มต้นสำหรับแต่ละวงที่มีการตรวจสอบ()[$_-gt47]เพื่อดูว่า()+-./ถูกป้อน (ทุกคนมีค่าอักขระ ASCII <48)
หมายเหตุ: Powershell ยอมรับ$trueและ$falseเป็น1และ0ตามลำดับสำหรับดัชนีอาร์เรย์

จากนั้นเราจะได้รับ48สัญลักษณ์หรือ:
('22233344455566677778889999'[$_-65],(58,$_)[$_-ne48])[$_-lt64]

การ[$_-lt64]ตรวจสอบตัวเลขหรือตัวอักษร (ทั้งหมดถือว่าเป็นทุนที่นี่) ถ้าเป็นตัวอักษรให้'22233344455566677778889999'[$_-65]เปลี่ยนเป็น 0-25 เพื่อทำดัชนีในอาร์เรย์และส่งค่าพัลส์ (เป็นตัวอักษร) หากตัวละครเป็นตัวเลขเราแทนที่จะดูที่: การ(58,$_)[$_-ne48]ตรวจสอบ0และการส่งออก58หรือเพียงตัวเลขถ่านตัวเอง

ทุกสิ่งรอบตัว$a+= ... -=48เริ่มต้นตัวแปรตัวเลข $ a ที่0แล้วเพิ่มเอาต์พุต เอาท์พุทเป็นค่าถ่าน ASCII 48ของตัวเลขเพื่อลบ

หมายเหตุ: ถ้าอินพุตเป็นสัญลักษณ์เราจะได้รับ$a+=48-48โดยไม่สนใจมัน ถ้าเป็น0เช่นนั้นเรา$a+=58-48จะได้รับ +10 ของเรา

สุดท้าย;$aเพียงแค่ส่งค่าโพสต์สุดท้ายของเราสำหรับแต่ละลูป


คุณสามารถบันทึกได้ไม่กี่ไบต์ลองออนไลน์!
mazzy

อาใช่ฉันมีวงเล็บพิเศษบางส่วนและ=ในนั้นเหลือจากวิธีก่อนหน้าของฉันในการแก้ปัญหานี้ขอบคุณสำหรับการจับ! แม้ว่าฉันไม่เคยเห็นt*yมาก่อนคุณช่วยอธิบายได้ไหมว่าทำไมการทำงานถึงระเบิดสตริงลงในอาร์เรย์อักขระ?
Sinusoid


เพื่อรับ '<100 bytes': ลองออนไลน์! :)
mazzy

ความคิดที่ดีด้วยและ-f [0]
mazzy

2

PowerShell , 95 85 79 ไบต์

แรงบันดาลใจจากคำตอบของ nwellnhof

แรงบันดาลใจจาก[0]จากคำตอบของ sinusoid

$(switch -r($args|% t*y){\d{$_}0{10}[A-Y]{"$(.313*$_-18)"[0]}Z{9}})-join'+'|iex

ลองออนไลน์!

รุ่นที่ไม่ได้ควบคุม:

$(
    switch -r($args|% toCharArray){
        \d    {$_}
        0     {10}
        [A-Y] {"$(.313*$_-18)"[0]}
        Z     {9}
    }
)-join '+'|Invoke-Expression
key .313*$_-18 "$(...)"[0]
--- ---------- -----------
  A      2.345 2
  B      2.658 2
  C      2.971 2
  D      3.284 3
  E      3.597 3
  F      3.910 3
  G      4.223 4
  H      4.536 4
  I      4.849 4
  J      5.162 5
  K      5.475 5
  L      5.788 5
  M      6.101 6
  N      6.414 6
  O      6.727 6
  P      7.040 7
  Q      7.353 7
  R      7.666 7
  S      7.979 7
  T      8.292 8
  U      8.605 8
  V      8.918 8
  W      9.231 9
  X      9.544 9
  Y      9.857 9

1
ความพยายามของทีม! : D
Sinusoid



0

Python 3 , 134 123 ไบต์

f=lambda n:sum(map(int,n.translate(n.maketrans('ADGJMPTWBEHKNQUXCFILORVYSZ','23456789'*3+'79','()+-./ '))))+10*n.count('0')

ลองออนไลน์!

-11 ไบต์ขอบคุณ @ dan04


1
โดยการจัดเรียงตัวอักษรเพื่อคุณสามารถลดสตริงของตัวเลขที่จะ'ADGJMPTWBEHKNQUXCFILNRVYSZ' '23456789'*3+'79'
dan04
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.