我可以说您的程序多快?


26

我最近决定下载一些听写软件,以帮助我写作。但是,当我编码时,它不能很好地工作,因为我必须从说单词变成符号,然后再返回。当我使用所有符号的深奥语言编写代码时,情况甚至更糟。

为了使听写程序的使用更加一致,我决定将其切换到字符模式,在这里我只说每个字符的名称。问题解决了!虽然这确实延迟了我的小说的发行日期...

因此,假设角色名称越长,说的时间就越长,那么我要花多长时间才能拼出我的某些程序/句子?

技术指标

给定仅包含可打印ASCII的字符串,请返回每个字符的Unicode名称之和。例如,/被称为SOLIDUS具有7个字符,并且ALATIN CAPITAL LETTER A与22个字符。

但是请记住,我必须大声说出您的程序才能执行它们,所以它们的得分将取决于我说它们所花费的时间,即每个字符的unicode名称的长度之和。

测试用例:

格式input => output为在输入中没有尾随/前导空格。

A      => 22
/      => 7
Once upon a time...           => 304
slurp.uninames>>.comb.sum.say => 530
JoKing => 124
!" #$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~        =>  1591
Double-check your \s on the last test case ;)   => 755
<say "<$_>~~.EVAL">~~.EVAL     => 388
,[.,]  => 58
19     => 19

规则:

  • 程序的输入将仅包含可打印的ASCII字符,即代码点32(空格)至126(波浪号)。
    • 为了方便起见,以下是您必须处理的字符的长度列表: [5,16,14,11,11,12,9,10,16,17,8,9,5,12,9,7,10,9,9,11,10,10,9,11,11,10,5,9,14,11,17,13,13,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,19,15,20,17,8,12,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,18,13,19,5]
  • 这是一个参考程序,您可以使用它为程序评分。
    • 彼得·泰勒(Peter Taylor)指出,参考程序对某些unicode字符进行了规范化。它仍然适用于大多数解决方案,但是如果需要,可以随时对其进行纠正
  • 由于您是在说字符的实际外观,因此您的解决方案将由显示的字符而不是所涉及的字节来打分。这是针对具有自定义编码的语言的。
    • 您可以假设我已经记住了整个Unicode库,并且可以说出您使用的任何奇怪字符。
  • 对不起,Rogem,但答案必须由可显示的字符组成。无法打印的文字很好,我只需要能够大声读出字符即可。
  • 无论您做什么,都不要在程序中使用。

9
ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM这将是我孩子的全名
Quintec

1
该程序在单词模式下得分为6:在线试用!
尼尔

2
参考程序是越野车。考虑[此测试](tio.run/##dY5PC4JAEMXvfYphYcNsWcrSi@Ahrx3rlB223FTSXdk/…),其中该\x[2126]计数为\x[3a9]
彼得·泰勒

Answers:


13

Java的8,总分846 838 822 816

ௐ->ௐ.map(ˇ->Character.getName(ˇ).length()).sum()

@tsh替换为_1,得-8分
-22分得益于@ ASCII-only替换with ˇ$with

在线尝试。

说明:

使用ˇ代替通常使用的sand c,因为小写字母全为20(即LATIN SMALL LETTER S),但是TAMIL OM)为8,ˇCARON)为5。

ௐ->                         // Method with IntStream parameter and integer return-type
  ௐ.map(ˇ->                 //  Map each character to:
      Character.getName(ˇ)  //   Get the name of the character
               .length())   //   Get the length of that name
   .sum()                   //  And after the map: sum all lengths together,
                            //  and return it as result

1
我喜欢这个Java东西在字节和分数方面都击败了05AB1E答案……
Erik the Outgolfer

@EriktheOutgolfer Ikr。我猜是内置的。;)
Kevin Cruijssen

@KevinCruijssen它确实保存了一些不必要的字节push compressed integer 87235805968599116032550323044578484972930006625267106917841:P
Quintec

1
使用代替_1会节省一些积分。
tsh

1
@KevinCruijssen彼得·泰勒OHM SIGN)的长度为8个字符。另外哈哈,我不知道它是无效的,只是假定,因为它在C#中是有效的,并且Peter也使用_1了(程序来查找短变量名,不能使用框字符)
仅ASCII


7

Japt v2.0a1 -x,分数926 908 875 865 829 791 789

将输入作为字符数组。

®cg`061742//0.450./..//.2/5117385`c+51 r\A_p26}  n# 

尝试在TIO上运行所有测试用例

APOSTROPHE在TIO的第6个测试用例中被省略,因为Japt无法在同一输入字符串中处理单引号和双引号)


说明

