Phân số Unicode


21

Cho một phân số ở định dạng m/n(trong đó m và n là các số nguyên cùng nhau), xuất ra phân số Unicode tương ứng. Chương trình / chức năng của bạn sẽ không được yêu cầu nhận bất kỳ đầu vào nào không tương ứng với ký tự Unicode. Mảng, ví dụ [2, 3]như trái ngược với 2/3, được chấp nhận. m / ntrái ngược với m/ncũng tốt. Hai đầu vào riêng biệt mncũng hợp lệ.

Các phân số Unicode phải được xử lý như sau:

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

Do đó, các đầu vào có thể là như sau:

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

Các điểm mã Unicode của các ký tự như sau:

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

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

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

Làm cho mã của bạn càng ngắn càng tốt; Đây là mã golf.


Bạn có thể thêm các điểm mã unicode cho mỗi phân số không?
Rod

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

Bạn sẽ không được phép cho phép bất kỳ đầu vào nào không tương ứng với một ký tự unicode. Điều đó có nghĩa là chúng ta phải phát hiện đầu vào không hợp lệ? Hoặc điều này không được phép xảy ra?
Arnauld

@Arnauld Cái sau.
dùng202729

Đầu vào có thể là một đối tượng đại diện cho một phân số không?
Brad Gilbert b2gills

Câu trả lời:


14

JavaScript (Node.js) , 78 77 byte

Đã lưu 1 byte nhờ @HermanLauenstein

Đưa đầu vào theo cú pháp currying (m)(n).

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

Hãy thử trực tuyến!


@ user202729 Tôi chắc chắn rằng tôi đã sử dụng một công thức tương tự ở nơi khác. Mặc dù vậy, tôi không nhớ thử thách nào. Bây giờ, có thể đáng để thử tạo các ký tự String.fromCharCode(), nhưng tôi mong đợi số byte tương tự.
Arnauld


@HermanLauenstein Cảm ơn! (Tôi đã bỏ lỡ một điều đó bởi vì tôi đã bước đầu chỉ là tìm kiếm modulo nhỏ tôi đã chuyển sang phương pháp XOR khi tôi bắt đầu loại bỏ đuôi khe trống..)
Arnauld

Và nếu bạn đăng câu trả lời của mình quá sớm, nó sẽ khiến mọi người chủ yếu sử dụng phương pháp của bạn ...
user202729 17/12/17

12

Perl 6 ,  48  43 byte

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

Thử nó

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

Thử nó

Mở rộng:

{  # 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
      )
}

Lưu ý rằng tìm kiếm phải được tách ra để nó không trả về các ký tự Unicode khác có cùng tính thống nhất. (nếu không nó sẽ là (1..*))


3
Đợi đã, Perl 6 có tích hợp sẵn cho thứ chính xác này không?
Erik the Outgolfer 16/12/17

2
@EriktheOutgolfer Tôi không chắc đó là cách nhìn nó, nhưng vâng, bạn có thể truy cập giá trị số của điểm mã được phản ánh trong cột thứ 9 từ Cơ sở dữ liệu Ký tự Unicode trong tệp UnicodeData.txt. Ví dụ, U + 109BC MEROITIC CURSIVE FRACTION ELEVEN TWELFTHScó thuộc tính ký tự nv=11/12. Có khoảng 1500 điểm mã với các giá trị số không trống, thay vì thử thách nhỏ này yêu cầu một điểm giải quyết. Đây là toàn bộ số hoặc hợp lý.
tchrist

7

JavaScript (ES6), 88 86 84 81 79 byte

Đã lưu 2 byte nhờ @Arnauld

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

Không hoàn toàn ngắn như câu trả lời JS khác, nhưng thật thú vị khi tính điểm mã của từng phân số theo toán học.

Kiểm tra đoạn

Phương thức cũ (82 byte):

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

Đã lưu 4 byte trên cái này nhờ @Arnauld.


1
-2 byte trên cả hai phiên bản với-~'3 1'[n-6]
Arnauld


2

SOGL V0.12 , 51 byte

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

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

sử dụng bản đồ (m + n*5)%33%22

Giải trình:

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 byte

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

Một hàm ẩn danh nhận đầu vào là "1/2" và trả về ký tự tương ứng.

Một ánh xạ thẳng từ Clojure Ratiođến một ký tự phân số. compvà thực tế là bản đồ Clojure là các chức năng thực sự hữu ích ở đây. Tôi cần phải vượt qua đầu vào chuỗi read-stringđể đánh giá nó dưới dạng tỷ lệ, vì điều đó cho phép tôi loại bỏ tất cả các trích dẫn đầy hơi trong bản đồ. comphãy để tôi làm điều đó miễn phí, đó là tốt đẹp. Mã "đầy đủ" sẽ là:

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

Sau khi xem qua các câu trả lời khác, tôi nhận ra rằng cách tiếp cận này khá ngây thơ. Tôi đang tìm cách cải thiện nó.



1

Than , 77 48 46 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Chỉnh sửa: Đã lưu 29 31 byte bằng cách ánh xạ từ các ký tự ASCII sang các ký tự đa bào. Giải trình:

    “....”                  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

Python 3, 97 byte

lambda m,n:'½ ⅓⅔ ¼_¾ ⅕⅖⅗⅘ ⅙___⅚ ⅐ ⅛_⅜_⅝_⅞ ⅑ ⅒'.split()[n-2][m-1]

2
Điều này dường như không hoạt động, [n-2][m-1]thay vào đó bạn cần .
Erik the Outgolfer 16/12/17

Phải, tôi đoán tôi đã không kiểm tra nó trước ...
Ryan McCampbell

0

Tập lệnh Vim, 67 byte

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

Hàm này hoạt động với các sơ đồ của Vim được nhập sau khi khởi động chúng. ctrl-k.Rõ ràng, ctrl-kký tự có liên quan sau ký tự exe'normkhông được hiển thị trong khối mã ở trên.

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.