Hitung pulsa putaran dial di nomor telepon (termasuk huruf)

34

Di masa kakek nenek Anda, menekan nomor telepon dilakukan dengan tombol putar seperti ini:

Untuk memutar setiap digit, letakkan jari Anda di lubang yang sesuai, tarik ke berhenti jari, dan lepaskan. Suatu mekanisme akan menyebabkan putaran memutar kembali ke posisi istirahatnya, dan telepon akan memutus dan menyambungkan kembali sirkuit beberapa kali, membuat klik terdengar.

Memanggil angka N membutuhkan N "pulsa" seperti itu, kecuali untuk N = 0 yang sepuluh pulsa.

Ponsel rotary memiliki properti yang membutuhkan digit besar (8, 9, 0) lebih lama untuk dial daripada digit kecil (1, 2, 3). Ini adalah pertimbangan penting dalam menyusun peta kode area awal, dan mengapa Kota New York dengan kepadatan populasi (dan saluran telepon) yang padat mendapat 212 (hanya 5 pulsa), sementara 907 (26 pulsa) pergi ke Alaska yang jarang dihuni. Tentu saja, semua ini menjadi tidak relevan ketika panggilan nada sentuh menjadi populer.

Tantangan

Tulis, sesedikit mungkin byte, suatu program atau fungsi yang mengambil input string (atau urutan karakter) yang berisi nomor telepon, dan mengeluarkan jumlah pulsa putaran dial. Ini harus dihitung sebagai berikut:

Digit

  • Digit 1-9 dihitung sebagai jumlah pulsa.
  • Digit 0 dihitung sebagai 10 pulsa.

Surat

Perhatikan bahwa angka 2-9 pada dial memiliki huruf-huruf alfabet Latin yang terkait dengannya. Ini awalnya dimaksudkan untuk pertukaran bernama , tetapi yang terakhir disesuaikan untuk kata sandi , dan untuk sistem input pesan teks.

Anda harus mendukung memiliki surat di nomor telepon Anda, menggunakan penugasan huruf E.161 untuk digit:

  • 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

Anda dapat berasumsi bahwa input telah dilipat dengan huruf besar-kecil, menjadi huruf besar atau kecil.

Karakter lainnya

Anda harus mengizinkan penggunaan karakter ()+-./dan spasi secara sewenang-wenang sebagai pemformat pemisah. Anda dapat memilih untuk mengizinkan karakter non-alfanumerik apa pun untuk tujuan ini, jika lebih mudah diterapkan.

Karakter-karakter ini tidak berkontribusi pada jumlah pulsa.

Kode contoh

Tabel pencarian dan fungsi non-golf dengan 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)

Contoh input dan output

  • 911 → 11
  • 867-5309 → 48
  • 713 555 0123 → 42
  • +1 (212) PE6-5000 → 57
  • 1-800-FLOWERS → 69
  • PUZZLES → 48
