字母数字线和曲线计数


10

给定输入字符串,编写一个程序,输出该程序具有的线和曲线的总数。

挑战

  • STDIN或任何其他输入法获取输入。
  • 根据代码段中的下表,按此顺序STDOUT将包含在字符串中的直线和曲线的总数输出到或任何其他输出方法。
  • 任何非字母数字字符都应忽略。
  • 禁止出现标准漏洞
  • 这是 ,因此最短的代码获胜。

澄清说明

  • 线条和曲线由Stackexchange上使用的字体确定code blocks
  • 圆(如O, o, 0)和点(i, j)分别被视为1条曲线。
  • 输入可以是字符串,字符列表,字符流,字节码等。
  • 输出可以是一个整数数组,整数,逗号分隔的字符串等的元组的两个数字必须是分开的,所以104是无效的,但是10,410 410\n4[10,4](10, 4),等等是。
  • 标题和尾随空白完全可以接受。

样本输入和输出

# 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

字符表

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

2
什么算作直线和曲线?是s2条曲线还是1条曲线?茎j既在直线上又在曲线上吗?最好只列出所有字母的必需值。
Ad Hoc Garf Hunter

4
我真的不明白这一点的不足。对我来说,这是一个明确规定的挑战,其中包含良好的测试用例,参考实现和期望值的表格(无论是技术上的正确还是陈旧都是个人观点,但与挑战无关)。输出是灵活的。如果有人可以解释这是什么问题,我将不胜感激。
ElPedro

3
您能否以我们可以轻松复制的格式提供每个字符的值?该代码段完全没有必要。
毛茸茸的

4
o应该是0条线,1条曲线
朱塞佩

2
从上接下...没有投票的反对票给OP未来改善挑战的机会很小。
ElPedro

Answers:


8

Haskell中,214个 199 188 175字节

 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)

在线尝试!

线和曲线的数字是以5为底的数字,并存储为以16为底的数字。函数g转换回以5为基数。

编辑:-13字节感谢@cole。


1
169个字节(如果可以列出字符代码)。打算探索将其移植到字符串变体中的方式
科尔

1
如果您必须使用字符串,则为175个字节(自从我打了3个小字以来,就删除了我以前的评论)。
科尔

@cole:感谢您的改进。与整数列表一起使用感觉就像作弊一样,因为挑战被标记为“字符串”。另一方面,规则允许“字节码”作为有效的输入格式。但是,许多其他答案也使用某种char->整数转换。不知道该怎么办。
nimi

6

05AB1E78 69 65字节

-4字节感谢Kevin Cruijssen,快去看看他更好的05AB1E答案

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

在线尝试!

输出为[曲线,行]

我刚刚发现的05AB1E真的很糟糕。如果我可以è在列表列表中执行05AB1E,肯定可以节省更多字节


说明

ž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

1
您的输出相反。应该是line curve,不是curve line
bigyihsuan

1
输出可以是整数数组,整数元组,逗号分隔的字符串等。这两个数字必须是分开的 @bigyihsuan,它们是分开的,我看不出问题是什么
过期数据

1
规则确实说Output to STDOUT, or any other output method, the total number of lines and curves contained in the string, in that order。请注意in that order,这样line curve
bigyihsuan

2
我会同意@ExpiredData在这一点上。可能在挑战中指定应在答案中说明顺序。这样就足够了。
ElPedro

1
53个字节(并以[Line, Curve]输出顺序显示,尽管这是巧合,而不是有意的)。
凯文·克鲁伊森

5

果冻,45 字节

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

单子链接接受一个字符列表,该列表产生一个(两个)整数列表。

在线尝试!或查看测试套件

怎么样?

Ø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

5

Scala,235字节

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

在线尝试!

不算小,可能可以打更多的高尔夫球。
注意:52个字符的字符串文字像字典一样,根据下表将一个字符映射到另一个表示直线和曲线数的字符:

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

5

Python 2中159个 154字节

对于任何字符,lines*4 + curves给出的值从0到16。Base-36用于编码这些值(1个字符= 1个值)。

-5字节感谢@Chas Brown

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

在线尝试!

Python 2 141字节

这是我的Python3解决方案的端口。此版本输出长整数列表,因此看起来像[4L, 2L]而不是[4, 2]

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

在线尝试!


2
使用base36和'/'<x<'{'代替154个字节x.isalnum()
Chas Brown

1
@Chas Brown谢谢!我也在考虑'/'<x<'{',但我也试图将其表达出来以摆脱它if
Daniil Tutubalin

4

果冻,51字节

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

在线尝试!

以字符串为输入并以整数形式返回整数列表的单子链接 [lines, curves]



4

视网膜0.8.2,160字节

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

在线尝试!链接包括测试用例。说明:

$
¶$`

复制输入字符串。

T`dLl`13103202003101432331324301020202443301011111313332011101124413`^.*

计算第一行中每个字符的行数。

T`dLl`10120110210211001001000011211010000021111121120021111111100010`.*$

计算第二行中每个角色的曲线。

.
$*
%`1

每行分别对数字求和。


4

R164153字节

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




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

在线尝试!

我有同样的想法NIMI的答案用基地5编码,但编码为ASCII字符,而不是基地16用途nomatch = 0match消除非字母数字字符。

返回curves lines


4

木炭,60字节

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

在线尝试!链接是详细版本的代码。说明:

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

这是两个字符串13103202000101111131333201110112441331014323313243010202024433和组成的数组10120110212111112112002111111110001002110010010000112110100000。然后将字符串映射到上方。

Φθ№⭆ι⍘ξφλ

将根据输入的元素是否包含在默认基本转换字母的(62)字符中进行过滤。

⭆...§ι⍘λφ

然后将剩余的元素从基数(62)转换,然后将其索引到映射的字符串中。

I...Σ...

将这些数字相加并返回字符串以进行隐式打印。


4

Python 3中165个 159 148 146字节

对于任何字符(包括非字母数字字符)lines*3 + curves,其值都介于0到12之间,因此我们可以使用13进制长数字来编码数据。为了使其更短,将其转换为base-36。

感谢@Chas Brown的出色建议。

通过将lambda转换为程序,可将-2字节。

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

在线尝试!


4

Python 2中179个 166 165 163字节

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

在线尝试!

返回一个列表[curves, lines]


3

Python 2,525字节

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

在线尝试!

与参考实现类似的方法,但略短一些。



2
考虑到这一点,下班后我
比尔加滕(

1
@HermanL随意发布作为您自己的答案。我没有时间更新这个前夕。
ElPedro

2
265个字节,还有更多的打高尔夫球...
Chas Brown,


2

Perl -MList::Util=sum -p 5,180字节

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

在线尝试!


2

05AB1E,53 个字节

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

在线尝试验证所有测试用例

说明:

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)

请参阅我的05AB1E技巧(如何压缩大整数?如何压缩整数列表?以了解为什么•xþ¢*>ÌŸÑå#÷AUI'@æýXÁи<¥èå–ΘηžÎà₅åǚĕis 101629259357674935528492544214548347273909568347978482331029666966024823518105773925160•xþ¢*>ÌŸÑå#÷AUI'@æýXÁи<¥èå–ΘηžÎà₅åǚĕ5вis [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]


1

Python 3,697字节

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

一个简单的第一次尝试。我将表放入字典中,遍历字符串,增加一些计数器,然后返回一个元组。输入是一个字符串。

在线尝试!


1
为什么不竞争?在我看来很好。
ElPedro

1
为什么在没有评论的情况下投票?
ElPedro

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.