Tłumaczenie liczb na język francuski

46

Francuzi zapisują liczby w szczególny sposób.

  • 1-16 są „normalne”
  • 17–19 zostały przeliterowane 10 + 7. 10 + 8, 10 + 9 .
  • 20-69 są „normalne” (OK, OK! Nie bardzo, ale są w tym wyzwaniu)
  • 70-79 to 60 + 10, 60 + 11 ... 60 + 10 + 7, 60 + 10 + 8, 60 + 10 + 9 .
  • 80-99 to 4 * 20, 4 * 20 + 1, 4 * 20 + 2 ... 4 * 20 + 16, 4 * 20 + 10 + 7, 4 * 20 + 10 + 8, 4 * 20 + 10 + 9

Wyzwanie:

Weź dodatnią liczbę całkowitą z zakresu [1100] i wyślij ją „po francusku”. Musisz wyprowadzić go dokładnie tak, jak pokazano poniżej, z, *i +tak nie 97jest 4*20+10+7, [4 20 10 7]lub coś innego.

Przypadki testowe:

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
źródło
14
Każdy język wiem ma przejścia w „nastolatków”, podobnie jak jeden z 16do 10+7góry. (W języku angielskim dzieje się to między 12i 10+3, z nieco bardziej morfologicznym przebraniem.) Zawsze byłem trochę przejęty faktem, że różne języki dokonują tego przejścia w różnej liczbie.
Greg Martin
25
Dlaczego „vingt-deux” powinno być, 22gdy jest „dix-huit” 10+8?
Tytus
11
Na szczęście jest to strona z łamigłówkami programistycznymi, a nie strona z ciekawostkami językowymi. W przeciwnym razie ludzie mogą się denerwować, gdy OP popełnia głupie błędy. Uff!
Stewie Griffin
4
@StewieGriffin People wciąż się denerwuje.
Leaky Nun
2
Jako francuski uważam, że jest całkiem w porządku: D.
Walfrat,

Odpowiedzi:

13

Excel, 153 149 bajtów

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

Jestem pewien, że może być lepiej, starałem się znaleźć skuteczny sposób rozliczenia # 80.

edycja: Skonsolidowano przypadki „normalne”, aby zaoszczędzić 4 bajty. # 80 wciąż jest do bani.

Nie mogę znaleźć konkretnej odpowiedzi tutaj, nie jestem pewien zasad kodowania golfa TBH. Czy mogę używać wielu komórek w programie Excel i dodawać liczbę bajtów dla każdej z nich?

to znaczy. Do wprowadzenia w komórce A1

A2: 11 bajtów

=MOD(A1,20)

A3 (wynik): 125 bajtów

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

W sumie 136?

qoou
źródło
Myślę, że powinno się zezwalać na pisanie kodu w wielu komórkach. IMHO to tak, jakby mieć zmienne pośrednie lub funkcje w innych językach programowania.
pajonk
Wydaje mi się, że powinna istnieć pewna kara za używanie wielu komórek, tak samo jak za używanie funkcji w innych językach (za wpisanie płyty kotłowej w celu zadeklarowania funkcji). Być może najkrótsze obsługiwane kodowanie (tj. CSV), więc niezbędna liczba przecinków i (jeśli to konieczne) cudzysłowy?
Muzer 27.04.17
Nie znam żadnego formatu, w którym pliki Excela można zapisać z rozpoznawalnym wyjściem. Pliki CSV domyślnie nie obsługują takich funkcji i powodują uszkodzenie każdej funkcji używającej przecinka. Jeśli zostanie zapisany jako czysty tekst w jednej kolumnie z nową linią między komórkami, może zostać skopiowany bezpośrednio do programu Excel i funkcji. W takim przypadku dla każdej dodatkowej komórki zostanie dodany 1 bajt.
qoou
Zaoszczędź bajt, konwertując IF(A1=80,,IF(MOD(A1,20)>16,"+10+"&MOD(A1,20)-10,"+"&MOD(A1,20)))naIFS(A1=80,,MOD(A1,20)>16,"+10+"&MOD(A1,20)-10,1,"+"&MOD(A1,20))
Greedo
W Libreoffice calc możesz pominąć )koniec, czy możesz zrobić to samo w programie Excel? Możesz więc zapisać 5 bajtów (tak naprawdę są znaki UCS2, więc jeśli powiesz bajt == oktet, musisz policzyć go podwójnie). I musisz zmienić ,w;
12431234123412341234123
8

Siatkówka , 52 48 bajtów

4 bajty zapisane dzięki Neilowi

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

Wypróbuj online! lub sprawdź wszystkie dane wejściowe (dostarczone przez Neila)

Wyjaśnienie

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

Najpierw zajmujemy się tłumaczeniem 70, 80 i 90. W tych pierwszych 3 etapach 7 na początku z kolejną postacią po niej zastępowaną 60+1. Podobnie, 9zastępuje się 81, i 8przez 4*20+1. Zastąpienie 9zasadniczo zmienia go na „osiemdziesiąt dziesięć” i tak, że 8jest on następnie obsługiwany przez następną zamianę, co oszczędza bajty przy 4*20+1dwukrotnym zapisywaniu .

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

Obsługuje to przypadki 17, 18oraz 19poprzez zastąpienie 1w każdym z 10+.

