这个数字有多少个音节?


15

我很想拿一个数字,用英语说的时候知道其中有多少个音节。

让我们将其限制为小于一千的正整数。

我是英国人,所以当后面有任何非零数字时,我们将在百列后面加上“和”。

挑战

  • 编写一些代码,该代码将接受小于1000的正整数,并在代表英式英语的数字的单词中输出音节的数量。
  • 它不需要生成代表数字的单词,只需生成它们包含的音节的数量即可。
  • 这是代码高尔夫,尝试以最少的字节数实现。
  • 使用您喜欢的任何语言。
  • 禁止使用标准漏洞。

测试用例

|  N  | In words                             | Syllables |
|   1 | one                                  |         1 |
|   2 | two                                  |         1 |
|   3 | three                                |         1 |
|   4 | four                                 |         1 |
|   5 | five                                 |         1 |
|   6 | six                                  |         1 |
|   7 | sev-en                               |         2 |
|   8 | eight                                |         1 |
|   9 | nine                                 |         1 |
|  10 | ten                                  |         1 |
|  11 | el-ev-en                             |         3 |
|  12 | twelve                               |         1 |
|  13 | thir-teen                            |         2 |
|  14 | four-teen                            |         2 |
|  17 | se-ven-teen                          |         3 |
|  20 | twen-ty                              |         2 |
|  21 | twen-ty one                          |         3 |
|  42 | four-ty two                          |         3 |
|  73 | sev-en-ty three                      |         4 |
|  77 | sev-en-ty sev-en                     |         5 |
| 100 | one hund-red                         |         3 |
| 110 | one hund-red and ten                 |         5 |
| 111 | one hund-red and el-ev-en            |         7 |
| 555 | five hund-red and fif-ty five        |         7 |
| 700 | sev-en hund-red                      |         4 |
| 770 | sev-en hund-red and sev-en-ty        |         8 |
| 777 | sev-en hund-red and sev-en-ty sev-en |        10 |
| 999 | nine hund-red and nine-ty nine       |         7 |

1
我们可以将输入作为字符串或数字数组吗?
丹尼斯

Answers:


11

Python 2中84个 83 74 67字节

lambda n:4*(n>99)+2-n%~9/9-0x55561aaaab/4**(n%100)%4+`n`.count('7')

感谢@xnor打高尔夫9 16字节!

在线尝试!


Python 2,79字节

lambda n:4*(n>99)+([-1]+10*[1]+[3,1]+7*[2]+8*([2]+9*[3]))[n%100]+`n`.count('7')

直截了当,但更长。

在线尝试!


对于您的83字节的解决方案,您可以通过更改-10~9并将最后一位切换为来削减3个字节+(0<n%100!=12)-(n%100!=11),但这仍然比您的新解决方案更长。
xnor


@xnor真的很聪明!min(n%100,13)%12/~9可能实际上对我尝试果冻答案的方法也有所帮助。
丹尼斯

实际上,仅将内容推入硬编码的常量就更短了。
xnor

@xnor再次感谢!
丹尼斯

8

Perl -p 5,53个字节

$_=4*/.../+2*/[^0].$/+!/0$/+y/7//-/1[^1]$/-/12$/-/00/

在线尝试!

怎么样

-p commandline flag reads input into $_

$_=4*/.../     # Hundreds place has minimum of 4 sylables (__ HUN-DRED AND),
               # match fails on number <100, and would add 0 here
  +2*/[^0].$/  # Tens place has two syllables if not 0 (__-TY or __TEEN),
               # match fails on numbers <10, and would add 0
  +!/0$/       # Ones place has one syllable if not 0 (__)
               # -- Now adjust for special cases --
  +y/7//       # add a syllable for every 7 present
  -/1[^1]$/    # remove a syllable for 10-19, except 11
  -/12$/       # remove another syllable for 12
  -/00/        # remove the syllable for AND if it's an even hundred

-p commandline flag outputs contents of $_

7

JavaScript(ES6),89个字节

n=>(s='01111112111312222322',n>99&&+s[n/100|0]+3-!(n%=100))+~~(s[n]||+s[n/10|0]-~s[n%10])

在线尝试!




6

Wolfram语言101个 115字节

