แปลตัวเลขเป็นภาษาฝรั่งเศส


46

ชาวฝรั่งเศสสะกดตัวเลขในลักษณะที่แปลกประหลาด

  • 1-16เป็น "ปกติ"
  • 17-19สะกดออก10 + 7 10 + 8, 10 + 9
  • 20-69เป็น "ปกติ" (OK, OK! ไม่จริง แต่อยู่ในการท้าทายนี้)
  • 70-79เป็น60 + 10 + 60 11 ... 60 + 10 + 7, 60 + 10 + 8, 60 + 10 + 9
  • 80-99เป็น4 * 20, 4 * 20 + 1, 4 * 20 + 2 ... 4 * 20 + 16, 4 * 20 + 10 + 7, 4 * 20 + 10 + 8, 4 * 20 + 10 + 9

ท้าทาย:

ใช้จำนวนเต็มบวกในช่วง[1,100]และส่งออกเป็น "วิธีฝรั่งเศส" คุณจะต้องส่งออกมันตรงตามที่แสดงด้านล่างด้วย*และ+เพื่อให้97เป็น4*20+10+7ไม่ได้[4 20 10 7]หรือสิ่งอื่นใด

กรณีทดสอบ:

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
ภาษาฉันรู้ว่าทุกคนมีการเปลี่ยนแปลงในส่วนของ "วัยรุ่น" อย่างหนึ่งจาก16การ10+7ดังกล่าวข้างต้น (ในภาษาอังกฤษมันเกิดขึ้นระหว่าง12และ10+3ด้วยการปลอมตัวทางสัณฐานวิทยาเพิ่มเติมเล็กน้อย) ฉันมักจะ overobsessed เล็กน้อยกับความจริงที่ว่าภาษาที่แตกต่างกันทำให้การเปลี่ยนแปลงที่หมายเลขที่แตกต่างกัน
Greg Martin

25
ทำไม "vingt-deux" ควรเป็น22เมื่อ "dix-huit" คือ10+8อะไร?
ติตัส

11
โชคดีที่นี่เป็นไซต์ปริศนาการเขียนโปรแกรมไม่ใช่ไซต์เรื่องไม่สำคัญทางภาษา มิฉะนั้นคนอาจจะรำคาญเมื่อ OP ทำผิดพลาด วุ้ย
Stewie Griffin

4
@StewieGriffin ผู้คนยังคงรู้สึกรำคาญ
Leun Nun

2
ในฐานะชาวฝรั่งเศสฉันพบว่ามันค่อนข้างดี: D
Walfrat

คำตอบ:


13

Excel, 153 149 ไบต์

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

ฉันแน่ใจว่านี่น่าจะดีกว่าฉันพยายามหาวิธีที่มีประสิทธิภาพสำหรับบัญชี # 80

แก้ไข: รวมกรณี 'ปกติ' ดีกว่าเพื่อบันทึก 4 ไบต์ # 80 ยังคงดูด

ไม่สามารถหาคำตอบเฉพาะได้ที่นี่ไม่แน่ใจว่ากฎของ code-golf tbh ฉันสามารถใช้เซลล์หลายเซลล์ใน Excel และเพิ่มจำนวนไบต์ของแต่ละเซลล์ได้หรือไม่

กล่าวคือ สำหรับอินพุตในเซลล์ A1

A2: 11 ไบต์

=MOD(A1,20)

A3 (ผลลัพธ์): 125 ไบต์

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

รวมเป็น 136?


ฉันคิดว่าควรอนุญาตให้เขียนโค้ดในหลาย ๆ เซลล์ IMHO เหมือนมีตัวแปรกลางหรือฟังก์ชั่นในภาษาการเขียนโปรแกรมอื่น ๆ
pajonk

ฉันรู้สึกว่าควรมีบทลงโทษสำหรับการใช้หลายเซลล์เหมือนมีบทลงโทษในการใช้ฟังก์ชั่นในภาษาอื่น ๆ บางทีการเข้ารหัสที่สนับสนุน tersest (เช่น CSV) ดังนั้นจำเป็นต้องใช้เครื่องหมายจุลภาคและเครื่องหมายคำพูด (ถ้าจำเป็น) หรือไม่
Muzer

