Có bao nhiêu âm tiết trong số đó?


15

Tôi muốn lấy một số và biết có bao nhiêu âm tiết trong đó, khi nói bằng tiếng Anh.

Hãy giới hạn số nguyên này dưới các số nguyên dương nhỏ hơn một nghìn.

Tôi là người Anh, vì vậy chúng tôi sẽ theo dõi hàng trăm cột với 'và' khi có bất kỳ chữ số khác nào sau nó.

Các thách thức

  • Viết một số mã sẽ chấp nhận một số nguyên dương thấp hơn 1000 và xuất ra số lượng âm tiết trong các từ đại diện cho số đó bằng tiếng Anh Anh.
  • Nó KHÔNG cần tạo ra các từ để biểu thị các số, chỉ có số lượng âm tiết mà chúng chứa.
  • Đó là mã golf, cố gắng đạt được điều này trong vài byte.
  • Sử dụng bất kỳ ngôn ngữ nào bạn thích.
  • Các sơ hở tiêu chuẩn bị cấm.

Các trường hợp thử nghiệm

|  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
Chúng ta có thể lấy đầu vào dưới dạng một chuỗi hoặc một mảng các chữ số không?
Dennis

Câu trả lời:


11

Python 2 , 84 83 74 67 byte

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

Cảm ơn @xnor vì đã chơi golf 9 16 byte!

Hãy thử trực tuyến!


Python 2 , 79 byte

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

Đơn giản, nhưng lâu hơn.

Hãy thử trực tuyến!


Đối với giải pháp 83-byte, bạn có thể cắt 3 byte bằng cách thay đổi -10để ~9và chuyển xung quanh các bit cuối cùng +(0<n%100!=12)-(n%100!=11), nhưng đó là vẫn còn hơn giải pháp mới của bạn.
xnor


@xnor Thật là thông minh! min(n%100,13)%12/~9thực sự có thể giúp với một cách tiếp cận tôi cũng đang cố gắng cho câu trả lời Jelly của tôi.
Dennis

Trên thực tế, chỉ cần đẩy mọi thứ vào một hằng số mã hóa cứng hóa ra lại ngắn hơn.
xnor

@xnor Cảm ơn một lần nữa!
Dennis

8

Perl 5 -p , 53 byte

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

Hãy thử trực tuyến!

Làm sao

-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

Python 2 , 112 108 byte

f=lambda n:n>99and f(n/100)+3+f(n%100)-(n%100<1)or n>19and f(n/10)-~f(n%10)or int("01111112111312222322"[n])

Hãy thử trực tuyến!

-4 byte, nhờ Shaggy


2
Ngoài ra, [2]*7phần của bạn sẽ thất bại 17, vì đó phải là 3 thay vì 2 ( sev-en-teen).
Kevin Cruijssen

2
-4 byte , bao gồm một bản sửa lỗi cho 17.
Shaggy

@Shaggy Cảm ơn :)
TFeld 17/12/18

@KevinCruijssen Đã sửa lỗi ngay bây giờ (nhờ Shaggy)
TFeld 17/12/18


6

Ngôn ngữ Wolfram 101 115 byte

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

Giải trình

(thay thế StringSplitcho s)

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

IntegerName hiển thị số bằng tiếng Anh Mỹ (nghĩa là không có "và" được bao gồm trong các số lớn hơn 100.) Ví dụ: 777-> "seven hundred seventy-seven .