s=StringSplit;Length[Join@@(WordData[#,"Hyphenation"]&/@Join@@s/@
s[IntegerName@#,"-"])]+Boole[#>100&&#~Mod~100!=0]&

说明

(代StringSplits

Length[Join@@(WordData[#,"Hyphenation"]&/@Join@@
StringSplit/@ StringSplit[IntegerName@#,"-"])]+Boole[#>100&&#~Mod~100!=0]&

IntegerName呈现在美式英语中的数量(即没有“和”包含在数大于100)EG 777-> "seven hundred seventy-seven

StringSplit[IntegerName@#,"-"] 删除渲染中的所有连字符。

StringSplit/@ 将渲染分为单词。

Join@@ 留下一个简单的单词列表,没有嵌入的列表(在出现连字符的情况下)。

WordData[#,"Hyphenation"] 将单个单词分解成音节。

Join@@ 在所有单词中留下一个简单的音节列表。

Length 计数音节

+Boole[#>100&&#~Mod~100!=0]增加了1为这些数字大于100(在英式英语渲染增聘的“和”的原因),但不包括100整数倍的音节数。


6

爪哇11,105个 102字节

n->(""+"".repeat(8)).charAt(n%100)+(n+"").split("7",9).length-(n>99?2:6)

包含大量无法打印的字符。

-3个字节,感谢@OlivierGrégoire

在线尝试。

说明:


n->               // Method with integer as both parameter and return-type
  (""
                  //  Push string with ASCII-value digits 46666666666867777777
 +"".repeat(8))
                  //  Appended with 8 times a string with ASCII-value digits 7888888888
   .charAt(n%100) //  Take the (input modulo-100)'th character of this string (as integer)
  +(n+"").split("7",9).length
                  //  Count the amount of 7s in the input + 1
  -(n>99?         //  And if the input is larger than 99:
     2            //   Subtract 2 (-1 for the 7s+1 count; -5 to map the ASCII-digits to:
                  //               4 → -1; 6 → 1; 7 → 2; 8 → 3;
                  //               and +4 for the inputs above 99)
    :             //  Else:
     6)           //   Subtract 6 (-1 for the 7s+1 count and -5 to map the ASCII-digits to:
                  //               4 → -1; 6 → 1; 7 → 2; 8 → 3)

1
102个字节通过改变.split("7",-1).split("7",9)-6+(n>99?4:0)-(n>99?2:6)
奥利维尔·格雷戈雷

1
@OlivierGrégoire谢谢。完全错过了-(n>99?2:6),但是现在您已经指出了,它是如此的明显。而-19由于有限的投入规模,我也不会想到,这样的感谢!
凯文·克鲁伊森

5

05AB1E34 31 字节

т%U7¢I€Ā`Iт@3*X_(X20@X12Q(X11QO

在线尝试验证所有[1,999]测试用例

说明:

提及所有检查,将得出1为真,0为假。

т%         # Take modulo-100 of the (implicit) input
           #  i.e. 710 → 10
  U        # Pop and store it in variable `X`
7¢         # Count the amount of 7s in the (implicit) input
           #  i.e. 710 → 1
I€Ā        # Trutify each digit in the input (0 if 0; 1 otherwise)
   `       # And push all of the mapped values to the stack
           #  i.e. 710 → [1,1,0]
Iт@        # Check if the input is larger than or equal to 100
           #  i.e. 710 → 1 (truthy)
   3*      # Multiply that result by 3 (for 'hund-red and')
           #  i.e. 1 → 3
X_         # Check if variable `X` is 0
           #  i.e. 10 → 0 (falsey)
  (        # And negate that (to remove 'and' when #00)
           #  i.e. 0 → 0
X20@       # Check if variable `X` is larger than or equal to 20 (for '-ty')
           #  i.e. 10 → 0 (falsey)
X12Q       # Check if variable `X` is exactly 12
           #  i.e. 10 → 0 (falsey)
    (      # And negate that (to remove 'teen')
           #  i.e. 0 → 0
X11Q       # Check if variable `X` is exactly 11 (for 'el-ev-en' minus 'one one')
           #  i.e. 10 → 0 (falsey)
O          # Sum everything on the stack (and output implicitly)
           #  i.e. [1,1,1,0,3,0,0,0,0] → 6

这使700测试用例失败。“七百”有四个音节,返回
5。– AJFaraday

@AJFaraday应该现在修复。在检查的+1是否大于20时,意外地使用了I(input)而不是X(input mod 100)ty
凯文·克鲁伊森

很抱歉,它的“一百”返回0
AJFaraday

@AJFaraday再次固定。. >(检查输入是否大于100)已替换为@(检查输入是否大于或等于100)。也许我应该更仔细地发布之前查了一些更多的测试用例自己..我们对此深感抱歉..
凯文Cruijssen

4
顺便说一句,爱上了魔方的高顶礼帽!
AJFaraday

5

木炭39 31字节

I⁻⁺↨E謬Iι²№θ7I§⁺”)∨∧⌈a¡↶”×0⁸⁰N

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

I⁻⁺

计算对音节数的调整,并将结果输出为字符串。

↨E謬Iι²

首先将每个非零数字更改为1,然后以2为底进行解码。这将为大多数输入提供正确的答案。

№θ7

每个加1 7

I§⁺”)∨∧⌈a¡↶”×0⁸⁰N

取文字字符串10000000001021111111并附加80个零,然后按输入循环索引,然后减去该数字。


4

果冻28 25 23字节

9ḊŻ;2+⁵Żċ%ȷ2$ạDṠḄƊ+Dċ7Ɗ

在线尝试!

怎么运行的

9ḊŻ;2+⁵Żċ%ȷ2$ạDṠḄƊ+Dċ7Ɗ  Main link. Argument: n (integer in [1, ..., 999])

9                        Set the return value to 9.
 Ḋ                       Dequeue; yield [2, 3, 4, 5, 6, 7, 8, 9].
  Ż                      Zero; yield [0, 2, 3, 4, 5, 6, 7, 8, 9].
   ;2                    Concat 2, yield [0, 2, 3, 4, 5, 6, 7, 8, 9, 2].
     +⁵                  Add 10; yield [10, 12, 13, 14, 15, 16, 17, 18, 19, 12].
       Ż                 Zero; yield [0, 10, 12, 13, 14, 15, 16, 17, 18, 19, 12].
         %ȷ2$            Yield n % 1e2.
        ċ                Count the occurrences of the modulus in the array.
                 Ɗ       Combine the three links to the left into a monadic chain.
              D            Decimal; convert n to its array of digits in base 10.
               Ṡ             Take the sign of each decimal digit (0 or 1).
                Ḅ            Convert the array of signs from base 2 to integer.
             ạ           Compute the abs. difference of the results to both sides.
                      Ɗ  Combine the three links to the left into a monadic chain.
                   D       Decimal; convert n to its array of digits in base 10.
                    ċ7     Count the number of 7's.

3

PHP190个 158 145 141 137字节

<?for($j=$p=0;$p<strlen($i=$argv[1]);)$j+=str_split($i)[$p++]>0;echo$j+substr_count($i,7)+3*($i>99)-!($i%=100)+($i>19)-($i==12)+($i==11);

在线尝试!

凯文·克鲁伊森(Kevin Cruijssen)解决方案的一个端口(不幸的是,它在PHP中没有同样的简洁:))

- 32 45感谢长毛!

-3感谢Kevin Crujissen!


所以在这里做了很多的储蓄!以下是一些非常快速的内容
-Shaggy

1
145个字节。您可以使用短标签保存更多的字节,但是我不记得如何在TIO上使用它们。(注意:我在用手机,因此尚未测试所有输入。)
Shaggy

1
@Shaggy使用>99>19代替>=100和时,可以再更改2个字节>=20
凯文·克鲁伊森

1
@KevinCruijssen实际上节省了3个字节,因为它从100变为99 :)
NK1406

通过将变量放在回显的开始,我还设法节省了另一个字节。
NK1406 '18

2

05AB1E,24个字节

丹尼斯港的果冻答案

8L>Ć¾šT+¾šsт%¢sSĀJCαs7¢+

在线尝试! 或作为测试套件

说明

8L>                       # push range [2 ... 9]
   Ć                      # enclose, append head
    ¾š                    # prepend 0
      T+                  # add 10 to each
        ¾š                # prepend 0
          sт%¢            # count occurrences of input % 100 in this list
              sS          # push input split into a list of digits
                Ā         # truthify, check each if greater than 0
                 JC       # convert from base-2 to base-10
                   α      # absolute difference
                    s7¢+  # add the amount of 7's in the input

1

05AB1E,26 个字节

€ĀJCI7¢•Ž¢Γ}Þ±6u•¾80׫Iè(O

@Neil的木炭答案的端口,因此,如果您喜欢此答案,请确保也对他进行投票

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

压缩整数•Ž¢Γ}Þ±6u•也可以是•8JA•b2TÌǝ相同的字节数。

说明:

€Ā                   # Trutify every digit in the (implicit) input
                     # (0 remains 0; everything else becomes 1)
  J                  # Join it together to a single string
   C                 # Convert from binary to integer
I7¢                  # Count the amount of 7s in the input
•Ž¢Γ}Þ±6u           # Push compressed integer 10000000001021111111
          ¾80׫      # Append 80 "0"s
               Iè    # Index the integer (with automatic wraparound) into it
                 (   # Negate the result
O                    # Sum all values on the stack (and output implicitly)

看到这个05AB1E回答我的(部分如何压缩大整数?理解为什么•Ž¢Γ}Þ±6u•10000000001021111111

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.