Numaraları Fransızcaya çevir


46

Fransızlar sayıları tuhaf bir şekilde heceledi .

  • 1-16 "normal" dir
  • 17-19 , 10 + 7 yazıldığından . 10 + 8, 10 + 9 .
  • 20-69 "normal" dir (Tamam, tamam! Pek sayılmaz, ama bu zorluktalar)
  • 70-79 , 60 + 10, 60 + 11 ... 60 + 10 + 7, 60 + 10 + 8, 60 + 10 + 9'dur .
  • 80-99 olan x 20 4, 4 x 20 + 1, 4 x 20 + 2 ... * 20 + 16 4, 4 x 20 + 10 + 7, 4 x 20 + 8 ila 10, 4 x 20 + 10 + 9

Meydan okuma:

[1,100] aralığında pozitif bir tamsayı alın ve "Fransızca yol" çıktısını alın. Sen çıkış aynen onunla, aşağıda gösterildiği şekilde olmalıdır *ve +bu nedenle, 97bir 4*20+10+7değil, [4 20 10 7]veya başka bir şey.

Test durumları:

1  - 1
.. - ..
16 - 16
17 - 10+7
18 - 10+8
19 - 10+9
20 - 20
21 - 21
.. - ..
69 - 69
70 - 60+10
71 - 60+11
72 - 60+12
77 - 60+10+7
78 - 60+10+8
79 - 60+10+9
80 - 4*20
81 - 4*20+1
82 - 4*20+2
.. - ..
90 - 4*20+10
91 - 4*20+11
96 - 4*20+16
97 - 4*20+10+7
98 - 4*20+10+8
99 - 4*20+10+9
100 - 100

14
Bildiğim her dil den biri gibi "gençler" bir geçiş vardır 16için 10+7yukarıda. (İngilizce'de , biraz daha morfolojik kılıkla 12ve arasında olur 10+3.) Farklı dillerin farklı sayılarla bu geçişi gerçekleştirdiği gerçeği ile her zaman biraz zorlandım.
Greg Martin

25
Neden "vingt-deux" 22"dix-huit" olduğu zaman olsun 10+8?
Titus,

11
Neyse ki, bu bir programlama bulmaca sitesidir ve dilsel bir trivia sitesi değildir. Aksi taktirde, OP aptalca hatalar yaptığında insanlar sinirlenebilir. Uf!
Stewie Griffin

4
@StewieGriffin İnsanlar hala sinirlendi.
Leaky Nun

2
Bir fransız olarak oldukça iyi buluyorum: D.
Walfrat

Yanıtlar:


13

Excel, 153 149 Bayt

=IF(OR(A1<17,A1>99,AND(A1>19,A1<70)),A1,IF(A1<20,"10+"&A1-10,IF(A1<80,"60","4*20")&IF(A1=80,,IF(MOD(A1,20)>16,"+10+"&MOD(A1,20)-10,"+"&MOD(A1,20)))))

Bunun daha iyi olacağından eminim, # 80 için hesap vermenin etkili bir yolunu bulmakta zorlandım.

düzenleme: 'Normal' durumlarda 4 bayt kaydetmek daha iyi konsolide. # 80 hala berbat.

Burada özel bir cevap bulamıyorum, kod-golf tbh kurallarından emin değilim. Excel'de birden fazla hücre kullanabilir miyim ve her birinin bayt sayısını ekleyebilir miyim?

yani. A1 hücresindeki bir giriş için

A2: 11 Bayt

=MOD(A1,20)

A3 (sonuç): 125 Bayt

=IF(OR(A1<17,A1>99,AND(A1>19,A1<70)),A1,IF(A1<20,"10+"&A1-10,IF(A1<80,"60","4*20")&IF(A1=80,,IF(A2>16,"+10+"&A2-10,"+"&A2))))

Toplam 136 kişi için mi?


Birden çok hücreye kod yazmasına izin verilmesi gerektiğini düşünüyorum. IMHO, diğer programlama dillerinde ara değişkenlere veya fonksiyonlara sahip olmak gibidir.
pajonk

Birden çok hücreyi kullanmanın bir cezası olması gerektiğini düşünüyorum, tıpkı diğer dillerde (kullanım ilan etmek için kazan plakasını yazmaktan başka bir deyişle, işlevleri kullanma) cezası olması gibi. Muhtemelen en ters kodlama destekli kodlama (yani CSV), bu nedenle gerekli virgül ve (gerekirse) tırnak sayısı?
Muzer

Dosyaların tanınabilir bir çıktı ile kaydedilebildiği herhangi bir formatın farkında değilim. CSV dosyaları, varsayılan olarak, bu gibi işlevleri desteklemez ve virgül kullanan tüm işlevleri kırar. Hücreler arasında yeni bir satırla tek bir sütunda saf metin olarak kaydedilmişse, doğrudan excel ve fonksiyona kopyalanabilir. Bu durumda, her ek hücre için 1 bayt eklenecektir.
qoou

Dönüştürerek bir byte tasarruf IF(A1=80,,IF(MOD(A1,20)>16,"+10+"&MOD(A1,20)-10,"+"&MOD(A1,20)))etmekIFS(A1=80,,MOD(A1,20)>16,"+10+"&MOD(A1,20)-10,1,"+"&MOD(A1,20))
Greedo

Libreoffice calc, )sonunda atlayabilirsiniz, excel aynı şeyi yapabilirsiniz? Yani 5 "bayt" kaydedebilirsiniz (gerçekten UCS2-Chars vardır, bu yüzden Byte == octet diyorsan, bunu iki katına çıkarmalısın). Ve değiştirmelisiniz ,içinde;
12431234123412341234123

