Penghitungan Garis Alfanumerik dan Kurva

10

Diberikan string input, tulis program yang menampilkan jumlah total garis dan kurva yang dimilikinya.

Tantangan

  • Ambil input dari STDIN, atau metode input lainnya.
  • Output ke STDOUT, atau metode output lainnya, jumlah total garis dan kurva yang terkandung dalam string, dalam urutan itu , berdasarkan tabel di bawah ini dalam snipet kode.
  • Setiap karakter non-alfanumerik harus diabaikan.
  • Celah standar dilarang.
  • Ini , jadi kode terpendek menang.

Klarifikasi

  • Garis dan kurva ditentukan oleh font yang digunakan pada Stackexchange for code blocks.
  • Lingkaran (seperti O, o, 0) dan titik ( i, j), masing-masing dianggap 1 kurva.
  • Input dapat berupa string, daftar karakter, aliran karakter, bytecodes, dll.
  • Output dapat array bilangan bulat, tupel bilangan bulat, dipisahkan koma string, dll Dua angka harus terpisah, sehingga 104tidak sah, tapi 10,4, 10 4, 10\n4, [10,4], (10, 4), dan sebagainya adalah.
  • Menuju dan membuntuti spasi putih bisa diterima.

Input dan Output Sampel

# Format: str -> line, curve
hi -> 4, 2
HELLO WORLD -> 20, 4
l33+ 5pEak -> 13, 8
+=-_!...?~`g@#$%^ -> 1, 2
9001 -> 5, 3
O o O o O o -> 0, 6

Tabel Karakter

Char | Lines | Curves
0    | 1     | 1
1    | 3     | 0
2    | 1     | 1
3    | 0     | 2
4    | 3     | 0
5    | 2     | 1
6    | 0     | 1
7    | 2     | 0
8    | 0     | 2
9    | 0     | 1
A    | 3     | 0
B    | 1     | 2
C    | 0     | 1
D    | 1     | 1
E    | 4     | 0
F    | 3     | 0
G    | 2     | 1
H    | 3     | 0
I    | 3     | 0
J    | 1     | 1
K    | 3     | 0
L    | 2     | 0
M    | 4     | 0
N    | 3     | 0
O    | 0     | 1
P    | 1     | 1
Q    | 0     | 2
R    | 2     | 1
S    | 0     | 1
T    | 2     | 0
U    | 0     | 1
V    | 2     | 0
W    | 4     | 0
X    | 4     | 0
Y    | 3     | 0
Z    | 3     | 0
a    | 0     | 2
b    | 1     | 1
c    | 0     | 1
d    | 1     | 1
e    | 1     | 1
f    | 1     | 1
g    | 1     | 2
h    | 1     | 1
i    | 3     | 1
j    | 1     | 2
k    | 3     | 0
l    | 3     | 0
m    | 3     | 2
n    | 2     | 1
o    | 0     | 1
p    | 1     | 1
q    | 1     | 1
r    | 1     | 1
s    | 0     | 1
t    | 1     | 1
u    | 1     | 1
v    | 2     | 0
w    | 4     | 0
x    | 4     | 0
y    | 1     | 1
z    | 3     | 0
bigyihsuan
sumber
2
Apa yang dianggap sebagai garis dan kurva? Apakah s2 kurva atau 1? Apakah batang di jgaris dan kurva? Akan lebih baik jika Anda bisa membuat daftar nilai yang diperlukan untuk semua huruf.
Ad Hoc Garf Hunter
4
Saya benar-benar tidak mengerti downvotes yang satu ini. Bagi saya ini adalah tantangan yang ditentukan dengan baik dengan kasus uji yang baik, implementasi referensi dan tabel nilai-nilai apa yang diharapkan (apakah mereka secara teknis benar atau bekerja adalah masalah pendapat pribadi tetapi tidak ada hubungannya dengan tantangan) .. Masukan dan output fleksibel. Jika seseorang dapat menjelaskan apa yang salah dengan ini, saya akan sangat berterima kasih.
ElPedro
3
Bisakah Anda memberikan nilai untuk setiap karakter dalam format yang lebih mudah kita salin; Cuplikan sama sekali tidak perlu.
Shaggy
4
oseharusnya 0 baris, 1 kurva
Giuseppe
2
Lanjutan dari atas ... Downvote tanpa umpan balik memberi OP sedikit peluang untuk meningkatkan tantangan mereka di masa depan.
ElPedro

Jawaban:

8

Haskell, 214 199 188 175 byte

 g 0=[]
 g n=mod n 5:g(div n 5)
 d#s=sum[n|c<-d,(i,n)<-zip['0'..]$g s,c==i]
 f s=(s#0x300BBD37F30B5C234DE4A308D077AC8EF7FB328355A6,s#0x2D5E73A8E3D345386593A829D63104FED5552D080CA)

Cobalah online!

Jumlah garis dan kurva adalah digit nomor basis-5 dan disimpan sebagai nomor basis-16. Fungsi gditerjemahkan kembali ke basis-5.

Edit: -13 bytes berkat @cole.

nimi
sumber
1
169 byte jika Anda dapat mengambil daftar kode. Akan menjelajahi porting ini ke varian string ...
cole
1
175 byte jika Anda harus menggunakan string (menghapus komentar saya sebelumnya karena saya golf off 3 byte sepele).
cole
@cole: terima kasih atas perbaikannya. Pergi dengan daftar bilangan bulat terasa seperti curang, karena tantangan ditandai sebagai "string". Di sisi lain, aturan memungkinkan "bytecodes" sebagai format input yang valid. Namun, banyak jawaban lain juga menggunakan semacam konversi bilangan bulat char ->. Tidak tahu harus berbuat apa.
nimi
6

05AB1E , 78 69 65 byte

-4 byte terima kasih kepada Kevin Cruijssen, Pergi dan periksa jawaban 05AB1E yang lebih baik

žKÃÇ48-©•7ć_qýÊΣŸßαŽ_ì¡vFÛ–ÄÔ™”súyån!₁ζB?òrβÂ@µk₆¼×¬°•5в2ä`®èrè‚O