\+0

Wreszcie, nigdy nie powinno być +0na końcu, więc usuń go, jeśli jest.

Business Cat
źródło
Z pewnością, jeśli spojrzysz za siebie i spojrzysz w przyszłość, możesz użyć grup przechwytywania
Downgoat
Nie działa 7-9, ale nie sądzę, że potrzebujesz takiego spojrzenia: Wypróbuj online!
Neil
@ Neil Zrozumiałem, że kiedy mnie nie było: P Ale dziękuję za nową wersję!
Business Cat,
@Downgoat Mógłbym zastąpić lookahead grupą przechwytującą, ale nie zapisałoby to żadnych bajtów, ponieważ $1jest tak samo długie ?=.
Business Cat
7

JavaScript (ES6), 73 71 bajtów

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'

Wersja premiowa, która drukuje liczby tak, jak są pisane dla dodatkowych 2 bajtów:

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'
ETHprodukcje
źródło
1
nie udaje się przy wielu wejściach; w rzeczywistości działa tylko dla 1..20, 30, 40, 50, 60, 80 i 100.
Titus
@ Titus Myślę, że nie rozumiesz większości wyników. 23, na przykład, powinien generować 23, a nie 20+3.
ETHprodukcje
Zaoszczędź dwa bajty z(m=n%20)
Tytusem
@Titus Dzięki, ale ja już próbowałem tego i to nie działa na 70-99 bo mdostaje resetu aby 0w f(n-n%20)rozmowy. (To zmienna globalna)
ETHprodukcje
Możesz zapisać bajt, zmieniając n<70|n>99na n%100<70. Czy mógłbyś również dodać kompilator testowy?
Kevin Cruijssen
5

R, 110 bajtów

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
źródło
Spróbuj (i-r)/10zamiast floor(i/10). I i>15powinno być i>16.
Tytus
5

PHP, 99 bajtów (Chcę być szczęśliwy)

prosty port JS firmy ETHproductions , 4- bajkowy golf . Drukuje liczby zgodnie z prośbą PO.

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

awaria

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

Chcę mieć właściwą wersję, 114 98 bajtów

nowe podejście zainspirowane produkcjami ETH , drukuje liczby tak, jak są one zapisane.

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

spróbuj online .

awaria

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
;}
Tytus
źródło
4

Python 2, 130 108 bajtów

22 bajty zapisane dzięki @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`

Wypróbuj online!

Uriel
źródło
108 bajtów: TIO
matematyki
1
Musisz liczyć, f=ponieważ użyłeś go w lambda.
Leaky Nun
@LeakyNun naprawiono
Uriel
3

Partia, 220 217 bajtów

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

Pobiera dane wejściowe na STDIN. Generowanie i usuwanie wiodących +zapisuje 1 bajt na specjalnej obudowie 80. Edycja: Zapisano 3 bajty dzięki @ ConorO'Brien.

Neil
źródło
Możesz zapisać 3 bajty, usuwając @echo offi poprzedzając wszystkie instrukcje z wyjątkiem instrukcji pętli hte za pomocą@
Conor O'Brien
@ ConorO'Brien Huh, zastanawiam się, dlaczego tym razem zapomniałem ...
Neil
2

Galaretka , 55 bajtów

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

Wypróbuj online! lub zobacz zestaw testowy

Bez wątpienia istnieje krótsza droga!

W jaki sposób?

+ - 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
źródło
2

Pyth, 61 56 bajtów

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

Przetestuj online!

Dzięki Leaky Nun za ulepszenie o 5 bajtów!

Wyjaśnienie:

                     | 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
źródło
*-Q100>Q69}/QTr6T
Leaky Nun
@]b}17 19}b}17 19
Leaky Nun
+"10+"ebj\+,Teb
Leaky Nun
@LeakyNun Dzięki za pomoc w grze w golfa! Wprowadziłem zmiany, które zasugerowałeś.
K Zhang
1

Python3, 127 bajtów

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]

Każdy element tablicy zawiera swoją reprezentację:

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

Kod tak naprawdę nie tworzy funkcji, tylko tablicę - nie wiem, czy jest to dozwolone. W przeciwnym razie musiałbym zrobić te 139 bajtów, dodając f=[...].__getitem__.

emu
źródło
Witamy w PPCG! Ja wierzę odbyła się dyskusja na temat składania meta jak tablice odwzorowań z liczb całkowitych do obiektów, ale nie wydaje się go znaleźć w tej chwili. Dam ci znać, jeśli to zrobię (i jaki był wynik tej dyskusji). Tak czy inaczej, nie będziesz potrzebować f=, ponieważ funkcje bez nazw (tj. Wyrażenia, które oceniają przesłaną funkcję) są w porządku, chyba że nazwa jest potrzebna do czegoś takiego jak rekurencja.
Martin Ender
Nie ma jednomyślnego konsensusu, ale głosowanie w marginalnie najwyższej liczbie głosów sugeruje, aby pozwolić na rozwiązanie.
Martin Ender
0

Java 7, 97 96 109 bajtów

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 bajtów w przypadku naprawiania błędów 80.. :(

Wyjaśnienie:

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

Kod testowy:

Wypróbuj tutaj.

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
źródło