Dịch số sang tiếng Pháp


46

Người Pháp đánh vần các con số một cách kỳ dị.

  • 1-16 là "bình thường"
  • 17-19 được đánh vần là 10 + 7. 10 + 8, 10 + 9 .
  • 20-69 là "bình thường" (OK, OK! Không thực sự, nhưng họ đang ở trong thử thách này)
  • 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

Thử thách:

Lấy một số nguyên dương trong phạm vi [1.100] và xuất ra "cách Pháp". Bạn phải ra nó chính xác như nó hiển thị dưới đây, với *+, do đó 974*20+10+7, không [4 20 10 7]hay cái gì khác.

Các trường hợp thử nghiệm:

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
Mỗi ngôn ngữ tôi biết có một sự chuyển tiếp trong "thiếu niên", giống như một từ 16để 10+7ở trên. (Trong tiếng Anh, điều đó xảy ra giữa 1210+3, với sự ngụy trang hình thái hơn một chút.) Tôi luôn cảm thấy hơi quá lời với thực tế là các ngôn ngữ khác nhau tạo ra sự chuyển đổi đó ở các số khác nhau.
Greg Martin

25
Tại sao "vingt-deux" phải là 22khi "dix-huit" là 10+8?
Tít

11
May mắn thay, đây là một trang web câu đố lập trình và không phải là một trang web đố ngôn ngữ. Nếu không mọi người có thể khó chịu khi OP mắc lỗi ngớ ngẩn. Phù!
Stewie Griffin

4
@StewieGriffin Mọi người vẫn thấy khó chịu.
Leaky Nun

2
Là một người Pháp tôi thấy nó khá ổn: D.
Walfrat

Câu trả lời:


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

Tôi chắc chắn rằng điều này có thể tốt hơn, tôi đã đấu tranh để tìm một cách hiệu quả để chiếm # 80.

chỉnh sửa: Hợp nhất các trường hợp 'Bình thường' tốt hơn để tiết kiệm 4 byte. # 80 vẫn còn hút.

Không thể tìm thấy câu trả lời cụ thể ở đây, không chắc chắn các quy tắc của mã golf-tbh. Tôi có thể sử dụng nhiều ô trong Excel và thêm số byte của từng ô không?

I E. Đối với đầu vào trong ô A1

A2: 11 byte

=MOD(A1,20)

A3 (kết quả): 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))))

Trong tổng số 136?


Tôi nghĩ rằng nó nên được phép viết mã trong nhiều ô. IMHO giống như có các biến hoặc hàm trung gian trong các ngôn ngữ lập trình khác.
pyjama

Tôi cảm thấy rằng sẽ có một số hình phạt của việc sử dụng nhiều ô, giống như có một hình phạt của việc sử dụng các chức năng trong các ngôn ngữ khác (đó là gõ bảng chữ cái để khai báo hàm). Có lẽ mã hóa được hỗ trợ chặt chẽ nhất (ví dụ CSV), vì vậy số dấu phẩy cần thiết và (nếu được yêu cầu) báo giá?
Muzer

Tôi không biết bất kỳ định dạng nào mà các tệp excel có thể được lưu với đầu ra dễ nhận biết. Các tệp CSV không theo các chức năng hỗ trợ mặc định như thế này và sẽ phá vỡ mọi chức năng sử dụng dấu phẩy. Nếu được lưu dưới dạng văn bản thuần túy trong một cột với một dòng mới giữa các ô, nó có thể được sao chép trực tiếp vào excel và hàm. Trong trường hợp này, 1 byte sẽ được thêm vào cho mỗi ô bổ sung.
qoou

Lưu một byte bằng cách chuyển đổi IF(A1=80,,IF(MOD(A1,20)>16,"+10+"&MOD(A1,20)-10,"+"&MOD(A1,20)))thànhIFS(A1=80,,MOD(A1,20)>16,"+10+"&MOD(A1,20)-10,1,"+"&MOD(A1,20))
Greedo

Trong Libreoffice calc, bạn có thể bỏ qua )phần cuối, bạn có thể làm tương tự trong excel không? Vì vậy, bạn có thể lưu 5 "byte" (thực sự có UCS2-Chars, vì vậy nếu bạn nói Byte == octet, bạn phải tính gấp đôi). Và bạn phải thay đổi ,trong;
12431234123412341234123

8

Võng mạc , 52 48 byte

4 byte được lưu nhờ Neil

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

Hãy thử trực tuyến! hoặc xác minh tất cả các đầu vào (được cung cấp bởi Neil)

Giải trình

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

Đầu tiên chúng tôi xử lý bản dịch của 70, 80 và 90. Trong 3 giai đoạn đầu tiên này, một số 7 khi bắt đầu với một ký tự khác theo sau nó được thay thế bằng 60+1. Tương tự, 9được thay thế bởi 81, và 8bởi 4*20+1. Việc thay thế về 9cơ bản là thay đổi nó thành "tám mươi mười" và như vậy, để 8sau đó được xử lý bởi sự thay thế tiếp theo, giúp tiết kiệm byte qua việc ghi 4*20+1hai lần.

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

