เศษส่วน Unicode


21

กำหนดเศษส่วนในรูปแบบm/n(โดยที่ m และ n เป็นจำนวนเต็ม coprime) ให้ส่งออกเศษส่วน Unicode ที่เกี่ยวข้อง โปรแกรม / ฟังก์ชั่นของคุณจะไม่ถูกคาดหวังให้ป้อนข้อมูลใด ๆ ที่ไม่ตรงกับอักขระ Unicode อาร์เรย์เช่น[2, 3]เมื่อเทียบกับ2/3, ได้รับการยอมรับ m / nเมื่อเทียบกับm/nก็ดี อินพุตแยกจากกันสองตัวmและnใช้ได้เช่นกัน

เศษส่วน Unicode ที่ต้องจัดการมีดังนี้:

½, ⅓, ⅔, ¼, ¾, ⅕, ⅖, ⅗, ⅘, ⅙, ⅚, ⅐, ⅛, ⅜, ⅝, ⅞, ⅑, ⅒

ดังนั้นอินพุตที่เป็นไปได้มีดังนี้:

1/2, 1/3, 2/3, 1/4, 3/4, 1/5, 2/5, 3/5, 4/5, 1/6, 5/6, 1/7, 1/8, 3/8, 5/8, 7/8, 1/9, 1/10

จุดรหัส Unicode ของตัวละครมีดังนี้

188 ¼
189 ½
190 ¾
8528 ⅐
8529 ⅑
8530 ⅒
8531 ⅓
8532 ⅔
8533 ⅕
8534 ⅖
8535 ⅗
8536 ⅘
8537 ⅙
8538 ⅚
8539 ⅛
8540 ⅜
8541 ⅝
8542 ⅞

กรณีทดสอบ

1/2 -> ½
1/3 -> ⅓
2/3 -> ⅔
1/4 -> ¼
3/4 -> ¾
3/8 -> ⅜
1/10 -> ⅒

ทำให้รหัสของคุณสั้นที่สุด นี่คือรหัสกอล์ฟ


คุณสามารถเพิ่มคะแนนโค้ด Unicode สำหรับแต่ละเศษส่วนได้หรือไม่
ร็อด

4
188 ¼, 189 ½, 190 ¾, 8528 ⅐, 8529 ⅑, 8530 ⅒, 8531 ⅓, 8532 ⅔, 8533 ⅕, 8534 ⅖, 8535 ⅗, 8536 ⅘, 8537 ⅙, 8538 ⅚, 8539 ⅛, 8540 ⅜, 8541 ⅝, 8542 ⅞
แม่ชีรั่วที่

คุณจะไม่ได้รับอนุญาตให้ป้อนข้อมูลใด ๆ ที่ไม่ตรงกับอักขระ Unicode หมายความว่าเราต้องตรวจสอบอินพุตที่ไม่ถูกต้องหรือไม่? หรือว่าสิ่งนี้ไม่ควรเกิดขึ้น?
Arnauld

@Annauld หนึ่งหลัง
user202729

อินพุตสามารถเป็นวัตถุที่แสดงถึงเศษส่วนได้หรือไม่?
Brad Gilbert b2gills

คำตอบ:


14

JavaScript (Node.js) , 78 77 ไบต์

บันทึกแล้ว 1 ไบต์ขอบคุณ @HermanLauenstein

(m)(n)จะเข้าในไวยากรณ์ currying

m=>n=>'¾⅗  ⅜    ⅞⅘½⅓¼⅕⅙⅐⅛⅑⅒⅚⅔⅝⅖'[(m*9+n)%31]

ลองออนไลน์!


@ user202729 ฉันแน่ใจว่าฉันใช้สูตรที่คล้ายกันที่อื่น ฉันจำไม่ได้ว่าท้าทายอะไร ตอนนี้มันอาจคุ้มค่าที่จะพยายามสร้างตัวละครด้วยString.fromCharCode()แต่ฉันคาดว่าจะมีจำนวนไบต์ที่ใกล้เคียง
Arnauld


@HermanLauenstein ขอบคุณ! (ฉันพลาดไปเพราะตอนแรกฉันแค่มองหาโมดูโลที่เล็กที่สุดฉันได้เปลี่ยนไปใช้วิธี XOR แล้วเมื่อฉันเริ่มลบช่องว่างที่ต่อท้าย)
Arnauld

