Zahlen ins Französische übersetzen

46

Die Franzosen buchstabieren Zahlen auf besondere Weise.

  • 1-16 sind "normal"
  • 17-19 sind 10 + 7 buchstabiert . 10 + 8, 10 + 9 .
  • 20-69 sind "normal" (OK, OK! Nicht wirklich, aber sie sind in dieser Herausforderung)
  • 70-79 sind 60 + 10, 60 + 11 ... 60 + 10 + 7, 60 + 10 + 8, 60 + 10 + 9 .
  • 80-99 sind 4 · 20, 4 · 20 + 1, 4 · 20 + 2 ... 4 · 20 + 16, 4 · 20 + 10 + 7, 4 · 20 + 10 + 8, 4 · 20 + 10 + 9

Herausforderung:

Nehmen Sie eine positive ganze Zahl im Bereich [1.100] und geben Sie sie auf die "französische Art" aus. Sie müssen es genau so ausgeben, wie es unten gezeigt ist, mit *und +, so 97ist es 4*20+10+7nicht [4 20 10 7]oder mit etwas anderem.

Testfälle:

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
Stewie Griffin
quelle
14
Jede Sprache , die ich kenne , hat einen Übergang in dem „Teenager“, wie die von 16zu 10+7oben. (Auf Englisch passiert es zwischen 12und 10+3, mit etwas mehr morphologischer Verkleidung.) Ich war immer ein bisschen überfordert von der Tatsache, dass verschiedene Sprachen diesen Übergang in unterschiedlicher Anzahl machen.
Greg Martin
25
Warum sollte "vingt-deux" sein, 22wenn "dix-huit" ist 10+8?
Titus
11
Zum Glück handelt es sich hierbei um eine Programmier-Puzzleseite und keine sprachliche Quizseite. Anderenfalls könnten sich die Leute ärgern, wenn OP dumme Fehler macht. Puh!
Stewie Griffin
4
@StewieGriffin Die Leute haben sich immer noch geärgert.
Undichte Nonne
2
Als Franzose finde ich es ganz gut: D.
Walfrat

Antworten:

13

Excel, 153 149 Bytes

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

Ich bin sicher, das könnte besser sein, ich hatte Mühe, einen effizienten Weg zu finden, um # 80 zu erklären.

edit: Konsolidiert die "Normal" -Fälle besser, um 4 Bytes zu sparen. # 80 ist immer noch beschissen.

Ich kann hier keine konkrete Antwort finden, da ich nicht sicher bin, ob die Regeln von Code-Golf-TBH eingehalten werden. Kann ich in Excel mehrere Zellen verwenden und die Byteanzahl jeder Zelle hinzufügen?

dh Für eine Eingabe in Zelle A1

A2: 11 Bytes

=MOD(A1,20)

A3 (Ergebnis): 125 Bytes

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

Für insgesamt 136?

qoou
quelle
Ich denke, es sollte erlaubt sein, Code in mehrere Zellen zu schreiben. IMHO ist es wie mit Zwischenvariablen oder Funktionen in anderen Programmiersprachen.
Pajonk
Ich bin der Meinung, dass die Verwendung mehrerer Zellen mit einer gewissen Strafe verbunden sein sollte, genau wie die Verwendung von Funktionen in anderen Sprachen (das Eingeben des Boilerplates, um die Funktion zu deklarieren). Vielleicht die am besten unterstützte Codierung (dh CSV), also die notwendige Anzahl von Kommas und (falls erforderlich) Anführungszeichen?
Muzer
Mir ist kein Format bekannt, in dem Excel-Dateien mit einer erkennbaren Ausgabe gespeichert werden können. CSV-Dateien unterstützen solche Funktionen standardmäßig nicht und unterbrechen alle Funktionen, die ein Komma verwenden. Wenn es als reiner Text in einer Spalte mit einer neuen Zeile zwischen den Zellen gespeichert wird, kann es direkt in Excel und Function kopiert werden. In diesem Fall würde 1 Byte für jede zusätzliche Zelle hinzugefügt.
Qoou
Speichern Sie ein Byte durch Umwandlung IF(A1=80,,IF(MOD(A1,20)>16,"+10+"&MOD(A1,20)-10,"+"&MOD(A1,20)))zuIFS(A1=80,,MOD(A1,20)>16,"+10+"&MOD(A1,20)-10,1,"+"&MOD(A1,20))
Greedo
In Libreoffice calc können Sie die )am Ende überspringen , können Sie das gleiche in Excel tun? Sie können also 5 "Bytes" sparen (es gibt wirklich UCS2-Zeichen, wenn Sie also Byte == Oktett sagen, müssen Sie es doppelt zählen). Und Sie müssen die ,in ändern;
12431234123412341234123
8

Netzhaut , 52 48 Bytes

4 Bytes gespart dank Neil

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

Probieren Sie es online! oder überprüfe alle Eingaben (von Neil bereitgestellt)

Erläuterung

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

Zuerst behandeln wir die Übersetzung von 70, 80 und 90. In diesen ersten drei Schritten wird eine 7 am Anfang durch ein anderes Zeichen ersetzt 60+1. Ebenso 9wird ersetzt durch 81und 8durch 4*20+1. Das Ersetzen von 9ändert es im Wesentlichen in "achtzig" und so, dass das 8dann durch das nächste Ersetzen gehandhabt wird, was das 4*20+1zweimalige Schreiben von Bytes erspart .

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

Dies behandelt die Fälle von 17, 18und 19durch Ersetzen von 1in each durch 10+.

\+0

Schließlich sollte es nie ein +0am Ende geben, also löschen Sie es, wenn es da ist.