Này xử lý các trường hợp 17, 1819, bằng cách thay thế 1trong mỗi 10+.

\+0

Cuối cùng, không bao giờ nên có một +0kết thúc, vì vậy hãy xóa nó nếu nó ở đó.


Chắc chắn thay vì nếu nhìn phía sau và nhìn, bạn có thể sử dụng các nhóm chụp
Downgoat

Không hoạt động 7-9, nhưng tôi không nghĩ rằng bạn cần cái nhìn đó: Hãy thử trực tuyến!
Neil

@Neil Tôi nhận ra rằng trong khi tôi đã biến mất: P Nhưng cảm ơn vì phiên bản mới!
Mèo kinh doanh

@Downgoat Tôi có thể thay thế lookahead bằng một nhóm bắt nhưng nó sẽ không lưu bất kỳ byte nào vì $1nó chỉ miễn là ?=.
Mèo kinh doanh


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'

Phiên bản phần thưởng in các số khi chúng thực sự được đánh vần thêm 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
thất bại cho rất nhiều đầu vào; thực tế nó chỉ hoạt động trong 1..20, 30, 40, 50, 60, 80 và 100.
Tít

@Titus Tôi nghĩ bạn hiểu nhầm hầu hết các kết quả đầu ra. 23, ví dụ, được cho là đầu ra 23, không 20+3.
Sản phẩm ETH

Lưu hai byte với(m=n%20)
Titus

@Titus Cảm ơn, nhưng tôi đã thử nó và nó không hoạt động trên 70-99 vì mđược đặt lại 0trong f(n-n%20)cuộc gọi. (Đó là một biến toàn cầu)
ETHproductions

Bạn có thể lưu một byte bằng cách thay đổi n<70|n>99thành n%100<70. Ngoài ra, bạn có thể thêm một trình biên dịch thử nghiệm?
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)

Hãy thử (i-r)/10thay vì floor(i/10). Và i>15nên được i>16.
Tít

5

PHP, 99 byte (Tôi muốn là phiên bản hạnh phúc)

một cổng thẳng của ETHproductions Tiếng Việt , 4 byte được đánh gôn. In các số theo yêu cầu của 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;}

phá vỡ

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

Tôi muốn là phiên bản đúng, 114 98 byte

cách tiếp cận mới lấy cảm hứng từ ETHproductions , in các con số khi chúng thực sự được đánh vần.

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

dùng thử trực tuyến .

phá vỡ

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

Hàng loạt, 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%

Đưa đầu vào vào STDIN. Tạo và xóa hàng đầu +tiết kiệm 1 byte trên vỏ đặc biệt 80. Chỉnh sửa: Đã lưu 3 byte nhờ @ ConorO'Brien.


Bạn có thể lưu 3 byte bằng cách xóa @echo offvà tiền tố tất cả các câu lệnh ngoại trừ câu lệnh lặp hte với@
Conor O'Brien

@ ConorO'Brien Huh, tôi tự hỏi tại sao tôi lại quên làm điều đó lần này ...
Neil

2

Thạch , 55 byte

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

Hãy thử trực tuyến! hoặc xem một bộ thử nghiệm

Không có nghi ngờ có một cách ngắn hơn!

Làm sao?

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

Kiểm tra nó trực tuyến!

Cảm ơn Leaky Nun đã cải thiện 5 byte!

Giải trình:

                     | 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
Nữ tu bị rò rỉ

@]b}17 19}b}17 19
Nữ tu bị rò rỉ

+"10+"ebj\+,Teb
Nữ tu bị rò rỉ

@LeakyNun Cảm ơn bạn đã giúp đỡ chơi golf! Tôi đã thực hiện những thay đổi mà bạn đề xuất.
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]

Mỗi phần tử mảng chứa đại diện của nó:

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

Mã không thực sự tạo ra một hàm, chỉ là một mảng - Tôi không biết nếu điều đó được cho phép. Mặt khác, tôi phải tạo 139 byte này bằng cách thêm f=[...].__getitem__.


Chào mừng đến với PPCG! Tôi tin rằng đã có một cuộc thảo luận về meta về việc gửi mảng dưới dạng ánh xạ từ số nguyên đến các đối tượng, nhưng dường như tôi không thể tìm thấy nó vào lúc này. Tôi sẽ cho bạn biết nếu tôi làm (và kết quả của cuộc thảo luận đó là gì). Dù bằng cách nào, bạn sẽ không cần f=, bởi vì các hàm không tên (nghĩa là các biểu thức đánh giá hàm đã gửi) vẫn ổn trừ khi tên đó là cần thiết cho một cái gì đó như đệ quy.
Martin Ender

Không có sự đồng thuận rõ ràng, nhưng câu trả lời được bình chọn hàng đầu cho thấy giải pháp của bạn.
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 cho trường hợp sửa lỗi 80.. :(

Giải trình:

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

Mã kiểm tra:

Hãy thử nó ở đây.

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));
    }
  }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.