และถ้าคุณโพสต์คำตอบของคุณเร็วเกินไปมันจะทำให้คนส่วนใหญ่ใช้วิธีการของคุณ ...
user202729

12

Perl 6 ,  48  43 ไบต์

{chr first *.unival==$^m/$^n,(|^191,|(8528..*))}

ลองมัน

{chr first *.unival==$_,(|^191,|(8528..*))}

ลองมัน

ขยาย:

{  # bare block lambda with implicit parameter 「$_」
  chr

    first               # find the first value

      *.unival ==       # which has a unicode value that matches
          $_,           # the input fraction (as a Rational)

      (
        |^191,     # ¼(189) ½(188) ¾(190)
        |(8528..*) # all of the rest
      )
}

โปรดทราบว่าการค้นหาจะต้องแยกกันเพื่อไม่ให้ส่งคืนอักขระ Unicode อื่น ๆ ที่มีความเหมือนเดียวกัน (มิฉะนั้นมันจะเป็น(1..*))


3
เดี๋ยวก่อน Perl 6 มีบิวท์อินสำหรับสิ่งนี้ใช่ไหม
Erik the Outgolfer

2
@EriktheOutgolfer ผมไม่แน่ใจว่าที่ค่อนข้างวิธีการที่จะมองมัน แต่ใช่คุณสามารถเข้าถึงค่าตัวเลขจุดรหัสที่สะท้อนให้เห็นในคอลัมน์ที่ 9 จากฐานข้อมูลตัวอักษร Unicode UnicodeData.txtในแฟ้ม ยกตัวอย่างเช่น U + 109BC มีคุณสมบัติในตัวละครMEROITIC CURSIVE FRACTION ELEVEN TWELFTHS nv=11/12มีจุดรหัส 1,500 จุดที่มีค่าตัวเลขไม่ว่างเปล่า - มากกว่าความท้าทายเล็ก ๆ นี้ขอให้แก้ไข นี่คือตัวเลขหรือจำนวนทั้งหมด
tchrist

7

JavaScript (ES6), 88 86 84 81 79 ไบต์

บันทึก 2 ไบต์ขอบคุณ @Arnauld

m=>n=>String.fromCharCode((4%n?8528:188)|"  130470912"[n]*1.3+~-m/-~"3 1"[n-6])

ไม่สั้นเหมือนกับคำตอบ JS อื่น ๆ แต่มันสนุกที่จะคำนวณจุดรหัสของแต่ละเศษส่วนทางคณิตศาสตร์

ตัวอย่างการทดสอบ

วิธีเก่า (82 ไบต์):

m=>n=>String.fromCharCode((4%n?8539:189)-("0x"+"  08162b0a9"[n])+~-m/-~"3 1"[n-6])

บันทึกแล้ว 4 ไบต์บนแอปนี้ขอบคุณ @Arnauld


1
-2 ไบต์ในทั้งสองเวอร์ชันด้วย-~'3 1'[n-6]
Arnauld

7

APL (Dyalog) , 88 64 ไบต์

{⎕UCS(⌊(⍺-1)÷(1+⍵≡8)⌈4×⍵≡6)-(291194049⊤⍨1012)[⍵]-1898539××⍵|4}

ลองออนไลน์!

-3 ขอบคุณที่dzaima

ใช้วิธี 84- ไบต์ของ ETHproductions

สิ่งที่f←รวมอยู่ใน TIO จะไม่ถูกนับเนื่องจากจะทำให้สามารถทดสอบฟังก์ชั่นได้


2

SOGL V0.12 , 51 ไบต์

5*+'æ%'⁵%"∫}ΣS“LI─{"#!“+ζ}¹"¾ŗŗŗŗŗŗ⅛ŗ⅜½⅝ŗ⅞ ⅓⅔ŗ  ¼”W

ลองที่นี่!

ใช้การทำแผนที่ (m + n*5)%33%22

คำอธิบาย:

5*                        multiply the 1st input by 5
  +                       add to the 2nd input
   'æ%                    modulo 33
      '⁵%                 module 22

"∫}ΣS“                    push 2153527158
      LI─                 base 11 decode that - [10 0 5 6 7 8 9 1 2]
         {     }          for each of that
          "#!“+             add 8528
               ζ            and convert to a character
                "...”     push "¾ŗŗŗŗŗŗ⅛ŗ⅜½⅝ŗ⅞ ⅓⅔ŗ  ¼", replacing ŗ with each character of the above array
                     W    and get the (m + n*5)%33%22th item from that