8

Retina , 52 48 bayt

Neil sayesinde 4 bayt kurtarıldı

^7\B
60+1
^9\B
81
^8\B
4*20+
1(?=7|8|9)
10+
\+0

Çevrimiçi deneyin! veya tüm girdileri doğrulayın (Neil tarafından sağlanan)

açıklama

^7\B
60+1
^9\B
81
^8\B
4*20+

İlk önce 70, 80 ve 90'ın çevirisini ele alıyoruz. Bu ilk 3 aşamada, başlangıçta bir karakterin ardından başındaki 7 60+1. Benzer bir şekilde, 9ile ikame edilir 81, ve 8ile 4*20+1. Bunun değiştirilmesi 9esasen onu "seksen-on" olarak değiştirmektir, ve böylece bir 8sonraki değiştirme tarafından gerçekleştirilir, bu da baytları 4*20+1iki kez yazarken saklar.

1(?=7|8|9)
10+

Bu durumlarını ele 17, 18ve 19değiştirerek, 1her yer 10+.

\+0

Sonunda, +0sonunda asla bir olmamalıdır , öyleyse silin.


Kuşkusuz,
seyircilere

İşe yaramıyor 7-9, ama şu göze ihtiyacın olduğunu sanmıyorum: Çevrimiçi dene!
Neil

@Neil Ben yokken farkettim: P Ama yeni sürüm için teşekkürler!
Business Cat

Bir yakalama grubuyla lookahead yerini ama olabilir @Downgoat değil herhangi bayt tasarrufu beri olur $1sadece sürece ?=.
Business Cat


7

JavaScript (ES6), 73 71 bayt

f=n=>n>16&n<20?'10+'+n%10:n<70|n>99?n:n%20?f(n-n%20)+'+'+f(n%20):'4*20'

Sayıları gerçekte fazladan 2 bayt için yazıldığından yazdıran bonus sürümü:

f=n=>n<17|n>99?n:n<20?'10+'+n%10:n%20?f(n-n%20)+'+'+f(n%20):n-80?n:'4*20'

1
çok sayıda giriş için başarısız; Aslında sadece 1..20, 30, 40, 50, 60, 80 ve 100 için çalışıyor.
Titus

@Titus, çıktıların çoğunu yanlış anladığınızı düşünüyorum. 23Örneğin, çıkış gerekiyordu 23, değil 20+3.
ETHproductions

İki byte ile kaydet(m=n%20)
Titus

@Titus Teşekkürler ama zaten denemiştim ve çünkü 70-99 üzerinde çalışmaya değil miçin sıfırlama alır 0içinde f(n-n%20)çağrı. (Bu küresel bir değişkendir)
ETHproductions

Sen değiştirerek byte kaydedebilirsiniz n<70|n>99için n%100<70. Ayrıca, bir test derleyicisi ekleyebilir misiniz?
Kevin Cruijssen

5

R, 110 bayt

i=scan()
r=i%%10;paste0(ifelse(i>16&i<20,"10+",ifelse(i>69&i<80,"60+10+",ifelse(i>16&i<20,"4*20+",i-r/10))),r)