StringSplit[IntegerName@#,"-"] loại bỏ bất kỳ dấu gạch nối trong kết xuất.

StringSplit/@ chia kết xuất thành các từ.

Join@@ để lại một danh sách các từ đơn giản, không có danh sách nhúng (trong trường hợp có dấu gạch nối xuất hiện).

WordData[#,"Hyphenation"] phá vỡ một từ duy nhất vào âm tiết của nó.

Join@@ để lại một danh sách đơn giản các âm tiết trong tất cả các từ.

Length đếm các âm tiết

+Boole[#>100&&#~Mod~100!=0]thêm 1vào số lượng âm tiết cho những số lớn hơn 100 (vì bổ sung "và" được sử dụng trong kết xuất tiếng Anh của Anh), không bao gồm bội số nguyên của 100.


6

Java 11, 105 102 byte

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

Chứa vô số ký tự không thể in được.

-3 byte cảm ơn @ OlivierGrégoire .

Hãy thử trực tuyến.

Giải trình:


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 byte bằng cách thay đổi .split("7",-1)để .split("7",9), và -6+(n>99?4:0)để -(n>99?2:6).
Olivier Grégoire

1
@ OlivierGrégoire Cảm ơn. Hoàn toàn bị bỏ lỡ -(n>99?2:6), nhưng bây giờ rõ ràng là bạn đã chỉ ra nó. Và-1 để 9do sự hạn chế đầu vào kích thước tôi sẽ không có nghĩ đến, vì vậy cảm ơn!
Kevin Cruijssen 19/12/18

5

05AB1E , 34 31 byte

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

Hãy thử trực tuyến hoặc xác minh tất cả các [1,999]trường hợp thử nghiệm .

Giải trình:

Với tất cả các kiểm tra được đề cập, nó sẽ cho kết quả là 1 cho sự thật và 0 cho falsey.

т%         # 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

Điều này không thành công trong trường hợp thử nghiệm 700. 'Seven Hundred' có 4 âm tiết, điều này trả về 5.
AJFaraday 14/12/18

@AJFaraday Nên sửa ngay. Vô tình có I(đầu vào) thay vì X(mod đầu vào 100) khi kiểm tra xem nó có lớn hơn 20 cho +1 không ty.
Kevin Cruijssen

Tôi rất xin lỗi, nó trả về 0 cho 'một trăm'
AJFaraday 14/12/18

@AJFaraday Đã sửa lại .. >(kiểm tra xem đầu vào lớn hơn 100) đã được thay thế bằng @(kiểm tra xem đầu vào có lớn hơn hoặc bằng 100) không. Có lẽ tôi nên tự kiểm tra thêm một số trường hợp kiểm tra cẩn thận hơn trước khi đăng .. Xin lỗi về điều đó ..
Kevin Cruijssen 14/12/18

4
Nhân tiện, yêu chiếc mũ trên một khối rubix!
AJFaraday

5

Than , 39 31 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

I⁻⁺

Tính toán điều chỉnh số lượng âm tiết và xuất kết quả dưới dạng chuỗi.

↨E謬Iι²

Bắt đầu bằng cách thay đổi từng chữ số khác không thành 1 và sau đó giải mã thành cơ sở 2. Điều này đưa ra câu trả lời đúng cho hầu hết các đầu vào.

№θ7

Thêm 1 cho mỗi 7.

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

Lấy chuỗi ký tự 10000000001021111111và nối thêm 80 số không, sau đó lập chỉ mục theo chu kỳ theo đầu vào và trừ đi chữ số đó.


4

Thạch , 28 25 23 byte

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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 byte

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

Hãy thử trực tuyến!

Một cổng của giải pháp của Kevin Cruijssen (thật không may, nó không có cùng tính ngắn gọn trong PHP :))

- 32 45 nhờ Shaggy!

-3 cảm ơn Kevin Crujissen!


Vì vậy, nhiều tiết kiệm được thực hiện ở đây! Đây chỉ là một vài cái rất nhanh
Shaggy

1
145 byte . Bạn có thể lưu thêm một vài byte bằng các thẻ ngắn nhưng tôi không thể nhớ cách sử dụng chúng trên TIO. (Lưu ý: Tôi đang sử dụng điện thoại nên chưa kiểm tra tất cả các đầu vào.)
Shaggy

1
@Shaggy có thể thay đổi thêm 2 byte khi sử dụng >99>19thay vì >=100>=20.
Kevin Cruijssen

1
@KevinCruijssen thực sự tiết kiệm 3 byte vì nó sẽ tăng từ 100 đến 99 :)
NK1406

Tôi cũng đã quản lý để lưu một byte khác bằng cách đặt biến ở đầu tiếng vang.
NK1406

2

05AB1E , 24 byte

Câu trả lời của cảng Dennis

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

Hãy thử trực tuyến! hoặc như một bộ thử nghiệm

Giải trình

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 byte

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

Câu trả lời của Char @ Port của @Neil , vì vậy hãy đảm bảo nâng cao anh ấy nếu bạn thích câu trả lời này!

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Số nguyên nén •Ž¢Γ}Þ±6u•có thể thay thế •8JA•b2TÌǝcho cùng một số byte.

Giải trình:

€Ā                   # 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)

Xem 05AB1E câu trả lời này của tôi (phần Làm thế nào để nén các số nguyên lớn? ) Để hiểu tại sao •Ž¢Γ}Þ±6u•10000000001021111111 .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.