Terjemahkan angka ke bahasa Prancis


46

Prancis mengeja angka dengan cara yang aneh.

  • 1-16 "normal"
  • 17-19 dijabarkan 10 + 7. 10 + 8, 10 + 9 .
  • 20-69 "normal" (OK, OK! Tidak juga, tetapi mereka dalam tantangan ini)
  • 70-79 adalah 60 + 10, 60 + 11 ... 60 + 10 + 7, 60 + 10 + 8, 60 + 10 + 9 .
  • 80-99 adalah 4 * 20, 4 * 20 + 1, 4 * 20 + 2 ... 4 * 20 + 16, 4 * 20 + 10 + 7, 4 * 20 + 10 + 8, 4 * 20 + 10 + 9

Tantangan:

Ambil bilangan bulat positif dalam kisaran [1.100] , dan keluarkan dengan "cara Prancis". Anda harus menampilkannya persis seperti yang ditunjukkan di bawah ini, dengan *dan +, demikian 97juga 4*20+10+7, bukan [4 20 10 7]atau sesuatu yang lain.

Kasus uji:

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
Setiap bahasa yang saya tahu memiliki transisi dalam "remaja", seperti yang dari 16ke 10+7atas. (Dalam bahasa Inggris hal itu terjadi di antara 12dan 10+3, dengan penyamaran yang sedikit lebih morfologis.) Saya selalu sedikit terlalu terbebani dengan fakta bahwa bahasa yang berbeda membuat transisi pada angka yang berbeda.
Greg Martin

25
Kenapa harus "vingt-deux" 22ketika "dix-huit" adalah 10+8?
Titus

11
Untungnya, ini adalah situs teka-teki pemrograman dan bukan situs trivia linguistik. Kalau tidak, orang mungkin akan kesal ketika OP membuat kesalahan konyol. Fiuh!
Stewie Griffin

4
@StewieGriffin Orang-orang masih merasa terganggu.
Leaky Nun

2
Sebagai orang Prancis, saya merasa cukup baik: D.
Walfrat

Jawaban:


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

Saya yakin ini bisa lebih baik, saya berjuang untuk menemukan cara yang efisien untuk menghitung # 80.

sunting: Menggabungkan case 'Normal' dengan lebih baik untuk menghemat 4 byte. # 80 masih menyebalkan.

Tidak dapat menemukan jawaban spesifik di sini, tidak yakin aturan kode-golf tbh. Bisakah saya menggunakan banyak sel di Excel, dan menambahkan jumlah byte masing-masing?

yaitu. Untuk input dalam sel A1

A2: 11 Bytes

=MOD(A1,20)

A3 (hasil): 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))))

Dengan total 136?


Saya pikir itu harus diizinkan untuk menulis kode dalam banyak sel. IMHO itu seperti memiliki variabel menengah atau fungsi dalam bahasa pemrograman lain.
pajonk

Saya merasa bahwa harus ada beberapa hukuman menggunakan beberapa sel, sama seperti ada hukuman menggunakan fungsi dalam bahasa lain (yang mengetik boilerplate untuk mendeklarasikan fungsi). Mungkin pengkodean yang didukung paling singkat (yaitu CSV), jadi perlu jumlah koma dan (jika perlu) kutip?
Muzer

Saya tidak mengetahui format apa pun yang dapat menyimpan file excel dengan output yang mudah dikenali. File CSV tidak secara default mendukung fungsi-fungsi seperti ini, dan akan memecah fungsi apa pun yang menggunakan koma. Jika disimpan sebagai teks murni dalam satu kolom dengan garis baru di antara sel, itu dapat disalin langsung ke excel dan fungsi. Dalam hal ini, 1 byte akan ditambahkan untuk setiap sel tambahan.
qoou

Simpan satu byte dengan mengonversi IF(A1=80,,IF(MOD(A1,20)>16,"+10+"&MOD(A1,20)-10,"+"&MOD(A1,20)))keIFS(A1=80,,MOD(A1,20)>16,"+10+"&MOD(A1,20)-10,1,"+"&MOD(A1,20))
Greedo

Dalam Libreoffice calc, Anda dapat melewati )di bagian akhir, dapatkah Anda melakukan hal yang sama di excel? Jadi Anda dapat menyimpan 5 "byte" (benar-benar ada UCS2-Chars, jadi jika Anda mengatakan Byte == oktet, Anda harus menghitungnya dua kali lipat). Dan Anda harus mengubah ,di;
12431234123412341234123

8

Retina , 52 48 byte

4 byte disimpan berkat Neil

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

Cobalah online! atau verifikasi semua input (disediakan oleh Neil)

Penjelasan

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