Cobalah online!

Output sebagai [Kurva, Garis]

Saya benar-benar buruk di 05AB1E yang baru saya ketahui. Pasti bisa menghemat lebih banyak byte jika saya bisa mendapatkan 05AB1E untuk dilakukan èdi daftar daftar saya


Penjelasan

žKÃ                                    #Filter out non alpha-nums
    Ç48-                               #Convert to ascii and subtract 48 so "0" is 0 etc.
        ©                              #Store that for later
          •...•5в                      #De-compress compressed list 
                 2ä                    #Split into 2 chunks (lines + curves)
                   `                   #Separate them onto the stack 
                    ®                  #Get the value that we stored 
                     èrè               #Apply indexing to both lists
                        ‚              #Put our indexed values back into a list
                         O             #Sum our lists
Data Kedaluwarsa
sumber
1
Output Anda terbalik. Seharusnya line curvetidak curve line.
bigyihsuan
1
Output dapat berupa array bilangan bulat, tupel bilangan bulat, string yang dipisahkan koma, dll. Kedua angka harus terpisah @bigyihsuan mereka terpisah, saya tidak melihat apa masalahnya
Data
1
Aturan katakan Output to STDOUT, or any other output method, the total number of lines and curves contained in the string, in that order. Perhatikan in that order, jadi line curve.
bigyihsuan
2
Saya setuju dengan @ExpiredData untuk yang ini. Mungkin tentukan dalam tantangan bahwa urutan harus dinyatakan dalam jawaban. Itu sudah cukup untuk bertahan.
ElPedro
1
53 byte (dan dengan [Line, Curve]sebagai output-order, meskipun itu kebetulan dan tidak disengaja).
Kevin Cruijssen
5

Jelly , 45 byte

ØBċþSḋ“yƘ.ṪñF[)µṡṭɗḌyė$Ṫk“¢⁶KɱzV$QḂḥỵṙu’b5,3¤

Tautan monadik yang menerima daftar karakter yang menghasilkan daftar (dua) bilangan bulat.

Cobalah online! Atau lihat test-suite .

Bagaimana?

ØBċþSḋ“...“...’b5,3¤ - Link: list of characters, T
ØB                   - base-chars = "01...9A...Za...z'
   þ                 - outer product with T using:
  ċ                  -   count occurrences
    S                - sum -> [n(0), n(1), ..., n(9), n(A), ..., n(Z), n(a), ..., n(z)]'
                   ¤ - nilad followed by link(s) as a nilad:
      “...“...’      -   list of two large integers (encoded in base 250)
                5,3  -   five paired with three = [5,3]
               b     -   to base  -> [[Lines(0), Lines(1), ...], Curves(0), Curves(1), ...]
     ḋ               - dot-product
Jonathan Allan
sumber
5

Scala , 235 byte

val a=('0'to'9')++('A'to'Z')++('a'to'z')
def f(s:String)=s.filter(a.contains(_)).map(c=>"gdgkdhfckfdlfgedhddgdcedfgkhfcfceeddkgfggglgilddnhfgggfggceegd"(a.indexOf(c))-'a').map(x=>(x%5,x/5)).foldLeft((0,0))((x,y)=>(x._1+y._1,x._2+y._2))

Cobalah online!

Tidak terlalu kecil, mungkin bisa bermain golf lebih lanjut.
Catatan: 52-string string literal seperti kamus yang memetakan karakter ke karakter lain yang menunjukkan jumlah garis dan kurva sesuai dengan tabel berikut:

Curves|Lines
      |0 1 2 3 4
----------------
     0|a b c d e
     1|f g h i j
     2|k l m n o
troli813
sumber
5

Python 2 , 159 154 byte

Untuk setiap karakter lines*4 + curvesmemberikan nilai dari 0 hingga 16. Base-36 digunakan untuk mengkodekan nilai-nilai ini (1 karakter = 1 nilai).

-5 byte terima kasih kepada @Chas Brown

lambda s:map(sum,zip(*(divmod(int("5c52c918210000000c615gc9cc5c8gc15291818ggcc00000025155565d6cce915551558gg5c"[ord(x)-48],36),4)for x in s if'/'<x<'{')))

Cobalah online!

Python 2 , 141 byte

Ini adalah port dari solusi Python3 saya. Versi ini menampilkan daftar int panjang, jadi sepertinya [4L, 2L]bukan [4, 2].

lambda s:map(sum,zip(*(divmod(int("8BK5NLC8RS10XWUX12BG408C2UELUAFEOVARZKCHEEDDMXG09L48ZG",36)/13**(ord(x)-48)%13,3)for x in s if'/'<x<'{')))

Cobalah online!

Daniil Tutubalin
sumber
2
154 byte menggunakan base36 dan '/'<x<'{'bukannya x.isalnum().
Chas Brown
1
@Chas Brown terima kasih! Saya juga memikirkan '/'<x<'{', tetapi saya mencoba untuk mengungkapkannya untuk menyingkirkan ifjuga.
Daniil Tutubalin
4

Jelly , 51 byte

ØBiⱮị“Æƭ&¶*ṪḳAøƬsøD<~²ṂvṠỤṣT3rdʠ¬⁻ÇṆṇ.ÑƑaȮż’b5¤s2¤S

Cobalah online!

Tautan monadik yang menggunakan string sebagai input dan mengembalikan daftar bilangan bulat sebagai [lines, curves]

Nick Kennedy
sumber
4

JavaScript (Node.js) , 251 219 217 byte

-34 byte dari @Expired Data : o

_=>_.map(a=>(p+=~~"13103202003101432331324301020202443301011111313332011101124413"[(x=a.charCodeAt()-48)>16?(x-=7)>41?x-=6:x:x])&(o+=~~"10120110210211001001000011211010000021111121120021111111100010"[x]),p=o=0)&&[p,o]

Cobalah online!

Luis felipe De jesus Munoz
sumber
2
217 byte sebenarnya
Expired Data
4

Retina 0.8.2 , 160 byte

$
¶$`
T`dLl`13103202003101432331324301020202443301011111313332011101124413`^.*
T`dLl`10120110210211001001000011211010000021111121120021111111100010`.*$
.
$*
%`1

Cobalah online! Tautan termasuk kasus uji. Penjelasan:

$
¶$`