®cg`...`c+51 r\A_p26}  n#      :Implicit input of character array
®                              :Map
 c                             :  Character code
  g                            :  Index into (0-based, with wrapping)
   `...`                       :    The string described below
        c+51                   :    Increment the codepoint of each by 51 (="8cKidj55gebbc9agh895c97a99baa9bba59ebhddMjfkh")
                               :    (Space closes the above method)
             r                 :    Replace
              \A               :      RegEx /[A-Z]/g
                _              :      Pass each match through a function
                 p26           :        Repeat 26 times
                    }          :      End function
                               :    (Space closes the replace method)
                               :  (Space closes the indexing method)
                       n       :  Convert to integer
                        #      :    From base 32 (note the trailing space)
                               :Implicitly reduce by addition and output

建立弦乐

(分数包括撤销每个修改所需的步骤和多余的字符)

  1. 该数组给出了2161的基线分数。
  2. 将每个元素转换为基数中的单个字符,>=23然后加入得分为1832的字符串。
  3. 963代替了一个大写字符,mk用一个大写字符替换了它们。
  4. 仍然有太多昂贵的字母,因此接下来我尝试通过减少所有字符的代码点来摆脱它们。5是具有最低代码点(53)的字符,所以我从52开始,得分为756
  5. 尝试了所有不会在字符串中留下字母的数字后,51给出了738分的最高分
  6. 最后,用稍微便宜些的反引号代替引号,得到734分。Japt中的反引号通常用于封装和解压缩压缩的字符串,但是幸运的是,Shoco的库中未包含该字符串中的任何字符

因此,最后的字符串包含以下代码点的字符:

[5,48,24,54,49,55,2,2,52,50,47,47,48,6,46,52,53,5,6,2,48,6,4,46,6,6,47,46,46,6,47,47,46,2,6,50,47,53,49,49,26,55,51,56,53]

4

05AB1E,得分963

Îv•Fδà‚<0?9½mΣ@×ƶC₁vc-™uΔ_ε'•21вεD3‹i22α₂и}}˜yÇ32-è+

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

说明:

Î               # Push 0 and the input-string
 v              # Loop `y` over the characters of this input-string:
  Fδà‚<0?9½mΣ@×ƶCvc-™uΔ_ε'•
               '#  Push compressed integer 87235805968599116032550323044578484972930006625267106917841
   21в          #  Converted to Base-21 as list: [5,16,14,11,11,12,9,10,16,17,8,9,5,12,9,7,10,9,9,11,10,10,9,11,11,10,5,9,14,11,17,13,13,0,19,15,20,17,8,12,2,18,13,19,5]
    ε           #  Map over this list:
     D3i       #   If the value is smaller than 3:
         22α    #    Take the absolute difference of this value with 22
            ₂и  #    Repeat it 26 times as list
    }}          #  Close the if-statement and map
      ˜         #  Flatten the list
       yÇ       #  Get the unicode value of the current character
         32-    #  Subtract 32
            è   #  Index it into the list of integers
             +  #  And add it to the sum
                # (and output the sum implicitly as result after the loop)