Pertama kita menangani terjemahan 70, 80, dan 90. Dalam 3 tahap pertama ini, 7 di awal dengan karakter lain yang mengikutinya digantikan oleh 60+1. Demikian pula, 9digantikan oleh 81, dan 8oleh 4*20+1. Penggantian pada 9dasarnya mengubahnya menjadi "delapan puluh sepuluh" dan semacamnya, sehingga 8kemudian ditangani oleh penggantian berikutnya, yang menyimpan byte lebih dari menulis 4*20+1dua kali.

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

Ini menangani kasus-kasus 17, 18dan 19, dengan mengganti 1di masing-masing dengan 10+.

\+0

Akhirnya, tidak boleh ada +0pada akhirnya, jadi hapus jika ada.


Tentunya sebagai gantinya jika melihat ke belakang dan melihat ke depan, Anda dapat menggunakan grup tangkap
Downgoat

Tidak berfungsi 7-9, tapi saya rasa Anda tidak perlu melihatnya
Neil

@Neil Saya menyadari itu ketika saya pergi: P Tapi terima kasih untuk versi baru!
Business Cat

@Downgoat saya bisa mengganti lookahead dengan grup penangkap tetapi tidak akan menyimpan byte karena $1hanya selama ?=.
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'

Versi bonus yang mencetak angka-angka karena sebenarnya dieja untuk tambahan 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
gagal untuk banyak input; sebenarnya ini hanya bekerja untuk 1..20, 30, 40, 50, 60, 80 dan 100.
Titus

@Itus saya pikir Anda salah paham sebagian besar output. 23, misalnya, seharusnya menghasilkan 23, bukan 20+3.
ETHproduksi

Simpan dua byte dengan(m=n%20)
Titus

@Itus Terima kasih, tetapi saya sudah mencobanya, dan tidak berhasil pada 70-99 karena makan diatur ulang ke 0dalam f(n-n%20)panggilan. (Ini adalah variabel global)
Produk ETH

Anda dapat menyimpan byte dengan mengubah n<70|n>99ke n%100<70. Juga, dapatkah Anda menambahkan test-compiler?
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)

Coba (i-r)/10alih-alih floor(i/10). Dan i>15seharusnya i>16.
Titus

5

PHP, 99 byte (Saya ingin menjadi versi bahagia)

port langsung dari JSP ETHproduk , 4 byte golf. Mencetak angka-angka sebagaimana diminta oleh 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;}

kerusakan

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

Saya ingin menjadi versi yang tepat, 114 98 byte

pendekatan baru yang diilhami oleh produk ETH , mencetak angka-angka sebagaimana mereka sebenarnya dijabarkan.

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

coba online .

kerusakan

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

4

Python 2, 130 108 byte

22 byte disimpan berkat @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`

Cobalah online!



1
Anda perlu menghitung f=karena Anda menggunakannya di dalam lambda.
Leaky Nun

@LeakyNun diperbaiki
Uriel

3

Batch, 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%

Mengambil input pada STDIN. Menghasilkan dan menghapus terkemuka +menghemat 1 byte di atas casing khusus 80. Edit: Disimpan 3 byte berkat @ ConorO'Brien.


Anda dapat menyimpan 3 byte dengan menghapus @echo offdan mengawali semua pernyataan kecuali untuk pernyataan hte loop dengan@
Conor O'Brien

@ ConorO'Brien Huh, saya bertanya-tanya mengapa saya lupa melakukannya kali ini ...
Neil

2

Jelly , 55 byte

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

Cobalah online! atau lihat test suite

Tidak diragukan lagi ada cara yang lebih singkat!

Bagaimana?

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

Uji secara online!

Terima kasih kepada Leaky Nun untuk peningkatan 5 byte!

Penjelasan:

                     | 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 Terima kasih atas bantuannya bermain golf! Saya telah membuat perubahan yang Anda sarankan.
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]

Setiap elemen array mengandung representasinya:

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

Kode sebenarnya tidak membuat fungsi, hanya sebuah array - Saya tidak tahu apakah itu diizinkan. Kalau tidak, saya harus membuat ini 139 byte dengan menambahkan f=[...].__getitem__.


Selamat datang di PPCG! Saya percaya ada diskusi tentang meta tentang mengirimkan array sebagai pemetaan dari bilangan bulat ke objek, tapi saya tidak bisa menemukannya saat ini. Saya akan memberi tahu Anda jika saya melakukannya (dan apa hasil dari diskusi itu). Either way, Anda tidak perlu f=, karena fungsi yang tidak disebutkan namanya (yaitu ekspresi yang mengevaluasi ke fungsi yang dikirimkan) baik-baik saja kecuali nama diperlukan untuk sesuatu seperti rekursi.
Martin Ender

Tidak ada konsensus yang jelas, tetapi jawaban yang dipilih secara marginal atas menyarankan untuk memungkinkan solusi Anda.
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 untuk kasus perbaikan bug 80.. :(

Penjelasan:

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

Kode uji:

Coba di sini.

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));
    }
  }
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.