数字をフランス語に翻訳する


46

フランス人は独特の方法で数字綴ります。

  • 1-16は「正常」です
  • 17〜1910 + 7と表記されます。10 + 8、10 + 9
  • 20-69は「正常」です(OK、OK!それほどではありませんが、このチャレンジに参加しています)
  • 70-7960 + 10、60 + 11 ... 60 + 10 + 7、60 + 10 + 8、60 + 10 + 9です。
  • 80-994 * 20、4 * 20 + 1、4 * 20 + 2 ... 4 * 20 + 16、4 * 20 + 10 + 7、4 * 20 + 10 + 8、4 * 20 + 10 +です9

チャレンジ:

[1,100]の範囲の正の整数を取り、それを「フレンチウェイ」で出力します。あなたは、出力、それはまさにそれがと、以下のようだとしてしなければならない*+そう、974*20+10+7はない、[4 20 10 7]または何か他のもの。

テストケース:

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
私が知っているすべての言語は、上記のような「10代」に移行し16てい10+7ます。(英語では、12との間に10+3少し形態学的な変装があります。)私はいつも、異なる言語が異なる数でその移行を行うという事実に少し過剰に取りつかれています。
グレッグマーティン

25
22"dix-huit"が"vingt-deux"であるのは10+8なぜですか?
タイタス

11
幸いなことに、これはプログラミングパズルサイトであり、言語に関する雑学サイトではありません。そうしないと、OPが愚かな間違いを犯したときに人々がイライラする可能性があります。ふう!
スティーヴィーグリフィン

4
@StewieGriffin人々はいらいらしました。
リーキー修道女

2
フランス人として私はそれを非常にうまく見つけます:D。
ウォルフラット

回答:


13

Excel、153 149バイト

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

私はこれがより良いと確信している、私は#80を説明する効率的な方法を見つけることに苦労した。

編集:「通常」のケースを統合して、4バイトを節約しました。#80はまだ嫌です。

ここで具体的な答えを見つけることができません。code-golftbhのルールがわかりません。Excelで複数のセルを使用し、それぞれのバイトカウントを追加できますか?

すなわち。セルA1の入力用

A2:11バイト

=MOD(A1,20)

A3(結果):125バイト

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

合計136人ですか?


複数のセルにコードを書くことは許されるべきだと思います。私見は、他のプログラミング言語で中間変数または関数を持っているようなものです。
パジョン

他の言語の関数を使用することのペナルティがあるのと同じように、複数のセルを使用することのペナルティがあるべきだと感じています(関数を宣言するために定型句を入力することのペナルティ)。おそらく、最もサポートされているエンコード(CSV)が必要なので、必要な数のコンマと(必要な場合)引用符は必要ですか?
ミューザー

認識可能な出力でExcelファイルを保存できる形式を知りません。CSVファイルは、デフォルトではこれらのような機能をサポートしておらず、コンマを使用する機能をすべて分割します。セル間に新しい行がある1つの列に純粋なテキストとして保存された場合、Excelおよび関数に直接コピーできます。この場合、追加のセルごとに1バイトが追加されます。
-qoou

に変換IF(A1=80,,IF(MOD(A1,20)>16,"+10+"&MOD(A1,20)-10,"+"&MOD(A1,20)))してバイトを保存IFS(A1=80,,MOD(A1,20)>16,"+10+"&MOD(A1,20)-10,1,"+"&MOD(A1,20))
-Greedo

Libreoffice calcでは)、最後にスキップできますが、Excelでも同じことができますか?したがって、5つの「バイト」を節約できます(実際にはUCS2-Charsがあるため、Byte == octetと言う場合は、2倍にカウントする必要があります)。そして、あなたは変更しなければならない,;
12431234123412341234123

8

網膜52 48バイト

Neilのおかげで4バイト節約

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

オンラインでお試しください!または、すべての入力を検証します(Neilが提供)

説明

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

最初に、70、80、および90の翻訳を処理します。これらの最初の3段階では、先頭に7が続き、それに続く別の文字がに​​置き換えられ60+1ます。同様に、9置き換えられている81、と84*20+1。の置換9は基本的に「80」などに変更されるため8、次の置換で処理され、4*20+12回の書き込みでバイトを節約できます。

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

