Traduci i numeri in francese


46

I francesi spiegano i numeri in un modo peculiare.

  • 1-16 sono "normali"
  • 17-19 sono indicati 10 + 7. 10 + 8, 10 + 9 .
  • 20-69 sono "normali" (OK, OK! Non proprio, ma sono in questa sfida)
  • 70-79 sono 60 + 10, 60 + 11 ... 60 + 10 + 7, 60 + 10 + 8, 60 + 10 + 9 .
  • 80-99 sono 4 * 20, 4 * 20 + 1, 4 * 20 + 2 ... 4 * 20 + 16, 4 * 20 + 10 + 7, 4 * 20 + 10 + 8, 4 * 20 + 10 + 9

Sfida:

Prendi un numero intero positivo nell'intervallo [1.100] e invialo in "modo francese". È necessario emetterlo esattamente come mostrato di seguito, con *e +, così 97è 4*20+10+7, non [4 20 10 7]o qualcos'altro.

Casi test:

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
Ogni lingua che conosco ha una transizione nei "ragazzi", come quello da 16a 10+7sopra. (In inglese succede tra 12e 10+3, con un po 'più di mascheramento morfologico.) Sono sempre stato un po' sopravvalutato dal fatto che lingue diverse effettuano questa transizione a numeri diversi.
Greg Martin,

25
Perché "vingt-deux" dovrebbe essere 22quando "dix-huit" è 10+8?
Tito

11
Fortunatamente, questo è un sito di puzzle di programmazione e non un sito di curiosità linguistiche. Altrimenti le persone potrebbero infastidirsi quando OP commette errori sciocchi. Accidenti!
Stewie Griffin,

4
@StewieGriffin La gente si arrabbiava ancora.
Leaky Nun,

2
Come francese lo trovo abbastanza bene: D.
Walfrat,

Risposte:


13

Excel, 153 149 byte

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

Sono sicuro che questo potrebbe essere migliore, ho faticato a trovare un modo efficiente per rappresentare l'80.

modifica: consolidati meglio i casi "normali" per salvare 4 byte. # 80 fa ancora schifo.

Non riesco a trovare una risposta specifica qui, non sono sicuro delle regole di code-golf tbh. Posso usare più celle in Excel e aggiungere il conteggio dei byte di ciascuna?

vale a dire. Per un input nella cella A1

A2: 11 byte

=MOD(A1,20)

A3 (risultato): 125 byte

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

Per un totale di 136?


Penso che dovrebbe essere consentito scrivere codice in più celle. IMHO è come avere variabili o funzioni intermedie in altri linguaggi di programmazione.
pajonk,

Sento che dovrebbe esserci un po 'di penalità nell'uso di più celle, proprio come c'è una penalità nell'uso di funzioni in altre lingue (quella di digitare la caldaia per dichiarare la funzione). Forse la codifica più supportata (ovvero CSV), quindi il numero necessario di virgole e (se richiesto) virgolette?
Muzer,

Non sono a conoscenza di alcun formato in cui i file Excel possano essere salvati con un output riconoscibile. I file CSV non supportano per impostazione predefinita funzioni come queste e interrompono qualsiasi funzione che utilizza una virgola. Se salvato come testo puro in una colonna con una nuova riga tra le celle, potrebbe essere copiato direttamente in Excel e funzione. In questo caso, verrà aggiunto 1 byte per ogni cella aggiuntiva.
qoou,

Salva un byte convertendolo IF(A1=80,,IF(MOD(A1,20)>16,"+10+"&MOD(A1,20)-10,"+"&MOD(A1,20)))inIFS(A1=80,,MOD(A1,20)>16,"+10+"&MOD(A1,20)-10,1,"+"&MOD(A1,20))
Greedo il

In Libreoffice calc, puoi saltare )alla fine, puoi fare lo stesso in Excel? Quindi puoi salvare 5 "byte" (ci sono davvero UCS2-Chars, quindi se dici Byte == ottetto, devi contarlo due volte). E devi cambiare ,in;
12431234123412341234123

8

Retina , 52 48 byte

4 byte salvati grazie a Neil

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

Provalo online! o verifica tutti gli input (forniti da Neil)

Spiegazione

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

Per prima cosa gestiamo la traduzione di 70, 80 e 90. In queste prime 3 fasi, un 7 all'inizio con un altro personaggio successivo viene sostituito da 60+1. Allo stesso modo, 9viene sostituito da 81e 8da 4*20+1. La sostituzione di 9sta essenzialmente cambiandola in "ottantacinque" e simili, in modo che 8venga quindi gestita dalla sostituzione successiva, che consente di risparmiare byte sulla scrittura 4*20+1due volte.

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