ฉันไม่ทราบว่ารูปแบบใดที่ไฟล์ excel สามารถบันทึกด้วยเอาต์พุตที่เป็นที่รู้จัก ไฟล์ CSV ไม่ได้ตามฟังก์ชั่นการสนับสนุนเริ่มต้นเช่นนี้และจะแยกฟังก์ชันที่ใช้เครื่องหมายจุลภาค หากบันทึกเป็นข้อความล้วนในหนึ่งคอลัมน์ที่มีบรรทัดใหม่ระหว่างเซลล์มันสามารถคัดลอกลงใน excel และฟังก์ชั่นได้โดยตรง ในกรณีนี้ 1 ไบต์จะถูกเพิ่มสำหรับแต่ละเซลล์เพิ่มเติม
qoou

บันทึกไบต์โดยแปลงIF(A1=80,,IF(MOD(A1,20)>16,"+10+"&MOD(A1,20)-10,"+"&MOD(A1,20)))เป็นIFS(A1=80,,MOD(A1,20)>16,"+10+"&MOD(A1,20)-10,1,"+"&MOD(A1,20))
Greedo

ใน Libreoffice calc คุณสามารถข้าม)ส่วนท้ายได้คุณสามารถทำเช่นเดียวกันกับ excel ได้หรือไม่? ดังนั้นคุณสามารถบันทึก 5 "ไบต์" (มีจริง ๆ UCS2-Chars ดังนั้นถ้าคุณพูด Byte == octet คุณจะต้องนับเป็นสองเท่า) และคุณต้องเปลี่ยน,ใน;
12431234123412341234123

8

เรติน่า52 52ไบต์

บันทึกได้ 4 ไบต์ด้วย Neil

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

ลองออนไลน์! หรือตรวจสอบอินพุตทั้งหมด (จัดทำโดย Neil)

คำอธิบาย

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

ครั้งแรกที่เราจัดการกับการแปลของ 70, 80 และ 90 ในทั้ง 3 ขั้นตอนแรก 7 60+1ที่เริ่มต้นด้วยตัวอักษรอีกต่อไปนี้มันจะถูกแทนที่ด้วย ในทำนองเดียวกัน9จะถูกแทนที่ด้วย81และโดย8 4*20+1การแทนที่9คือการเปลี่ยนเป็น "แปดสิบ" และดังนั้นจึง8ถูกจัดการโดยการแทนที่ถัดไปซึ่งจะช่วยประหยัดไบต์มากกว่าการเขียน4*20+1สองครั้ง

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

นี้จัดการกับกรณีของ17, 18และ19, โดยการเปลี่ยนในแต่ละคนมี110+

\+0

ในที่สุดไม่ควรมี+0ที่สิ้นสุดดังนั้นลบหากมี


แน่นอนว่าถ้ามองไปข้างหลังและมองไปข้างหน้าคุณสามารถใช้กลุ่มการจับกุม
Downgoat

ใช้งานไม่ได้7-9แต่ฉันไม่คิดว่าคุณจะต้องมองหานั่น: ลองออนไลน์!
Neil

@ ไม่มีฉันรู้ว่าในขณะที่ฉันไป: P แต่ขอบคุณสำหรับรุ่นใหม่!
แมวธุรกิจ

@Downgoat ฉันสามารถแทนที่ lookahead กับกลุ่มจับ แต่มันจะไม่บันทึกไบต์ใด ๆ ตั้งแต่เป็นเพียงตราบเท่าที่$1 ?=
แมวธุรกิจ


7

JavaScript (ES6), 73 71 ไบต์

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'

รุ่นโบนัสที่พิมพ์ตัวเลขตามจริงโดยสะกดเป็น 2 ไบต์พิเศษ:

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
ล้มเหลวสำหรับอินพุตจำนวนมาก จริง ๆ แล้วมันใช้งานได้เพียง 1..20, 30, 40, 50, 60, 80 และ 100 เท่านั้น
Titus

@Titus ฉันคิดว่าคุณเข้าใจผิดเกี่ยวกับผลลัพธ์ส่วนใหญ่ 23เช่นควรจะส่งออกไม่ได้23 20+3
ETHproductions

บันทึกสองไบต์ด้วย(m=n%20)
Titus

@Titus ขอบคุณ แต่ฉันได้ลองแล้วและมันไม่ทำงานใน 70-99 เพราะmได้รับการรีเซ็ต0เป็นf(n-n%20)สาย (เป็นตัวแปรทั่วโลก)
ETHproductions

