Bu sayıda kaç hece var?


15

İngilizce konuşulduğunda bir sayı almak ve içinde kaç hece olduğunu bilmek isterim.

Bunu binden az olan pozitif tamsayılarla sınırlayalım.

Ben İngilizim, bu yüzden ondan sonra sıfır olmayan rakamlar olduğunda yüzlerce sütunu 've' ile izleyeceğiz.

Meydan okuma

  • 1000'den düşük bir pozitif tamsayıyı kabul edecek ve İngiliz İngilizcesinde bu sayıyı temsil eden kelimelerde hecelerin sayısını çıkaracak bir kod yazın.
  • Sayıları temsil edecek kelimeleri, sadece içerdikleri hecelerin sayısını oluşturması GEREKMEZ.
  • Bu kod golf, bunu en az bayt ile elde etmeye çalışın.
  • İstediğiniz dili kullanın.
  • Standart boşluklar yasaktır.

Test Durumları

|  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
Girişi bir dize veya bir rakam dizisi olarak alabilir miyiz?
Dennis

Yanıtlar:


11

Python 2 , 84 83 74 67 bayt

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

9 16 baytlık golf için @xnor'a teşekkürler !

Çevrimiçi deneyin!


Python 2 , 79 bayt

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

Basit ama daha uzun.

Çevrimiçi deneyin!


Senin 83 baytlık çözümü için, değiştirerek 3 bayt kesebilir -10için ~9ve son bit etrafında anahtarlama +(0<n%100!=12)-(n%100!=11), ama bu yeni çözümün daha uzun hâlâ burada.
xnor


@xnor Bu gerçekten zekice! min(n%100,13)%12/~9Jelly cevabım için de denediğim bir yaklaşımda yardımcı olabilir.
Dennis

Aslında, şeyleri sabit kodlu bir sabite sokmak daha kısa çıkıyor.
xnor

@xnor Tekrar teşekkürler!
Dennis

8

Perl 5 -p , 53 bayt

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

Çevrimiçi deneyin!

Nasıl

-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 , 112108 bayt

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

Çevrimiçi deneyin!

-4 bayt, Shaggy sayesinde


2
Ayrıca, [2]*7parçanız başarısız olacaktır 17, çünkü bu 2 ( sev-en-teen) yerine 3 olmalıdır .
Kevin Cruijssen

2
17 için bir düzeltme de dahil olmak üzere -4 bayt
Shaggy

@Shaggy Thanks :)
TFeld

@KevinCruijssen Şimdi düzeltildi (Shaggy sayesinde)
TFeld


6

Wolfram Dil 101 115 Bayt

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

açıklama

(ikame StringSplit için s)

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