dan04
sumber
Saya berasumsi bahwa tanda baca dan spasi ASCII Sewenang - wenang terbatas pada yang biasanya digunakan untuk nomor telepon ( +- ()*#.) seperti halnya huruf dibatasi untuk huruf besar. Koreksi saya jika saya salah.
Adám
1
@ Adám: Saya telah membatasi tanda baca yang diperlukan hanya untuk beberapa pemisah umum. Ini dengan sengaja tidak termasuk *dan #, yang memiliki arti khusus pada telepon nada-sentuh dan tidak dapat diputar pada rotari.
dan04
1
Bisakah kita menggunakan semua-huruf kecil bukan semua-huruf besar? Bisakah kita mengambil array karakter bukan string?
Grimmy
1
Saya seorang penjelajah waktu! Saya seorang penjelajah waktu! Saya seorang penjelajah waktu! Karena saya pasti menggunakan ponsel seperti ini ketika saya masih kecil, jelas saya SAYA BEGITU SENDIRI !!!!!!! Yang sebenarnya cukup menjijikkan ketika saya memikirkannya. Bleah !!!
Bob Jarvis - Pasang kembali Monica
3
Saya kakek. Saya menggunakan ponsel seperti ini di tahun 1950-an. Dan ketika saya pindah ke kota di lokasi pedesaan, saya menemukan bahwa perusahaan telepon tidak menawarkan layanan nada sentuh. Ini terjadi pada tahun 1985! Tidak bercanda! Nenek saya memiliki telepon di ruang tamu yang memiliki kait dan engkol. Anda mengambil lubang suara dari pengait, dan memutar engkol untuk mendapatkan operator papan switch. Dia harus menggantinya ketika panggilan jarak jauh diatur.
Walter Mitty

Jawaban:

25

05AB1E , 19 18 17 15 byte

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

Cobalah online!

Ini adalah jawaban pertama untuk menggunakan π. Mengapa menggunakan π, Anda mungkin bertanya? Nah, surat-surat tersebut dikaitkan dengan 22233344455566677778889999, secara berurutan. Perhatikan bagaimana sebagian besar digit berulang 3 kali, tetapi 7 berulang 4 kali. Anda bisa mengatakan bahwa setiap digit berulang (3 + 1/7) kali, rata-rata. Saya ingin tahu apakah ada angka yang kira-kira 3 + 1/7 dan membutuhkan lebih sedikit byte dari 22/7 ...

Ini hanya memberikan 4 7s, bukan 49s, jadi kita masih perlu menangani Z sebagai kasus khusus.

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
Grimmy
sumber
Mengapa menggunakan huruf kecil dan bukan huruf besar?
dan04
1
@ dan04 karena 05AB1E memiliki built-in untuk mendorong "abcdefghijklmnopqrstuvwxyz", tetapi tidak untuk"ABCDEFGHIJKLMNOPQRSTUVWXYZ" . Saya bisa mengubah alfabet menjadi huruf besar daripada mengubah input menjadi huruf kecil, tapi itu bytecount yang sama.
Grimmy
1
Saya telah mengedit pertanyaan untuk membuat dua perintah pertama Anda tidak perlu.
dan04
3
@Jonah Saya mulai dengan ide membagi rentang dengan konstanta untuk mendapatkan urutan yang diinginkan, kemudian sambil mencari cara terbaik untuk mengekspresikan "sedikit lebih dari 3" di 05AB1E Saya ingat pi adalah built-in.
Grimmy
2
+1 untuk penggunaan pi
Draconis
9

C # (Visual C # Interactive Compiler) , 51 byte

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

Disimpan 1 byte berkat @recursive

Disimpan 10 byte berkat pengamatan @ ExpiredData yang hanya () +-/.akan di input

Cobalah online!

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
Perwujudan Ketidaktahuan
sumber
4
-10adalah ~9, yang harus bekerja dalam konteks.
Rekursif
@recursive Itu cerdas, terima kasih
Perwujudan Ketidaktahuan
1
x <91 cek berlebihan karena input hanya akan terdiri dari () + -. / kunci spasi dan angka yang semuanya <64 maka kita dapat menentukan apakah karakter huruf besar hanya dengan memeriksa x> 64 (jadi -5 byte)
Data Kedaluwarsa
Hal yang sama berlaku untuk pemeriksaan x <58, karena tidak ada dalam kisaran 58-64 yang akan dimasukkan dalam input
Data Kedaluwarsa
51 bytes
Expired Data
5

APL (Dyalog Unicode) , 27 byte SBCS

Fungsi awalan diam-diam anonim.

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

Cobalah online!

(...)∘⍳  Temukan ɩ ndex * dari setiap karakter dalam string berikut:
  * elemen yang tidak ditemukan, dapatkan indeks 1 + indeks maksimum, yaitu 11
⎕D  digit:"0123456789"

1⌽ putar secara siklis satu langkah ke kiri; "1234567890"

11| sisa pembagian ketika dibagi 11 *
  * ini memberikan 0 untuk semua non-digit
...+  tambahkan itu sebagai berikut:

'@ADGJMPTW'∘⍸ yang ɩ nterval ɩ ndex * untuk setiap karakter
  * Jadi [-∞, "@") memberikan 0, [ "@", "A") memberikan 1, [ "A", "D") memberikan 2, dll
+/  jumlah yang

Adm
sumber
5

Python 2 , 74 byte

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

Cobalah online!

Apakah beberapa aritmatika pada nilai ASCII untuk setiap karakter. Opsi pertama memeriksa huruf dan opsi kedua memeriksa angka. Klarifikasi bahwa semua karakter tanda baca yang diizinkan dalam input adalah yang dengan nilai ASCII kurang dari 48 izinkan saya menyederhanakan logika, tetapi metode baru sama sekali sekarang mungkin lebih baik.

Python 2 , 84 byte

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

Cobalah online!

Menggunakan string pencarian hardcoded, dengan masing-masing blok 5 karakter sesuai dengan karakter yang memberikan nilai masing-masing dimulai dengan 1. Ruang kosong diisi dengan x, yang tidak bisa di input yang dikapitalisasi. Kebetulan, karakter yang tidak muncul dalam string menghasilkan -1untuk .findyang memberikan puncak nol.

Tidak
sumber
5

JavaScript (Node.js) , ... 76 69 byte

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

Cobalah online!

-7 terima kasih @Arnauld!

Penjelasan

 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

Semua [space]().+-/tidak ditangkap oleh /\w/g, sehingga tidak akan memengaruhi total.

Shieru Asakoto
sumber
5

Perl 5 -p , 52 51 byte

@ Grimy mendapat kredit sebesar -1

y/A-Z/22233344455566677778889/;map$\+=$_||10,/./g}{

Cobalah online!

Xcali
sumber
/\d/gseharusnya /./guntuk -1 (ya itu masih menangani tanda baca dengan benar).
Grimmy
4

J , 39 byte

1#.'?@CFILOSVZ'&I.+11|1+'1234567890'i.]

Cobalah online!

Sebuah port dari solusi APL Adám

Galen Ivanov
sumber
Penggunaan indeks interval yang bagus
Jonah
@Jonah Terima kasih kepada Adam :)
Galen Ivanov
4

