Wie viele Silben in dieser Zahl?


15

Ich würde gerne eine Zahl nehmen und wissen, wie viele Silben darin enthalten sind, wenn ich auf Englisch spreche.

Beschränken wir dies auf positive ganze Zahlen, die kleiner als eintausend sind.

Ich bin Brite, also werden wir der Hunderterspalte ein 'und' folgen, wenn sich dahinter Ziffern befinden, die nicht Null sind.

Die Herausforderung

  • Schreiben Sie einen Code, der eine positive Ganzzahl kleiner als 1000 akzeptiert, und geben Sie die Anzahl der Silben in den Wörtern aus, die diese Zahl im britischen Englisch darstellen.
  • Es müssen NICHT die Wörter generiert werden, um die Zahlen darzustellen, sondern nur die Anzahl der Silben, die sie enthalten.
  • Es ist Codegolf, versuchen Sie dies in den wenigsten Bytes zu erreichen.
  • Verwenden Sie eine beliebige Sprache.
  • Die Standardlücken sind verboten.

Testfälle

|  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
Können wir Eingaben als Zeichenfolge oder als Array von Ziffern annehmen?
Dennis

Antworten:


11

Python 2 , 84 83 74 67 Bytes

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

Vielen Dank an @xnor für das Golfen mit 9 bis 16 Bytes!

Probieren Sie es online!


Python 2 , 79 Bytes

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

Einfach, aber länger.

Probieren Sie es online!


Für Ihre 83-Byte - Lösung, können Sie 3 Bytes abgeschnitten , indem -10auf ~9und Schalt um das letzte Stück zu +(0<n%100!=12)-(n%100!=11), aber das ist immer noch mehr als Ihre neue Lösung.
14.


@xnor Das ist wirklich schlau! min(n%100,13)%12/~9könnte tatsächlich bei einer Annäherung helfen, die ich auch für meine Gelee-Antwort versuchte.
Dennis

Tatsächlich fällt es kürzer aus , Dinge nur in eine fest codierte Konstante zu schieben .
Xnor

@ xnor Nochmals vielen Dank!
Dennis

8

Perl 5 -p , 53 Bytes

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

Probieren Sie es online!

Wie

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

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

Probieren Sie es online!

-4 Bytes, danke an Shaggy


2
Auch Ihr [2]*7Teil wird scheitern 17, da dies 3 anstelle von 2 ( sev-en-teen) sein sollte.
Kevin Cruijssen

2
-4 Bytes , einschließlich einer Korrektur für 17.
Shaggy

@ Shaggy Danke :)
TFeld

@ KevinCruijssen Jetzt behoben (dank Shaggy)
TFeld


6

Wolfram Language 101 115 Bytes

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

Erläuterung

(Ersatz StringSplitfür s)

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

IntegerNamegibt die Zahl in amerikanischem Englisch wieder (dh ohne "und", die in Zahlen größer als 100 enthalten sind) 777-> "seven hundred seventy-seven.