Gandakan string input.

T`dLl`13103202003101432331324301020202443301011111313332011101124413`^.*

Hitung garis setiap karakter pada baris pertama.

T`dLl`10120110210211001001000011211010000021111121120021111111100010`.*$

Hitung kurva masing-masing karakter di baris kedua.

.
$*
%`1

Jumlahkan angka secara terpisah pada setiap baris.

Neil
sumber
4

R , 164 153 byte

function(s,`!`=utf8ToInt,x=(!"




")[match(!s,c(48:57,65:90,97:122),0)])c(sum(x%%5),sum(x%/%5))

Cobalah online!

Aku punya ide yang sama seperti jawaban Nimi ini menggunakan basis 5 encoding tapi mengkodekan sebagai karakter ASCII bukan basis 16. Penggunaan nomatch = 0dimatch untuk menghilangkan karakter non-alfanumerik.

Pengembalian curves lines.

Giuseppe
sumber
4

Arang , 60 byte

IE⟦”)⊞∧cⅉ→ÞYγμ◧⊞¶u№¶⊘¶∕«⁸””)∨⧴|υ;↷dLτIüO¦:”⟧Σ⭆Φθ№⭆ι⍘ξφλ§ι⍘λφ

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

E⟦”)⊞∧cⅉ→ÞYγμ◧⊞¶u№¶⊘¶∕«⁸””)∨⧴|υ;↷dLτIüO¦:”⟧

Ini adalah array dari dua string 13103202000101111131333201110112441331014323313243010202024433dan 10120110212111112112002111111110001002110010010000112110100000. Senar kemudian dipetakan.

Φθ№⭆ι⍘ξφλ

Elemen-elemen input difilter apakah elemen-elemen tersebut terdapat dalam (62) karakter alfabet konversi basis default.

⭆...§ι⍘λφ

Elemen yang tersisa kemudian dikonversi dari basis (62) dan ini kemudian diindeks ke string yang dipetakan.

I...Σ...

Angka-angka dijumlahkan dan dilemparkan kembali ke string untuk cetakan implisit.

Neil
sumber
4

Python 3 , 165 159 148 146 byte

Untuk setiap karakter (termasuk non-alfanumerik) lines*3 + curves memberikan nilai dari 0 hingga 12, sehingga kita dapat menggunakan nomor base-13 panjang untuk menyandikan data. Untuk membuatnya lebih pendek itu dikonversi ke basis-36.

Terima kasih kepada @Chas Brown atas sarannya yang luar biasa.

-2 byte dengan mengonversi lambda ke program.

print(*map(sum,zip(*(divmod(int("8BK5NLC8RS10XWUX12BG408C2UELUAFEOVARZKCHEEDDMXG09L48ZG",36)//13**(ord(x)-48)%13,3)for x in input()if'/'<x<'{'))))

Cobalah online!

Daniil Tutubalin
sumber
4

Python 2 , 179 166 165 163 byte

lambda s:[sum(p[:max(0,p.find(c))].count(',')for c in s)for p in',02BDJPbdefghjpqrtuy,57GLRTVnv,14AFHIKNYZiklmz,EMWXwx',',02569CDGJOPRSUbcdefhinopqrstuy,38BQagjm']

Cobalah online!

Mengembalikan daftar [curves, lines].

Chas Brown
sumber
3

Python 2 , 525 byte

l=c=0;e=[(1,1),(3,0),(1,2),(0,2),(3,0),(2,1),(0,1),(2,0),(0,2),(0,1),(3,0),(1,2),(0,1),(1,1),(4,0),(3,0),(2,1),(3,0),(3,0),(1,1),(3,0),(2,0),(4,0),(3,0),(0,1),(1,1),(0,2),(2,1),(0,1),(2,0),(0,1),(2,0),(4,0),(4,0),(3,0),(3,0),(0,2),(1,1),(0,1),(1,1),(1,1),(1,1),(1,2),(1,1),(3,1),(1,2),(3,0),(3,0),(3,2),(2,1),(0,1),(1,1),(1,1),(1,1),(0,1),(1,1),(1,1),(2,0),(4,0),(4,0),(1,1),(3,0)]
d='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
for i in input():
 if i in d:
  p=d.find(i);l+=e[p][0];c+=e[p][1];
print l,c

Cobalah online!

Pendekatan yang mirip dengan implementasi referensi tetapi agak lebih pendek.

ElPedro
sumber
3
283 byte
Herman L
2
Pikirkan tentang itu ketika saya sedang minum bir yang sangat dibutuhkan di Biergarten setelah bekerja tetapi itu terlalu banyak pekerjaan untuk memformat ulang pada berguna saya :)
ElPedro
1
@HermanL Merasa bebas untuk mengirim sebagai jawaban Anda sendiri. Saya tidak punya waktu untuk memperbarui malam ini.
ElPedro
2
265 byte dengan golf yang sedikit lebih ...
Chas Brown
2
231 byte
wilkben
2

Perl 5 -MList::Util=sum -p , 180 byte

say sum y/0-9A-Za-z/13103202003101432331324301020202443301011111313332011101124413/r=~/./g;$_=sum y/0-9A-Za-z/10120110210211001001000011211010000021111121120021111111100010/r=~/./g

Cobalah online!

Xcali
sumber
2

05AB1E , 53 byte

•xþ¢*>ÌŸÑå#÷AUI'@æýXÁи<¥èå–ΘηžÎà₅åǚĕ5вR2ôžKISk®KèøO

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

xþ¢*>ÌŸÑå#÷AUI'@æýXÁи<¥èå–ΘηžÎà₅åǚĕ
                 '# Compressed integer 101629259357674935528492544214548347273909568347978482331029666966024823518105773925160
 5в               # Converted to base-5 as list: [1,0,2,0,0,2,1,0,1,2,0,3,2,0,1,1,0,3,1,1,0,3,0,3,0,4,0,4,0,2,1,0,0,2,1,0,1,2,2,0,1,1,1,0,0,3,0,4,0,2,0,3,1,1,0,3,0,3,1,2,0,3,0,4,1,1,1,0,2,1,0,3,0,3,1,1,0,4,0,4,0,2,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,2,2,3,0,3,0,3,2,1,1,3,1,1,2,1,1,1,1,1,1,1,1,0,1,1,2,0]
   R              # Reverse this list (due to the leading 0)
    2ô            # Split it into pairs: [[0,2],[1,1],[0,1],[1,1],[1,1],[1,1],[1,2],[1,1],[3,1],[1,2],[3,0],[3,0],[3,2],[2,1],[0,1],[1,1],[1,1],[1,1],[0,1],[1,1],[1,1],[2,0],[4,0],[4,0],[1,1],[3,0],[3,0],[1,2],[0,1],[1,1],[4,0],[3,0],[2,1],[3,0],[3,0],[1,1],[3,0],[2,0],[4,0],[3,0],[0,1],[1,1],[0,2],[2,1],[0,1],[2,0],[0,1],[2,0],[4,0],[4,0],[3,0],[3,0],[1,1],[3,0],[1,1],[0,2],[3,0],[2,1],[0,1],[2,0],[0,2],[0,1]]
      žK          # Push builtin string "abc...xyzABC...XYZ012...789"
        IS        # Push the input, split into characters
          k       # Get the index of each of these characters in the builtin-string
           ®K     # Remove all -1 for non-alphanumeric characters that were present
             è    # Use these indices to index into the earlier created pair-list
              ø   # Zip/transpose; swapping rows/columns
               O  # Sum both inner lists
                  # (after which the result is output implicitly)

Lihat tip tambang 05AB1E ini (bagian Bagaimana cara mengompresi bilangan bulat besar? Dan Cara mengompresi daftar bilangan bulat? ) Untuk memahami mengapa •xþ¢*>ÌŸÑå#÷AUI'@æýXÁи<¥èå–ΘηžÎà₅åǚĕini 101629259357674935528492544214548347273909568347978482331029666966024823518105773925160dan •xþ¢*>ÌŸÑå#÷AUI'@æýXÁи<¥èå–ΘηžÎà₅åǚĕ5вsekarang [1,0,2,0,0,2,1,0,1,2,0,3,2,0,1,1,0,3,1,1,0,3,0,3,0,4,0,4,0,2,1,0,0,2,1,0,1,2,2,0,1,1,1,0,0,3,0,4,0,2,0,3,1,1,0,3,0,3,1,2,0,3,0,4,1,1,1,0,2,1,0,3,0,3,1,1,0,4,0,4,0,2,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,2,2,3,0,3,0,3,2,1,1,3,1,1,2,1,1,1,1,1,1,1,1,0,1,1,2,0].

Kevin Cruijssen
sumber
1

Python 3 , 697 byte

def f(s):
    l=0;c=0;d={'0':(1,1),'1':(3,0),'2':(1,2),'3':(0,2),'4':(3,0),'5':(2,1),'6':(0,1),'7':(2,0),'8':(0,2),'9':(0,1),'A':(3,0),'B':(1,2),'C':(0,1),'D':(1,1),'E':(4,0),'F':(3,0),'G':(2,1),'H':(3,0),'J':(1,1),'K':(3,0),'L':(2,0),'M':(4,0),'N':(3,0),'O':(0,1),'P':(1,1),'Q':(0,2),'R':(2,1),'S':(0,1),'T':(2,0),'U':(0,1),'V':(2,0),'W':(4,0),'X':(4,0),'Y':(3,0),'Z':(3,0),'a':(0,2),'b':(1,1),'c':(0,1),'d':(1,1),'e':(1,1),'f':(1,1),'g':(1,2),'h':(1,1),'i':(3,1),'j':(1,2),'k':(3,0),'l':(3,0),'m':(3,2),'n':(2,1),'o':(0,1),'p':(1,1),'q':(1,1),'r':(1,1),'s':(0,1),'t':(1,1),'u':(1,1),'v':(2,0),'w':(4,0),'x':(4,0),'y':(1,1),'z':(3,0)};
    for i in s:
        if i in d:
            l+=d[i][0];c+=d[i][1];
    return l,c

Upaya pertama yang sederhana. Saya memasukkan tabel ke dalam kamus, memutar-mutar string, menambah beberapa counter, dan mengembalikan tuple. Input adalah sebuah string.

Cobalah online!

bigyihsuan
sumber
1
Kenapa tidak bersaing? Terlihat baik untuk saya.
ElPedro
1
Mengapa downvote tanpa komentar?
ElPedro