그 숫자에 몇 음절이 있습니까?


15

나는 영어로 말할 때 숫자를 가지고 몇 음절이 있는지 알고 싶습니다.

이것을 1,000보다 작은 양의 정수로 제한합시다.

영국인이기 때문에 숫자가 0이 아닌 숫자가 있으면 백 열에 'and'를 붙입니다.

도전

  • 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
문자열이나 숫자 배열로 입력 할 수 있습니까?
Dennis

답변:


11

파이썬 2 , 84 83 74 67 바이트

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

9 16 바이트 를 골라 낸 @xnor에게 감사드립니다 !

온라인으로 사용해보십시오!


파이썬 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하여 3 바이트를 줄일 수 있지만 여전히 새 솔루션보다 깁니다. ~9+(0<n%100!=12)-(n%100!=11)
xnor


@xnor 정말 영리합니다! min(n%100,13)%12/~9실제로 젤리 답변을 시도한 접근법에 도움이 될 수 있습니다.
Dennis

실제로, 하드 코딩 된 상수 로만 입력하면 더 짧아집니다.
xnor

@xnor 다시 감사합니다!
Dennis

8

펄 5 -p , 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 $_




6

볼프람 언어 101 115 바이트

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

설명

(대체 StringSplit를 위해 s)

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

IntegerName숫자를 미국 영어로 렌더링합니다 (예 : 100보다 큰 숫자에 "and"가 포함되지 않음) 777-> "seven hundred seventy-seven. 예 : .

StringSplit[IntegerName@#,"-"] 렌더링에서 하이픈을 제거합니다.

StringSplit/@ 렌더링을 단어로 분할합니다.

Join@@ 하이픈이 나타난 경우 포함 된 목록없이 간단한 단어 목록을 남깁니다.

WordData[#,"Hyphenation"] 한 단어를 음절로 나눕니다.

Join@@ 모든 단어에 간단한 음절 목록을 남깁니다.

Length 음절을 세다

+Boole[#>100&&#~Mod~100!=0]추가 1100의 정수 배로 제외하고 그 숫자 (때문에 영국 영어의 렌더링에 사용되는 추가 "와"의)보다 큰 100의 음절 수에.


6

자바 11, 105102 바이트

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

인쇄 할 수없는 문자가 들어 있습니다.

@ OlivierGrégoire 덕분에 -3 바이트 .

온라인으로 사용해보십시오.

설명:


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
및 로 변경 .split("7",-1)하여 102 바이트 . .split("7",9)-6+(n>99?4:0)-(n>99?2:6)
Olivier Grégoire

1
@ OlivierGrégoire 감사합니다. 완전히 놓쳤지만 -(n>99?2:6)지금 지적한 것은 분명합니다. 그리고 제한된 입력 크기 -19인해 생각하지 못했을 것이므로 감사합니다!
Kevin Cruijssen '12

5

05AB1E , 34 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 테스트 사례가 실패합니다. '일곱 백'에는 4 음절이 있으며 5를 반환합니다.
AJFaraday

@AJFaraday 지금 수정해야합니다. +1의 +1에 대해 20보다 큰지 확인할 때 실수 IX(입력 모드 100 ) 대신 (입력) 이있었습니다 ty.
Kevin Cruijssen

죄송합니다. '100'에 대해 0을 반환합니다.
AJFaraday

@AJFaraday 다시 수정. >(입력이 100보다 큰지 확인)이 @(입력이 100보다 크거나 같은지 확인 )으로 대체되었습니다 . 어쩌면 게시하기 전에 테스트 사례를 더 신중하게 확인해야 할 수도 있습니다. 죄송합니다 ..
Kevin Cruijssen

4
그건 그렇고, 루비 큐브에 모자를 사랑합니다!
AJFaraday

5

, 39 31 바이트

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

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

I⁻⁺

음절 수에 대한 조정을 계산하고 결과를 문자열로 출력합니다.

↨E謬Iι²

0이 아닌 각 숫자를 1로 변경 한 다음 기본 2로 디코딩하여 시작하십시오. 이는 대부분의 입력에 대한 정답을 제공합니다.

№θ7

에 1을 더하십시오 7.

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

리터럴 문자열 10000000001021111111을 가져와 80 개의 0을 추가 한 다음 입력을 기준으로 주기적으로 색인을 생성하고 해당 숫자를 뺍니다.


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

PHP , 190 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 감사합니다!

Kevin Crujissen에게 -3 감사합니다!


너무 많은 절약이 여기에 있습니다! 여기 몇 가지 매우 빠른 것들이 있습니다
Shaggy

1
145 바이트 . 짧은 태그를 사용하여 몇 바이트를 더 절약 할 수 있지만 TIO에서 사용하는 방법을 기억할 수 없습니다. (참고 : 저는 전화를 사용하고 있으므로 모든 입력을 테스트하지는 않았습니다.)
Shaggy

1
@Shaggy 2 바이트가 추가로 사용하는 경우 변경 가능 >99하고 >19대신 >=100하고 >=20.
Kevin Cruijssen

1
그것은 있기 때문에 100 : 99에가는 3 바이트 저장 실제로 @KevinCruijssen
NK1406

또한 에코의 시작 부분에 변수를 배치하여 다른 바이트를 절약 할 수있었습니다.
NK1406

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.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.