IntegerNamesayıyı Amerikan İngilizcesinde gösterir (örneğin, 100'den büyük sayılara "ve" dahil edilmez) 777-> "seven hundred seventy-seven.

StringSplit[IntegerName@#,"-"] oluşturmadaki tüm tireleri kaldırır.

StringSplit/@ görüntüyü kelimelere böler.

Join@@ gömülü liste olmadan basit bir kelime listesi bırakır (kısa çizgi göründüğünde).

WordData[#,"Hyphenation"] hecelerine tek bir kelime ayırır.

Join@@ kelimelerin tümünde basit bir hece listesi bırakır.

Length heceleri sayar

+Boole[#>100&&#~Mod~100!=0]1100'ün üzerindeki katlar hariç, 100'den büyük olan sayılar için (İngiliz İngilizcesi renderinde kullanılan ek "ve" nedeniyle) hece sayısına ekler .


6

Java 11, 105 102 bayt

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

Bir sürü yazdırılamayan karakter içeriyor.

-3 bytes teşekkürler @ OlivierGrégoire .

Çevrimiçi deneyin.

Açıklama:


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 bayt değiştirerek .split("7",-1)için .split("7",9)ve -6+(n>99?4:0)için -(n>99?2:6).
Olivier Grégoire

1
@ OlivierGrégoire Teşekkürler. Tamamen özledim -(n>99?2:6), ama şimdi o kadar açık ki, işaret ettiniz. Ve -1hiç 9ben teşekkür yüzden, düşünce olmazdı sınırlı girdi-büyüklüğü nedeniyle!
Kevin Cruijssen

5

05AB1E , 34 31 bayt

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

Çevrimiçi deneyin veya tüm [1,999]test senaryolarını doğrulayın .

Açıklama:

Bahsedilen tüm kontrollerle, doğruluk için 1 ve falsey için 0 ile sonuçlanacaktır.

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

Bu 700 test senaryosunu geçemez. 'Yedi Yüz' 4 heceye sahiptir, bu 5 döndürür.
AJFaraday

@AJFaraday Şimdi düzeltilmelidir. +1 için 20'den büyük olup olmadığını kontrol ederken yanlışlıkla (giriş modu 100 I) yerine (giriş) vardı . Xty
Kevin Cruijssen

Çok üzgünüm, 'yüz' için 0 döndürür
AJFaraday

@AJFaraday Tekrar sabitlendi .. >(girişin 100'den büyük olup olmadığını kontrol edin) ile değiştirildi @(girişin 100'den büyük veya ona eşit olup olmadığını kontrol edin). Belki de göndermeden önce kendimi biraz daha test vakası kontrol etmeliydim .. Üzgünüm ..
Kevin Cruijssen

4
Bu arada, silindir şapka bir rubix küp üzerinde sevgi dolu!
AJFaraday

5

Kömür , 39 31 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Açıklama:

I⁻⁺

Hecelerin sayısında yapılan ayarlamaları hesaplayın ve sonucu bir dize olarak çıktılayın.

↨E謬Iι²

Sıfır olmayan her basamağı 1 olarak değiştirerek ve ardından temel 2 olarak kod çözerek başlayın. Bu, çoğu giriş için doğru cevabı verir.

№θ7

Her biri için 1 ekleyin 7.

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

Değişmez dizeyi alın 10000000001021111111ve 80 sıfır ekleyin, ardından girdiye göre döngüsel olarak dizin oluşturun ve bu basamağı çıkarın.


4

Jöle , 28 25 23 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır

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 bayt

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

Çevrimiçi deneyin!

Kevin Cruijssen'in çözümünün bir limanı (ne yazık ki PHP'de aynı kısalığa sahip değil :))

- 32 45 Shaggy sayesinde!

Kevin Crujissen'e -3 teşekkürler!


Yani birçok tasarruf burada yapılacak! İşte çok hızlı olanlar
Shaggy

1
145 bayt . Kısa etiketleri kullanarak birkaç bayt daha kaydedebilirsiniz, ancak bunları TIO'da nasıl kullanacağımı hatırlayamıyorum. (Not: Telefonumdayım, bu yüzden tüm girişleri test etmedim.)
Shaggy

1
@Shaggy 2 bayt daha kullanıldığında değiştirilebilir >99ve >19yerine >=100ve >=20.
Kevin Cruijssen

1
@KevinCruijssen aslında 3 bayt tasarruf ediyor çünkü 100'den 99'a gidiyor :)
NK1406

Ayrıca, değişkeni yankının başına yerleştirerek başka bir bayt kaydetmeyi başardım.
NK1406

2

05AB1E , 24 bayt

Dennis Limanı'nın jöle cevabı

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

Çevrimiçi deneyin! veya Test takımı olarak

açıklama

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 bayt

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

Port @Neil'in Kömür cevabı , bu yüzden bu yanıtı beğendiyseniz de onu oyladığınızdan emin olun!

Çevrimiçi deneyin veya tüm test senaryolarını doğrulayın .

Sıkıştırılmış tam sayı •Ž¢Γ}Þ±6u•alternatif olarak•8JA•b2TÌǝ aynı bayt sayımı için olabilir.

Açıklama:

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

Neden •Ž¢Γ}Þ±6u•olduğunu anlamak için bu 05AB1E cevabım ( Büyük tamsayılar nasıl sıkıştırılır? ) Bölümüne bakınız10000000001021111111 .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.