उस संख्या में कितने सिलेबल्स हैं?


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
क्या हम इनपुट को एक स्ट्रिंग या अंकों की एक सरणी के रूप में ले सकते हैं?
डेनिस

जवाबों:


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-बाइट समाधान के लिए, आप को बदलने के द्वारा 3 बाइट्स कटौती कर सकते हैं -10करने के लिए ~9और करने के लिए पिछले बिट के आसपास स्विचन +(0<n%100!=12)-(n%100!=11), लेकिन वह अपने नए समाधान की तुलना में लंबे समय तक अभी भी है।
xnor


@xnor यह वाकई बहुत चालाक है! min(n%100,13)%12/~9वास्तव में मैं अपने जेली जवाब के लिए कोशिश कर रहा था एक दृष्टिकोण के साथ मदद कर सकता है।
डेनिस

वास्तव में, बस एक हार्डकॉस्ट स्थिर में चीजों को छोटा करने से कम हो जाता है।
xnor

@xnor फिर से धन्यवाद!
डेनिस

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 $_


7

पायथन 2 , 112 108 बाइट्स

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

इसे ऑनलाइन आज़माएं!

-4 बाइट, झबरा के लिए धन्यवाद


2
इसके अलावा, आपका [2]*7भाग विफल हो जाएगा 17, क्योंकि यह 2 ( sev-en-teen) के बजाय 3 होना चाहिए ।
केविन क्रूज़सेन

2
-4 बाइट्स , 17 के लिए एक फिक्स सहित।
झबरा

@ शैगी धन्यवाद :)
टीएफडीएल

@ केविनक्रूजसेन फिक्स्ड अब (झबरा के लिए धन्यवाद)
टीएफडीएल


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 से अधिक संख्या में शामिल 777-> "seven hundred seventy-seven। ) जैसे ।

StringSplit[IntegerName@#,"-"] रेंडरिंग में किसी भी हाइफ़न को निकालता है।

StringSplit/@ शब्दों में प्रतिपादन विभाजन।

Join@@ शब्दों की एक सरल सूची छोड़ देता है, बिना एम्बेडेड सूची (मामले में जो एक हाइफ़न दिखाई दिया)।

WordData[#,"Hyphenation"] किसी शब्द को उसके शब्दांशों में तोड़ देता है।

Join@@ सभी शब्दों में शब्दांशों की एक सरल सूची छोड़ देता है।

Length शब्दांशों को गिना जाता है

+Boole[#>100&&#~Mod~100!=0]1100 से अधिक के अभिन्न गुणकों को छोड़कर, 100 से अधिक (क्योंकि ब्रिटिश अंग्रेजी प्रतिपादन में नियोजित) के लिए उन संख्याओं के लिए शब्दांश संख्या में जोड़ता है।


6

जावा 11, 105 102 बाइट्स

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

इसमें अनपेक्षित वर्णों का भार होता है।

-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
102 बाइट्स बदलकर .split("7",-1)करने के लिए .split("7",9), और -6+(n>99?4:0)करने के लिए -(n>99?2:6)
ओलिवियर ग्रेगोइरे

1
@ ओलिवियरग्रेगायर धन्यवाद। पूरी तरह से चूक गए -(n>99?2:6), लेकिन यह अब स्पष्ट है कि आपने इसे इंगित किया है। और -1करने के लिए 9सीमित इनपुट आकार मैं के बारे में सोचा नहीं होता है, तो धन्यवाद की वजह से!
केविन क्रूज़सेन

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 को अभी तय किया जाना चाहिए। गलती से था I(इनपुट) के बजाय X(इनपुट आधुनिक 100) जब पता चल सके कि यह +1 करने के लिए 20 से भी बड़ा है ty
केविन क्रूज़सेन

मुझे बहुत खेद है, यह 'एक सौ' के लिए 0 रिटर्न देता है
AJFaraday

@AJFaraday फिर से तय किया गया .. >(जाँच करें कि इनपुट 100 से बड़ा है) को बदल दिया गया है @(जाँच करें कि क्या इनपुट 100 से अधिक या इसके बराबर है)। हो सकता है कि मैंने पोस्ट करने से पहले कुछ और परीक्षण मामलों को स्वयं अधिक सावधानी से जांच लिया हो .. इसके बारे में क्षमा करें ..
केविन क्रूज़सेन

4
वैसे, रबिक्स क्यूब पर शीर्ष टोपी को प्यार करना!
AJFaraday

5

चारकोल , 39 31 बाइट्स

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

इसे ऑनलाइन आज़माएं! लिंक कोड के वर्बोज़ संस्करण के लिए है। स्पष्टीकरण:

I⁻⁺

सिलेबल्स की संख्या में समायोजन की गणना करें और परिणाम को एक स्ट्रिंग के रूप में आउटपुट करें।

↨E謬Iι²

प्रत्येक गैर-शून्य अंक को 1 में बदलकर शुरू करें और फिर आधार के रूप में डिकोडिंग करें। यह अधिकांश इनपुट के लिए सही उत्तर देता है।

№θ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

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

इसे ऑनलाइन आज़माएं!

केविन क्रूज़सेन के समाधान का एक बंदरगाह (दुर्भाग्य से यह PHP में समान संक्षिप्तता नहीं रखता है :))

- 32 45 झबरा के लिए धन्यवाद!

-3 केविन क्रुजिसन के लिए धन्यवाद!


इतनी सारी बचत यहाँ की जानी चाहिए! यहाँ सिर्फ कुछ बहुत जल्दी हैं
झबरा

1
145 बाइट्स । आप लघु टैग का उपयोग करके कुछ और बाइट्स बचा सकते हैं लेकिन मुझे याद नहीं है कि टीआईओ पर उनका उपयोग कैसे किया जाए। (नोट: मैं अपने फोन पर हूं इसलिए सभी इनपुट का परीक्षण नहीं किया है।)
झबरा

1
@Shaggy 2 अधिक बाइट्स का उपयोग करते समय बदला जा सकता है >99और >19के बजाय >=100और >=20
केविन क्रूज़सेन

1
@KevinCruijssen वास्तव में 3 बाइट्स बचाता है क्योंकि यह 100 से 99 पर जा रहा है :)
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

पोर्ट @ नाइल के चारकोल जवाब , इसलिए सुनिश्चित करें कि यदि आप इस उत्तर को पसंद करते हैं तो उसे भी उखाड़ फेंकें !

इसे ऑनलाइन आज़माएं या सभी परीक्षण मामलों को सत्यापित करें

संपीड़ित पूर्णांक •Ž¢Γ}Þ±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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.