Deneyin (i-r)/10yerine floor(i/10). Ve i>15olmalı i>16.
Titus

5

PHP, 99 bayt (Mutlu sürüm olmak istiyorum)

ETHproductions'un JS limanı , 4 byte golf oynadı. OP tarafından istenen numaraları yazdırır.

function f($n){return$n<17|$n>19?$n>60&$n<100?($m=$n%20)?f($n-$m)."+".f($m):'4*20':$n:"10+".$n%10;}

Yıkmak

function f($n){return
    $n<17|$n>19
        ?$n>69&$n<100
            ?($m=$n%20)
                ?f($n-$m)."+".f($m) # 70..79, 81..99
                :'4*20'             # 80
            :$n                     # 1..16, 20..69
        :"10+".$n%10                # 17..19
    ;
}

Doğru sürüm olmak istiyorum, 114 98 bayt

ETHproductions'ten ilham alan yeni yaklaşım , sayıları gerçekte yazıldığından yazdırıyor.

function f($n){return$n>16&$n<100?$n-80?($m=$n%($n>60?20:10))?f($n-$m)."+".f($m):$n-$m:'4*20':$n;}

çevrimiçi deneyin .

Yıkmak

function f($n){return
    $n>16&$n<100
        ?$n-80
            ?($m=$n%($n>60?20:10))
                ?f($n-$m)."+".f($m) # $n%$m>0
                :$n-$m              # 10,20,30,40,50,60
            :'4*20'                 # 80
        :$n                         # 1..16, 100
;}


3

Toplu, 220 217 bayt

@set/pn=
@set s=
@if %n% gtr 99 goto g
@if %n% gtr 79 set s=+4*20&set/an-=80
@if %n% gtr 69 set s=+60&set/an-=60
@if %n% gtr 16 if %n% lss 20 set s=%s%+10&set/an-=10
:g
@if %n% gtr 0 set s=%s%+%n%
@echo %s:~1%

STDIN'de girişi ele alır. Öncü oluşturma ve çıkarma işlemi, +özel kasa 80'e göre 1 bayt kazandırır. Düzenleme: @ ConorO'Brien sayesinde 3 bayt kaydedildi.


@echo offHte loop ifadesi dışındaki tüm ifadeleri kaldırarak ve önek ekleyerek 3 byte kazanabilirsiniz@
Conor O'Brien

@ ConorO'Brien Huh, bu sefer neden yapmayı unuttuğumu merak ediyorum ...
Neil

2

Jöle , 55 bayt

⁹
’,ṃ60Ṁ€
⁹%80“4*20”,
Dj⁾0+µ¹e?“×ØŒ‘
%ȷ2:“FP‘S‘ŀḟ0Ç€j”+

Çevrimiçi deneyin! veya bir test odasına bakın

Hiç şüphesiz daha kısa bir yol var!

Nasıl?

+ - Link 1, helper for 1-69&100: number s=0, number n
⁹ - link's right argument, n

’,ṃ60Ṁ€ - Link 2, helper for 70-79: number s=1, number n
’       - decrement s -> 0
 ,      - pair -> [0,n]
  ṃ60   - base decompress (vectorises) using [1,2,...60]  effectively -> [60,[1,n%60]]
     Ṁ€ - maximum for €ach effectively -> [60,n%60]

⁹%80“4*20”, - Link 3, helper for 80-99: number s=2, number n
⁹           - link's right argument, n
 %80        - mod 80
    “4*20”  - literal ['4','*','2','0']
          , - pair -> [['4','*','2','0'],n]

Dj⁾0+µ¹e?“×ØŒ‘ - Link 4, reformat 17-19: element v (may be char list or number)
        ?      - if
       e       - v exists in
         “×ØŒ‘ - literal [17,18,19]
               - then:
D              -   convert to decimal list  e.g. [1,7]
  ⁾0+          -   literal ['0','+']
 j             -   join                          [1,'0','+',7]
     µ         - else:
      ¹        -   identity, v

%ȷ2:“FP‘S‘ŀḟ0Ç€j”+ - Main link: number n in [1,100]
 ȷ2                - literal 100
%                  - mod (convert 100 to 0)
    “FP‘           - literal [70,80]
   :               - integer division (vectorises)
        S          - sum (0 for 1-69&100; 1 for 70-79; 2 for 80-99)
         ‘         - increment (...1, 2 or 3)
          ŀ        - call link at index (1, 2 or 3) as a dyad(sum, n)
           ḟ0      - filter out zeros (remove 0 from 4*20+0)
             ǀ    - call the last link (4) as a monad for each
                ”+ - literal '+'
               j   - join