StringSplit[IntegerName@#,"-"] Entfernt alle Bindestriche im Rendering.

StringSplit/@ teilt das Rendering in Wörter auf.

Join@@ Lässt eine einfache Liste mit Wörtern ohne eingebettete Liste (falls ein Bindestrich angezeigt wird).

WordData[#,"Hyphenation"] zerlegt ein einzelnes Wort in seine Silben.

Join@@ hinterlässt eine einfache Liste von Silben in allen Wörtern.

Length zählt die Silben

+Boole[#>100&&#~Mod~100!=0]erhöht 1die Silbenanzahl für Zahlen über 100 (aufgrund des zusätzlichen "und" im britischen Englisch), wobei ganzzahlige Vielfache von 100 ausgenommen sind.


6

Java 11, 105 102 Bytes

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

Enthält viele nicht druckbare Zeichen.

-3 Bytes danke @ OlivierGrégoire .

Probieren Sie es online aus.

Erläuterung:


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 Bytes durch Ändern von .split("7",-1)in .split("7",9)und -6+(n>99?4:0)in -(n>99?2:6).
Olivier Grégoire

1
@ OlivierGrégoire Danke. Komplett verpasst -(n>99?2:6), aber es ist so offensichtlich, dass Sie darauf hingewiesen haben. Und -1auf 9Grund der begrenzten Input-Größe würde ich nicht gedacht haben, so danke!
Kevin Cruijssen

5

05AB1E , 34 31 Bytes

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

Probieren Sie es online aus oder überprüfen Sie alle [1,999]Testfälle .

Erläuterung:

Bei allen genannten Prüfungen ergibt sich 1 für wahr und 0 für falsch.

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

Damit ist der 700-Testfall nicht bestanden. 'Siebenhundert' hat 4 Silben, dies gibt 5 zurück.
AJFaraday

@AJFaraday Sollte jetzt behoben sein. Habe versehentlich I(input) anstatt X(input mod 100) beim Prüfen ob es größer als 20 für die +1 von ist ty.
Kevin Cruijssen

Es tut mir so leid, es gibt 0 für 'einhundert' zurück
AJFaraday

@AJFaraday Wieder behoben. >(Überprüfen Sie, ob die Eingabe größer als 100 ist) wurde durch @(Überprüfen Sie, ob die Eingabe größer oder gleich 100 ist) ersetzt. Vielleicht hätte ich selbst einige weitere Testfälle vor dem Posten genauer prüfen sollen. Entschuldigung.
Kevin Cruijssen

4
Übrigens, ich liebe den Zylinder auf einem Rubix-Würfel!
AJFaraday

5

Kohle , 39 31 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

I⁻⁺

Berechnen Sie Anpassungen an der Anzahl der Silben und geben Sie das Ergebnis als String aus.

↨E謬Iι²

Beginnen Sie, indem Sie jede Ziffer ungleich Null in 1 ändern und dann als Basis 2 dekodieren. Dies gibt die richtige Antwort für die meisten Eingaben.

№θ7

Addiere 1 für jede 7.

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

Nehmen Sie die Literalzeichenfolge, 10000000001021111111fügen Sie 80 Nullen hinzu, indexieren Sie sie zyklisch nach der Eingabe und subtrahieren Sie diese Ziffer.


4

Jelly , 28 25 23 Bytes

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

Probieren Sie es online!

Wie es funktioniert

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 Bytes

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

Probieren Sie es online!

Eine Portierung von Kevin Cruijssens Lösung (leider hat sie in PHP nicht die gleiche Kürze :))

- 32 45 danke an Shaggy!

-3 Danke an Kevin Crujissen!


So viele Einsparungen hier gemacht werden! Hier sind nur ein paar sehr schnelle
Shaggy

1
145 Bytes . Sie können ein paar weitere Bytes mit kurzen Tags speichern, aber ich kann mich nicht erinnern, wie ich sie auf TIO verwenden soll. (Hinweis: Ich bin auf meinem Handy und habe noch nicht alle Eingaben getestet.)
Shaggy

1
@Shaggy 2 weitere Bytes können geändert werden, wenn >99und >19anstelle von >=100und verwendet werden >=20.
Kevin Cruijssen

1
@ KevinCruijssen tatsächlich das spart 3 Bytes, weil es von 100 auf 99 geht :)
NK1406

Ich habe es auch geschafft, ein weiteres Byte zu speichern, indem ich die Variable am Anfang des Echos platziert habe.
NK1406

2

05AB1E , 24 Byte

Port of Dennis Gelee Antwort

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

Probieren Sie es online! oder als Testsuite

Erläuterung

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 Bytes

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

Port of @Neils Charcoal-Antwort , also stelle sicher, dass du ihn auch positiv bewertest, wenn dir diese Antwort gefällt!

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Komprimierte Ganzzahlen •Ž¢Γ}Þ±6u•können alternativ •8JA•b2TÌǝfür die gleiche Bytezahl verwendet werden.

Erläuterung:

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

Lesen Sie meine Antwort 05AB1E (Abschnitt Wie komprimiere ich große ganze Zahlen? ) , Um zu verstehen, warum dies so •Ž¢Γ}Þ±6u•ist 10000000001021111111.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.