看到这个05AB1E尖矿(部分如何压缩大的整数?以及如何压缩整数列表?理解为什么•Fδà‚<0?9½mΣ@×ƶC₁vc-™uΔ_ε'•21в[5,16,14,11,11,12,9,10,16,17,8,9,5,12,9,7,10,9,9,11,10,10,9,11,11,10,5,9,14,11,17,13,13,0,19,15,20,17,8,12,2,18,13,19,5]


4

C#(Visual C#交互式编译器)(得分1627 1116 1096 1037 1019 902)

Ω=>Ω.Sum(ˇ=>(31&-ˇ)>5&ˇ>62?22-ˇ/91*2:"♁♌♊♇♇♈♅♆♌♍♄♅♁♈♅♃♆♅♅♇♆♆♅♇♇♆♁♅♊♇♍♉♉♏♋♐♍♄♈♎♉♏♁"[ˇ-6-ˇ/33*26]-9788)

它不使用内置数据库:仅使用一些特殊的字母和查找表框。

在线测试套件

它无法自行评分,因为大多数字符不在范围内,包括变量CARONOHM SIGN用于对查询表进行编码的十二宫符号。

感谢仅ASCII的许多建议。


您使用了哪种计分程序
(仅ASCII)

tio.run/##NZDrdpNAFIX/z1OMY0wgwhCg0NAEanpT22jVaquGiAQnYbgMhIHWGJO36gv0xSJrBf@cdS57r72@E3A54HR3UbFgyMuCsoVEWenM7d3To@08PeKbKhU82xG2suDJdgd2xLauikPNbLc9R9eONU32FFPtakeI5CyOExrly5CShC4iSuMoonEcEcriZZryrFyGSZFygiZebdP1rmZOZcsUdwMwzwriB6Fw7xfQh5RBRh4m0zVAIyRBRYGaBpCybw8BumYBgVWesVpb0pRgjPc3vXcAEE@qIscVo8xPCXccHGTpDPMqxdxf7XWG3gPoMruqifcLVauNz1wEn7detDuC2H0pyVjpqZp@YJiHfetoMLSd41ejk9Oz84vXb95eXo3fvb/@8PHTzecvt3dfv32fuO70h/fTnwW/yHwR0ihOUpbly4KX1f3D79Wf9d/NtskyLBWgs6yaJUQOQhLEcJVVBXRdDmukMiQw8XkJS1KXwOcEDsQG3TAAGtYU0EXDludst/j8djR20f@u@UK/D5A0wdK0oa1H1WrCLbARwV1BSzKmjAgttPYly9hAaDsQrueCL26QONj9Aw
ASCII-仅

2
仅限@ASCII,我在下面使用了Python答案;Java答案也给出1627。问题似乎是参考解决方案有问题:Ω是U + 2126,OHM SIGN,不是希腊字母OMEGA。
彼得·泰勒

1
得分5的名称:no,没有其他任何短于C#接受的名称,且长度不超过8,也未使用Java程序进行验证
(仅ASCII)

1
@Kevin,按照我之前的评论,该参考实现存在错误。我认为它正在应用规范化将源字符OHM SIGN转换为GREEK CAPITAL LETTER OMEGA。
彼得·泰勒

4

R; 得分:3330 1586 1443

由于缺乏内置功能,因此在R中也具有挑战性。

好了,代码现在大部分都是@Giuseppe的了,但是没关系。通过将*替换为〜,将s替换为点,我可以进行一些小的高尔夫编辑。

感谢@Nick Kennedy通过使用奥术魔术 “数字序列的UTF8编码版本” 将其降低到1443。

function(.)sum((c(+",752230178/0,30.1002110221,052844",61~26,+":6;8/3",59~26,+"94:,")-39)[+.-31]);`+`=utf8ToInt;`~`=rep

在线尝试


1769点 -尽量少压缩值...
Giuseppe

2
同样,它utf8ToInt是一个非常有用的高尔夫命令:-)我已经有一个月左右没有去玩PPCG了,所以很高兴看到新人们在R中打高尔夫球!
朱塞佩

啊,我有办法压缩它,但不了解utf8ToInt。今晚/明天晚些时候,我将不得不进行处理。
CT厅

1
这是代码的程序下,只是更多的线/片段,不影响BYTECOUNT -做一些测试中有用的
ASCII-仅

1
直到1443:tio.run/##xc09DoIwFADgu3ShTR/…使用数字序列的UTF8编码版本。
尼克·肯尼迪


2

Perl 5 -pl,得分723

s,\N{OX}*.,_charnames'viacode ord$&,ge,$_=y,,,c

在线尝试!

说明

s,        ,                        ,ge  # Replace globally
  \N{OX}*   # zero or more OX characters 🐂, loads the
            # _charnames module as side effect,
         .  # any character
           _charnames'viacode ord$&  # with its Unicode character name
                                     # (using old package delimiter).
                                      ,$_=y,,,c  # Set $_ to its length

2

随员1934年

Sum@{ToBase[FromBase[Ords@"!ZByru=#9fBYb$a3Si0^pU,ZP#3$cd'(c-_lhu]h(]5;!W|?M4:<_^sU;N&XFN`t:u"-32,95],23][Ords@_-32]}

在线尝试!

简单的压缩和索引编制。


:P看起来使用更智能的查找(请参阅C#答案)将有助于得分。甚至只是使用不包含要压缩的字母的字符集
仅限ASCII的

1

C#(Visual C#交互式编译器),得分:4007 3988 3759 3551 2551

ˇ=>ˇ.Sum(_=>new[]{5,16,14,11,11,12,9,10,16,17,8,9,5,12,9,7,10,9,9,11,10,10,9,11,11,10,5,9,14,11,17,13,13,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,19,15,20,17,8,12,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,18,13,19,5}[_-32])

上面的彼得·泰勒的解决方案让我感到沮丧。感谢Peter Taylor指出一个简单的查找表比我以前的字典解决方案要好。

在线尝试!


这比直接查找表相当差:_1=>_1.Select(_2=>new int[]{5,16,14,11,11,12,9,10,16,17,8,9,5,12,9,7,10,9,9,11,10,10,9,11,11,10,5,9,14,11,17,13,13,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,19,15,20,17,8,12,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,18,13,19,5}[_2-32]).Sum()得分2786
彼得·泰勒
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.