これは、ハンドル例1718および19、置換することにより、1各中10+

\+0

最後に、最後にaが存在することはないので、存在+0する場合は削除します。


代わりに、
後ろを

では機能しませ7-9んが、その裏を必要とは思わない:オンラインで試してみてください!
ニール

@Neil私は、私がいなくなったときに気づいた:Pしかし、新しいバージョンをありがとう!
ビジネス猫

@Downgoat先読みをキャプチャグループに置き換えることはできますが、$1と同じ長さなのでバイトを保存しません?=
ビジネス猫


7

JavaScript(ES6)、73 71バイト

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'

実際に余分な2バイトのスペルで数字が表示されるボーナスバージョン:

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
多くの入力に対して失敗します。実際には、1..20、30、40、50、60、80、および100でのみ機能します。-
タイタス

@Titus出力のほとんどを誤解していると思います。23、例えば、23ではなくを出力することになってい20+3ます。
-ETHproductions

2つのバイト保存(m=n%20)
タイタス

@Titusおかげで、私はすでにので、それは70-99で仕事をしないこと、および試さmにリセットを取得0f(n-n%20)のコール。(これはグローバル変数です)
-ETHproductions

に変更n<70|n>99すると、バイトを保存できますn%100<70。また、テストコンパイラを追加できますか?
ケビンCruijssen

5

R、110バイト

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)

(i-r)/10代わりに試してくださいfloor(i/10)。とするi>15必要がありますi>16
タイタス

5

PHP、99バイト(幸せなバージョンになりたい)

ETHproductionsのJSのストレートポート、4バイトのゴルフ。OPの要求に従って番号を出力します。

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

壊す

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

私は正しいバージョンになりたい、114 98バイト

ETHproductionsに触発された新しいアプローチは、実際に綴られているとおりに数字を出力します。

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

オンラインで試してください

壊す

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

バッチ、220 217バイト

@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で入力を受け取ります。先行+を生成して削除すると、特別なケース80に比べて1バイト節約されます。編集:@ ConorO'Brienのおかげで3バイト節約されました。


あなたは除去することにより、3つのバイトを保存することができ@echo offて敬遠しがちループ文を除くすべてのステートメントをし、接頭辞@
コナー・オブライエン

@ ConorO'Brien Huh、なぜ私が今回それをするのを忘れたのだろう...-
ニール

2

ゼリー、55 バイト

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

オンラインでお試しください!またはテストスイートを見る

間違いなく、もっと短い方法があります!

どうやって?

+ - 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バイト

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

オンラインでテストしてください!

5バイト改善されたLeaky Nunに感謝します!

説明:

                     | 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
リーキー修道女

@]b}17 19}b}17 19
リーキー修道女

+"10+"ebj\+,Teb
リーキー修道女

@LeakyNunゴルフの助けてくれてありがとう!あなたが提案した変更を加えました。
Kチャン

1

Python3、127バイト

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]

各配列要素には、その表現が含まれます。

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

コードは実際には関数を作成するのではなく、配列を作成するだけです。それが許可されているかどうかはわかりません。それ以外の場合は、を追加してこの139バイトを作成する必要がありますf=[...].__getitem__


PPCGへようこそ!整数からオブジェクトへのマッピングとして配列を送信することについてメタに関する議論があった思いますが、現時点ではそれを見つけることができないようです。私が行うかどうか(およびその議論の結果は何だったか)をお知らせします。どちらの場合でも、f=名前のない関数(つまり、送信された関数に評価される式)は、再帰のようなものに名前が必要な場合を除き、必要ありません。
マーティンエンダー

明確なコンセンサスはありませんが、わずかに上位投票された答えは、ソリューションを許可することを示唆しています。
マーティンエンダー

0

Javaの7、97の 96 109バイト

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

バグ修正の場合は+13バイト80.. :(

説明:

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

テストコード:

ここで試してみてください。

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));
    }
  }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.