คุณสามารถบันทึกไบต์โดยการเปลี่ยนไปn<70|n>99 n%100<70นอกจากนี้คุณสามารถเพิ่มคอมไพเลอร์ทดสอบได้หรือไม่
Kevin Cruijssen


5

PHP, 99 ไบต์ (ฉันต้องการเวอร์ชั่นที่มีความสุข)

พอร์ตตรงของETHproductions´ JS , 4 ไบต์ที่ตีกอล์ฟ พิมพ์ตัวเลขตามที่ถามโดย 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;}

ชำรุด

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

ฉันต้องการเวอร์ชั่นที่ถูกต้อง114 98 ไบต์

แนวทางใหม่ที่ได้รับแรงบันดาลใจจากETHproductionsพิมพ์ตัวเลขตามที่สะกดออกมาจริงๆ

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

ลองออนไลน์

ชำรุด

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 bytes

บันทึก 22 ไบต์ขอบคุณ @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`

ลองออนไลน์!



1
คุณต้องนับf=เพราะคุณใช้มันในแลมบ์ดา
Leun Nun

@LeakyNun แก้ไขแล้ว
Uriel

3

แบตช์220 217 ไบต์

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

ใช้อินพุตบน STDIN การสร้างและนำ+แกนนำจะบันทึก 1 ไบต์บนปลอกพิเศษ 80 แก้ไข: บันทึก 3 ไบต์ด้วย @ ConorO'Brien


คุณสามารถบันทึก 3 ไบต์โดยการลบ@echo offและนำหน้าคำสั่งทั้งหมดยกเว้นคำสั่งวนลูปด้วย@
Conor O'Brien

@ ConorO'Brien ฮะผมสงสัยว่าทำไมฉันลืมที่จะทำอย่างนั้นเวลานี้ ...
นีล

2

เยลลี่ 55 ไบต์

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

ลองออนไลน์! หรือดูชุดทดสอบ

ไม่ต้องสงสัยเลยว่าจะมีวิธีที่สั้นกว่านี้!

อย่างไร?

+ - 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 ไบต์

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

ทดสอบออนไลน์!

ขอบคุณ Leaky Nun สำหรับการปรับปรุง 5 ไบต์!

คำอธิบาย:

                     | 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
Leun Nun

@]b}17 19}b}17 19
Leun Nun

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

@LeakyNun ขอบคุณสำหรับความช่วยเหลือเกี่ยวกับการเล่นกอล์ฟ! ฉันได้ทำการเปลี่ยนแปลงที่คุณแนะนำ
K Zhang

1

Python3, 127 ไบต์

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]

แต่ละองค์ประกอบของอาร์เรย์ประกอบด้วยตัวแทน:

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

รหัสไม่ได้สร้างฟังก์ชั่นจริงๆเพียงแค่อาร์เรย์ - ฉันไม่รู้ว่าได้รับอนุญาตหรือไม่ มิฉะนั้นผมจะต้องทำเรื่องนี้ให้ 139 f=[...].__getitem__ไบต์โดยการเพิ่ม


ยินดีต้อนรับสู่ PPCG! ฉันเชื่อว่ามีการอภิปรายเกี่ยวกับเมตาเกี่ยวกับการส่งอาร์เรย์เป็นการแมปจากจำนวนเต็มไปยังวัตถุ แต่ดูเหมือนว่าฉันจะไม่พบมันในขณะนี้ ฉันจะแจ้งให้คุณทราบหากฉันทำ (และผลลัพธ์ของการสนทนานั้นคืออะไร) ไม่ว่าจะด้วยวิธีใดคุณไม่จำเป็นต้องใช้f=เนื่องจากฟังก์ชั่นที่ไม่มีชื่อ (เช่นนิพจน์ที่ประเมินไปยังฟังก์ชั่นที่ส่ง) นั้นใช้ได้ยกเว้นชื่อที่จำเป็นสำหรับการเรียกซ้ำ
Martin Ender

ไม่มีมติที่ชัดเจน แต่คำตอบที่ได้รับการโหวตน้อยแนะนำให้ใช้โซลูชันของคุณ
Martin Ender

0

Java 7, 97 96 109 ไบต์

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 ไบต์สำหรับกรณีการแก้ไขข้อบกพร่อง80.. :(

คำอธิบาย:

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

รหัสทดสอบ:

ลองที่นี่

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));
    }
  }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.