2

Pyth, 61 56 bayt

L?}b}17 19++T\+eb|bk?}/QTr6T.s+?<Q80"60+""4*20+"y%Q20\+y

Çevrimiçi test edin!

5 baytlık bir gelişme için Leaky Nun'a teşekkürler!

Açıklama:

                     | Implicit: Q=eval(input())
L                    | Define y(b):
 ?}b}17 19           |  If b is in the inclusive range from 17 to 19:
          ++T\+eb    |   Return "10+" + (last digit of b)
                 |b  |  Else: if b!=0: return b
                   k |   Else: return an empty string (Leaves a trailing '+' for case 80)
_____________________|________________
?}/QTr6T                              | If 70<=Q<100:
          +                           |  Concatenate the next two expressions:
           ?<Q80                      |   If Q<80:
                "60+"                 |    Evaluate to "60+"
                     "4*20+"          |    Else: Evaluate to "4*20+"
                            y%Q20     |   y(Q%20)
        .s                       \+   |  Strip off trailing '+', if present (for case 80)
                                   y  | Else: return y(Q)
                                   (Q)| Trailing Q is implicitly added

*-Q100>Q69}/QTr6T
Sızdıran Rahibe

@]b}17 19}b}17 19
Sızdıran Rahibe

+"10+"ebj\+,Teb
Sızdıran Rahibe

@LeakyNun Golf ile ilgili yardımınız için teşekkürler! Önerdiğin değişiklikleri yaptım.
K Zhang

1

Python3, 127 bayt

m,r=map,range;l=[*r(1,17),*m("10+{}".format,(7,8,9))];f=[0,*l,*r(20,61),*m("60+{}".format,l),"4*20",*m("4*20+{}".format,l),100]

Her dizi elemanı temsilini içerir:

for i in range(1,101):
    print(i, f[i])

Kod aslında bir işlev oluşturmaz, sadece bir dizi oluşturur - Buna izin verilip verilmediğini bilmiyorum. Aksi takdirde, bu 139 byte'ı ekleyerek yapmak zorunda kalırdım f=[...].__getitem__.


PPCG'ye Hoşgeldiniz! Ben inanıyorum nesnelere tamsayılar gelen eşleştiriciler diziler göndermeyle ilgili meta üzerinde bir tartışma vardı, ama şu an bulmak gibi olamaz. Bunu yaparsam size bildiririm (ve bu tartışmanın sonucunun ne olduğunu). Her iki durumda da, ihtiyacınız olmayacak f=, çünkü adsız işlevler (yani gönderilen işleve değer veren ifadeler), özyineleme gibi bir şey için ad gerekli olmadıkça gayet iyi.
Martin Ender

Net bir fikir birliği yok, ancak marjinal üstteki oylama cevabı çözümünüzü kabul etmenizi öneriyor.
Martin Ender

0

Java 7, 97 96 109 bayt

String c(int i){return i>16&i<20?"10+"+(i-10):i%100<70?i+"":i<80?"60+"+c(i-60):"4*20"+(i<81?"":"+"+c(i-80));}

Hata düzeltme davası için +13 bayt 80.. :(

Açıklama:

String c(int i){      // Method with integer parameter and String return-type
  return i>16&i<20?   //  If 17..19:
    "10+"+(i-10)      //   Return "10+" + `i`-10
   :i%100<70?         //  Else if 1..16; 20..69; 100:
    i+""              //   Return `i`
   :i<80?             //  Else if 70..79:
    "60+"+c(i-60)     //   Return "60+" + recursive-call with `i`-60
   :                  //  Else (80..99):
    "4*20"+           //   Return "4*20" +
     (i<81?           //   If 80:
      ""              //    nothing
     :                //   Else (81..99)
      "+"+c(i-80));   //    recursive-call with `i`-80
}                     // End of method

Test kodu:

Burada dene.

class M{
  static String c(int i){return i>16&i<20?"10+"+(i-10):i%100<70?i+"":i<80?"60+"+c(i-60):"4*20"+(i<81?"":"+"+c(i-80));}

  public static void main(String[] a){
    for (int i = 1; i <= 100; i++) {
      System.out.println(c(i));
    }
  }
}
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.