Geschäfts-Katze
quelle
Sicherlich, stattdessen, wenn Blick hinter die Kulissen und Lookaheads können Sie Fanggruppen verwenden
Downgoat
Funktioniert nicht für 7-9, aber ich glaube nicht, dass Sie diesen Lookbehind brauchen: Probieren Sie es online aus!
Neil
@Neil Mir ist aufgefallen, dass ich weg war: P Aber danke für die neue Version!
Business Cat
@Downgoat Ich könnte das Lookahead durch eine Erfassungsgruppe ersetzen, aber es würde keine Bytes sparen, da $1es genauso lang ist wie ?=.
Business Cat
7

JavaScript (ES6), 73-71 Byte

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'

Bonusversion, die die Zahlen so ausgibt, wie sie tatsächlich geschrieben sind, für zusätzliche 2 Bytes:

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'
ETHproductions
quelle
1
schlägt bei vielen Eingaben fehl; eigentlich funktioniert es nur für 1..20, 30, 40, 50, 60, 80 und 100.
Titus
@Titus Ich glaube, du verstehst die meisten Ausgaben falsch. 23soll zum Beispiel ausgeben 23, nicht 20+3.
ETHproductions
Speichern Sie zwei Bytes mit(m=n%20)
Titus
@Titus Danke, aber das habe ich schon versucht, und es funktioniert nicht auf 70-99, weil mes 0im f(n-n%20)Anruf auf zurückgesetzt wird. (Es ist eine globale Variable)
ETHproductions
Sie können durch Ändern ein Byte speichern n<70|n>99zu n%100<70. Könnten Sie auch einen Test-Compiler hinzufügen?
Kevin Cruijssen
5

R, 110 Bytes

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)
Neil
quelle
Versuchen Sie es (i-r)/10statt floor(i/10). Und i>15sollte sein i>16.
Titus
5

PHP, 99 Bytes (Ich möchte glücklich Version sein)

ein gerader Port von ETHproductions 'JS , 4 Bytes Golf. Druckt die vom OP angeforderten Nummern.

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

Nervenzusammenbruch

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

Ich möchte die richtige Version sein, 114 98 Bytes

Ein neuer Ansatz, der von ETHproductions inspiriert ist , druckt die Zahlen so aus, wie sie buchstabiert wurden.

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

versuche es online .

Nervenzusammenbruch

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
;}
Titus
quelle
4

Python 2, 130 108 Bytes

22 Bytes gespart dank @mathjunkie

f=lambda x:79<x<100and('4*20'+('+'+f(x-80))*(x>80))or 69<x<100and'60+'+f(x-60)or 16<x<20and'10+'+`x-10`or`x`

Probieren Sie es online!

Uriel
quelle
108 Bytes: TIO
Math Junkie
1
Sie müssen zählen, f=weil Sie es im Lambda verwendet haben.
Undichte Nonne
@LeakyNun behoben
Uriel
3

Batch, 220 217 Bytes

@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%

Übernimmt die Eingabe für STDIN. Das Generieren und Entfernen des +Leaders spart 1 Byte gegenüber dem Sondergehäuse 80. Bearbeiten: 3 Byte dank @ ConorO'Brien gespeichert.

Neil
quelle
Sie können 3 Bytes sparen, @echo offindem Sie alle Anweisungen mit Ausnahme der Schleifenanweisung mit@
Conor O'Brien
@ ConorO'Brien Huh, ich frage mich, warum ich diesmal vergessen habe, das zu tun ...
Neil
2

Jelly , 55 Bytes

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

Probieren Sie es online! oder sehen Sie sich eine Testsuite an

Kein Zweifel, es gibt einen kürzeren Weg!

Wie?

+ - 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
Jonathan Allan
quelle
2

Pyth, 61 56 Bytes

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

Online testen!

Vielen Dank an Leaky Nun für eine 5-Byte-Verbesserung!

Erläuterung:

                     | 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
K Zhang
quelle
*-Q100>Q69}/QTr6T
Undichte Nonne
@]b}17 19}b}17 19
Undichte Nonne
+"10+"ebj\+,Teb
Undichte Nonne
@LeakyNun Danke für die Hilfe beim Golfen! Ich habe die von Ihnen vorgeschlagenen Änderungen vorgenommen.
K Zhang
1

Python3, 127 Bytes

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]

Jedes Array-Element enthält seine Darstellung:

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

Der Code erzeugt eigentlich keine Funktion, nur ein Array - ich weiß nicht, ob das erlaubt ist. Ansonsten müsste ich diese 139 Bytes durch Addition machen f=[...].__getitem__.

Emu
quelle
Willkommen bei PPCG! Ich glaube, es gab eine Diskussion über Meta über das Übermitteln von Arrays als Zuordnungen von Ganzzahlen zu Objekten, aber ich kann es im Moment nicht finden. Ich werde Sie wissen lassen, ob ich das tue (und was das Ergebnis dieser Diskussion war). In beiden Fällen ist dies nicht erforderlich f=, da unbenannte Funktionen (dh Ausdrücke, die für die übergebene Funktion ausgewertet werden) in Ordnung sind, es sei denn, der Name wird für so etwas wie eine Rekursion benötigt.
Martin Ender
Es besteht kein eindeutiger Konsens, aber die Antwort mit den wenigsten Stimmen schlägt vor, Ihre Lösung zuzulassen.
Martin Ender
0

Java 7, 97 96 109 Bytes

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 Bytes für Fehlerbehebungsfall 80.. :(

Erläuterung:

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

Testcode:

Probieren Sie es hier aus.

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));
    }
  }
}
Kevin Cruijssen
quelle