Questo gestisce i casi di 17, 18e 19, sostituendo 1in ciascuno con 10+.

\+0

Alla fine, non dovrebbe mai esserci un +0alla fine, quindi eliminalo se è lì.


Sicuramente invece, se guardi dietro e guardi dietro puoi usare i gruppi di cattura
Downgoat,

Non funziona 7-9, ma non credo che tu abbia bisogno di quello sguardo dietro: provalo online!
Neil,

@Neil mi sono reso conto che mentre ero via: P Ma grazie per la nuova versione!
Business Cat,

@Downgoat Potrei sostituire il lookahead con un gruppo di acquisizione ma non risparmierebbe alcun byte poiché $1è lungo quanto ?=.
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'

Versione bonus che stampa i numeri man mano che vengono scritti per altri 2 byte:

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
fallisce per molti input; in realtà funziona solo per 1..20, 30, 40, 50, 60, 80 e 100.
Titus

@Titus Penso che tu abbia frainteso la maggior parte delle uscite. 23, per esempio, dovrebbe produrre 23, no 20+3.
ETHproductions

Salva due byte con(m=n%20)
Titus

@Titus Grazie, ma l'ho già provato e non funziona su 70-99 perché mviene ripristinato 0nella f(n-n%20)chiamata. (È una variabile globale)
ETHproductions

È possibile salvare un byte cambiando n<70|n>99in n%100<70. Inoltre, potresti aggiungere un compilatore di test?
Kevin Cruijssen,

5

R, 110 byte

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)

Prova (i-r)/10invece di floor(i/10). E i>15dovrebbe essere i>16.
Tito

5

PHP, 99 byte (voglio essere una versione felice)

un porto diritto di ETHproductions´S , 4 byte golfizzati. Stampa i numeri come richiesto dall'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;}

abbattersi

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

Voglio avere la versione giusta, 114 98 byte

nuovo approccio ispirato da ETHproductions , stampa i numeri così come sono effettivamente indicati.

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

provalo online .

abbattersi

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

Lotto, 220 217 byte

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

Accetta input su STDIN. La generazione e la rimozione del +comando principale consente di risparmiare 1 byte sull'involucro speciale 80. Modifica: 3 byte salvati grazie a @ ConorO'Brien.


Puoi salvare 3 byte rimuovendo @echo offe aggiungendo il prefisso a tutte le istruzioni ad eccezione dell'istruzione hte loop con@
Conor O'Brien,

@ ConorO'Brien Huh, mi chiedo perché mi sono dimenticato di farlo questa volta ...
Neil

2

Gelatina , 55 byte

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

Provalo online! o vedere una suite di test

Senza dubbio c'è un modo più breve!

Come?

+ - 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 byte

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

Provalo online!

Grazie a Leaky Nun per un miglioramento di 5 byte!

Spiegazione:

                     | 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
Leaky Nun,

@]b}17 19}b}17 19
Leaky Nun,

+"10+"ebj\+,Teb
Leaky Nun,

@LeakyNun Grazie per l'aiuto con il golf! Ho apportato le modifiche che hai suggerito.
K Zhang,

1

Python3, 127 byte

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]

Ogni elemento dell'array contiene la sua rappresentazione:

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

Il codice in realtà non crea una funzione, ma solo un array - non so se sia permesso. Altrimenti, dovrei fare questo 139 byte aggiungendo f=[...].__getitem__.


Benvenuti in PPCG! Credo che ci sia stata una discussione sulla meta relativa all'invio di array come mapping da numeri interi a oggetti, ma al momento non riesco a trovarlo. Ti farò sapere se lo faccio (e quale sia stato il risultato di quella discussione). Ad ogni modo, non sarà necessario f=, perché le funzioni senza nome (ovvero le espressioni che valutano la funzione inviata) vanno bene a meno che il nome non sia necessario per qualcosa come la ricorsione.
Martin Ender,

Non esiste un chiaro consenso, ma la risposta marginalmente più votata suggerisce di consentire la soluzione.
Martin Ender,

0

Java 7, 97 96 109 byte

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 byte per la correzione di bug 80.. :(

Spiegazione:

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

Codice di prova:

Provalo qui.

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));
    }
  }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.