2

Clojure, 127 ไบต์

(comp{2/3\⅔ 4/5\⅘ 1/3\⅓ 1/2\½ 5/6\⅚ 1/5\⅕ 1/4\¼ 3/5\⅗ 1/7\⅐ 3/4\¾ 2/5\⅖ 1/6\⅙ 1/9\⅑ 1/8\⅛ 3/8\⅜ 1/10\⅒ 5/8\⅝ 7/8\⅞}read-string)

ฟังก์ชันที่ไม่ระบุชื่อที่รับอินพุตเป็น"1/2"และส่งคืนอักขระที่สอดคล้องกัน

การแมปแบบตรงจาก Clojure Ratioไปยังอักขระเศษส่วน compและความจริงที่ว่าแผนที่ Clojure เป็นฟังก์ชั่นที่ช่วยได้จริงๆที่นี่ ฉันต้องผ่านการป้อนสตริงread-stringเพื่อประเมินว่าเป็นประเภทอัตราส่วนเนื่องจากนั่นทำให้ฉันสามารถทิ้งเครื่องหมายคำพูด bloating ทั้งหมดในแผนที่ได้ compขอผมทำแบบนั้นฟรีซึ่งดีมาก รหัส "เต็ม" จะเป็น:

(defn to-unicode-fraction [frac]
  (get {2/3\⅔ 4/5\⅘ 1/3\⅓ 1/2\½ 5/6\⅚ 1/5\⅕ 1/4\¼ 3/5\⅗ 1/7\⅐,
        3/4\¾ 2/5\⅖ 1/6\⅙ 1/9\⅑ 1/8\⅛ 3/8\⅜ 1/10\⅒ 5/8\⅝ 7/8\⅞}
       (read-string frac)))

หลังจากดูคำตอบอื่น ๆ ฉันรู้ว่าวิธีนี้ไร้เดียงสาสวย ฉันกำลังมองหาวิธีการปรับปรุง


1

สวิฟท์ , 106 82 ไบต์

คำตอบสำหรับ JavaScriptของพอร์ตของ@Arnaulds

บันทึก 24 ไบต์ด้วย @ Mr.Xcoder

{Array("¾⅗  ⅜    ⅞⅘½⅓¼⅕⅙⅐⅛⅑⅒⅚⅔⅝⅖")[($0*9+$1)%31]}

ลองออนไลน์!


ใช้การปิดสำหรับ82 ไบต์ (คุณไม่จำเป็นต้องรวมvar f=ไว้ในจำนวนไบต์)
Mr. Xcoder

1

ถ่าน , 77 48 46 ไบต์

F§§⪪“YW³⦄Eν~vγ@⊖Xμ~?Iw⸿M➙b℅¦⦃”,NN℅⁺℅ι×⁹⁰∨№βι⁹⁴

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด แก้ไข: บันทึกแล้ว 29 31 ไบต์โดยการจับคู่จาก ASCII chars ไปยังหลาย chars คำอธิบาย:

    “....”                  Compressed string `R,EFcGbIMDO,H J,K  Pd,L,N Q,`
   ⪪      ,                 Split on commas
           N                First input
  §                         Circularly index
            N               Second input
 §                          Circularly index
F                           "Loop over" character (loop variable `i`)
                     №βι    Count of `i`s in lowercase letters
                    ∨   ⁹⁴  Replace zero result with 94
                 ×⁹⁰        Multiply by 90
               ℅ι           Take ordinal of `i`
              ⁺             Sum
             ℅              Convert back to character
                            Implicitly print



0

Vim Script, 67 ไบต์

fu!F(m,n)
if a:n==10|norm a⅒ 
else|exe'norm a'.a:m.a:n
endif
endfu

ฟังก์ชั่นนี้ใช้งานได้กับdigraphsของ Vim ซึ่งจะถูกป้อนหลังจากเริ่มต้นด้วย iwth ctrl-k.เห็นได้ชัดว่าctrl-kตัวละครที่เกี่ยวข้องหลังจากที่exe'normไม่ได้แสดงผลในบล็อกโค้ดด้านบน

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