Retina 0.8.2 , 34 byte

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

Cobalah online! Tautan termasuk kasus uji. Penjelasan:

T`WTPMJGDA`Rd

Ubah huruf WTPMJGDAmenjadi digit 9..0.

}T`L`2L

Kocok semua huruf yang tersisa sebanyak 1 dan ulangi sampai semua huruf dikonversi menjadi angka.

0
55

Ganti 0dengan 55karena mereka mengambil jumlah pulsa yang sama untuk melakukan panggilan.

\d
$*
1

Ambil jumlah digital.

Neil
sumber
3

K4 , 44 byte

Larutan:

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

Contoh:

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

Penjelasan:

Pendekatan naif, kemungkinan cukup golf. Indeks pencarian karakter, skor pencarian, jumlah.

+/(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
streetster
sumber
3

Perl 6 , 53 byte

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

Cobalah online!

Mengalikan kode ASCII dengan 0,313 bukannya 1/3 dan menggunakan bitwise OR yang membulatkan ke nol untuk mendapatkan bias yang benar .

nwellnhof
sumber
3

C (gcc) , 94 89 86 80 byte

Terima kasih kepada ceilingcat, nwellnhof dan Rogem untuk sarannya.

c;f(char*s){c=*s-48;s=*s?(c<10U?c?c:10:c-17<26U?(c-11-c/35-c/42)/3:0)+f(s+1):0;}

Cobalah online!

ErikF
sumber
80 byte dengan menggunakan rekursi, bukan loop.
Sarankan c<43Ualih-alihc-17<26U
ceilingcat
2

Pesta , 256 byte

Anda dapat mengganti (( … )) konstruksi dengan letuntuk jumlah byte yang identik. Mungkin ada algoritma yang bagus untuk mengurangi pernyataan kasus tetapi tidak menemukannya sejauh ini. Dengan sedikit pengerjaan ulang Anda bisa membuatnya berfungsi juga (tetapi tidak dalam byte yang sama atau kurang kecuali Anda dapat diskon bagian function fname { … }atas dan ekor).

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

Cobalah online!

Solusi yang lebih baik menggunakan teknik karakter peta menggunakan tralat:

[Bash with tr], 173 byte

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

Cobalah online!

PJF
sumber
Salah satu algoritma yang saya lewatkan tentu saja adalah melakukan penggantian string / terjemahan pada AZ. Ini bagus. Saya akan mengubah sesuai di atas.
PJF
while((${#p}))berfungsi, menghemat tiga byte. c=${p:0:1};case c in ([0-9]) ((d+=c?c:10));;menyimpan 16. lainnya. Dengan tr -dc 0-9ditambahkan ke tr pipa Anda tidak perlu pernyataan kasus sama sekali dan penambahan dapat dilipat ke dalam whilekondisi dengan &&.
Ya ampun
Terima kasih OMG. Saya tidak sering menggunakan tugas ternary, jadi saya melewatkannya. Penggunaan pelengkap penghapusan yang menarik juga (tapi itu mengasumsikan seperti solusi saya mengabaikan karakter lain). Saya telah berhasil menurunkannya menjadi 133 byte seperti pada: 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.. tiga 9 terakhir tidak diperlukan karena tr akan menggunakan kembali karakter pengganti terakhir jika argumen kedua terlalu pendek.
Ya ampun
1
Contoh pertama dapat dilucuti dari 256 ke 236 dengan menghapus beberapa ruang yang tidak perlu. 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
steve
2

Jelly , 33 24 byte

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

Cobalah online!

Tautan monadik yang menggunakan string sebagai argumennya dan mengembalikan jumlah pulsa. Ditulis ulang terinspirasi oleh jawaban 05AB1E @ Grimy jadi pastikan untuk mengungguli mereka!

Nick Kennedy
sumber
2

PowerShell , 109 102 87 byte

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

Cobalah online!

EDIT: Digunakan ide @ mazzy untuk switch regex dengan beberapa pemformatan string untuk melemparkan char -> int -> string dan hanya ambil 'digit' pertama

Asli:

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

Saya berharap mendapatkan <100 byte, jadi saya akan terus melihatnya untuk melihat apakah ada hal lain yang bisa saya lakukan. Mungkin ada cara untuk menghapus string angka

Maaf jika ini membingungkan karena saya membuat array dengan pernyataan pengindeksan boolean tetapi -

Penjelasan:

[char[]]"$args"|%{membaca input yang dilemparkan sebagai string dan kemudian meledak ke array char dan memulai untuk-setiap loop dengan memeriksa ()[$_-gt47]untuk melihat apakah ada ()+-./yang dimasukkan (semua memiliki nilai karakter ascii <48)
Catatan: Powershell menerima $truedan $falsesebagai1 dan0 masing-masing untuk indeks array

Kemudian kita dapatkan 48simbolnya, atau:
('22233344455566677778889999'[$_-65],(58,$_)[$_-ne48])[$_-lt64]

The [$_-lt64]memeriksa nomor atau huruf (seluruh modal diasumsikan di sini). Jika sebuah huruf, '22233344455566677778889999'[$_-65]ubahlah menjadi 0-25 untuk mengindeks ke dalam array dan output nilai pulsa (sebagai char) Jika karakternya angka, kita melihat: (58,$_)[$_-ne48]memeriksa 0dan mengeluarkan58 atau hanya karakter numerik itu sendiri.

Sekitar semuanya $a+= ... -=48menginisialisasi variabel numerik $ a at 0dan kemudian menambahkan output. Outputnya adalah nilai karakter ascii dari suatu angka, jadi kurangi48 .

Catatan: jika input adalah simbol, kita dapat $a+=48-48, secara efektif mengabaikannya. Jika ya 0, kita dapatkan$a+=58-48 mendapatkan +10 kita

Terakhir, ;$acukup tampilkan nilai akhir kami untuk setiap loop

Sinusoid
sumber
Anda dapat menyimpan beberapa byte Cobalah secara online!
mazzy
Ah, ya saya punya beberapa tanda kurung tambahan dan =di sana, tersisa dari metode saya sebelumnya untuk menyelesaikan ini, terima kasih atas tangkapannya! Padahal, saya belum pernah melihat t*ysebelumnya, dapatkah Anda menjelaskan mengapa itu berhasil meledakkan string menjadi array karakter?
Sinusoid
untuk mendapatkan '<100 byte': Coba online! :)
mazzy
ide bagus dengan -fdan [0].
mazzy
2

PowerShell , 95 85 79 byte

terinspirasi oleh jawaban nwellnhof .

terinspirasi [0]dari jawaban Sinusoid .

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

Cobalah online!

Versi belum dibuka:

$(
    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
mazzy
sumber
1
Upaya tim! : D
Sinusoid
1

Kotlin , 113 byte

{s:String->var t=0
for(c in s){val v=c-'0'
t+=when(v){0->10
in 1..9->v
in 17..42->(v-11-v/35-v/42)/3
else->0}}
t}

Cobalah online!

JohnWells
sumber
0

Python 3 , 134 123 byte

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

Cobalah online!

-11 byte terima kasih kepada @ dan04

Artemis mendukung Monica
sumber
1
Dengan mengatur ulang huruf ke 'ADGJMPTWBEHKNQUXCFILNRVYSZ', Anda dapat mengurangi string angka menjadi '23456789'*3+'79'.
dan04