Ký tự chữ cái chéo


17

Lý lịch

Tôi đã thấy Biểu đồ Venn rất thú vị này trên wikipedia: https://simple.wikipedia.org/wiki/Alph.us#/media/File:Venn_diagram_gr_la_ru.svg

Nó cho thấy các chữ cái (hình dạng vật lý) trong các bảng chữ cái khác nhau phổ biến giữa bảng chữ cái tiếng Nga, tiếng Hy Lạp và tiếng Latin.

Các thách thức

Đưa ra một chuỗi ký tự đầu vào từ bất kỳ một trong ba tập lệnh nào được hiển thị (nghĩa là các chữ cái Hy Lạp, Cyrillic hoặc Latin) viết hoa, xuất ra một tỷ lệ phần trăm của chuỗi phù hợp với từng ngôn ngữ. Thư lặp đi lặp lại đếm mỗi lần.

Ví dụ, FFLURSlà tất cả các ký tự chỉ có tiếng Latin, vì vậy đầu ra là FFLURS is 100% Latin, 0% Cyrillic and 0% Greek.

Ngược lại, TOX BEAM PHPđược hình thành hoàn toàn các ký tự xuất hiện trong cả ba ngôn ngữ, vì vậy đầu ra là TOX BEAM PHP is 100% Cyrillic, 100% Greek and 100% Latin.

Bảng tra cứu

Biểu đồ Venn là nguồn của các chữ cái dưới đây:

Chỉ tiếng Latin:

J,G,S,D,Q,U,V,W,F,L,R

Latin và Cyrillic:

C, С

Latin và Hy Lạp:

I,Ι, N,Ν, Z,Ζ

Hy Lạp và Cyrillic

Φ,Ф, Π,П, Γ,Г, Λ,Л

Cả ba:

A,B,E,O,M,K,T,X,Y,H,P (and equivalents in greek and cyrillic), (space)

Phần còn lại ... chỉ dành cho Hy Lạp hoặc Cyrillic.

LƯU Ý QUAN TRỌNG

Unicode định nghĩa (ví dụ) "A" theo (ít nhất) ba cách riêng biệt - một cách cho mỗi ngôn ngữ. Bất kỳ được sử dụng trong đầu vào (& # 0391, & # 0410 hoặc & # 0041), chương trình sẽ hiểu nó là phù hợp với cả ba ngôn ngữ. Vì vậy, A(tiếng Latin), Α(tiếng Hy Lạp Alpha) và А(Cyrillic) đều nên đưa ra 100% Cyrillic, 100% Greek and 100% Latinnhư câu trả lời.

Định dạng đầu vào

Bất kỳ chuỗi chứa độc quyền А-Я, Α-Ω, A-Z(không gian). Các ký tự này có thể được lặp lại nhiều lần trong chuỗi.

Định dạng đầu ra

Đầu ra có thể ở bất kỳ định dạng nào, miễn là hàm tạo ra kết quả nhất quán. Tôi sẽ thích để xem đầu ra theo định dạng tôi thấy trong ví dụ của tôi ( FFLURS is 100% Latin, 0% Cyrillic and 0% Greek), nhưng để làm cho các thách thức cởi mở hơn với bất cứ ai Tôi rất sẵn lòng chấp nhận mảng / chuỗi tỷ lệ phần trăm / tỷ lệ:

[100,0,0],

100 0 0

[1.0 0.0 0.0]

miễn là nó luôn luôn rõ số nào là ngôn ngữ nào - vì vậy đầu ra phải nhất quán.

Một số trường hợp kiểm tra thêm

CINEMATICS -> CINEMATICS is 100% Latin, 70% Greek and 60% Cyrillic

ЩJЩFЩLΞRΞVΞW -> ЩJЩFЩLΞRΞVΞW is 50% Latin, 25% Cyrillic and 25% Greek

-> is 100% Cyrillic, 100% Greek and 100% Latin

ΨΩTESTINGЯЮ -> ΨΩTESTINGЯЮ is 63.6% Greek, 63.6% Latin and 45.5% Cyrillic

Tiêu chí chiến thắng

Các quy tắc và loại trừ thông thường được áp dụng; câu trả lời ngắn nhất (byte) thắng.

(liên kết hộp cát: https://codegolf.meta.stackexchange.com/a/14984/62289 )

Để tránh nghi ngờ, các ký tự Unicode duy nhất hợp lệ trong đầu vào là:

  • 0020, 0041-005A (bảng chữ cái Latinh)
  • 0020, 0391-03A9 (bảng chữ cái Hy Lạp)
  • 0020, 0401, 0410-042F (Bảng chữ cái Cyrillic)

Nhưng như thể hiện trong các bảng tra cứu, các ký tự có thể được viết chéo.

Thêm bảng của Jonathan Allan từ các bình luận:

                                                 Latin  Greek  Cyrillic
U+0020     Space                                 1      1      1
U+0041  A  Latin capital letter A                1      1      1
U+0042  B  Latin capital letter B                1      1      1
U+0043  C  Latin capital letter C                1      0      1
U+0044  D  Latin capital letter D                1      0      0
U+0045  E  Latin capital letter E                1      1      1
U+0046  F  Latin capital letter F                1      0      0
U+0047  G  Latin capital letter G                1      0      0
U+0048  H  Latin capital letter H                1      1      1
U+0049  I  Latin capital letter I                1      1      0
U+004A  J  Latin capital letter J                1      0      0
U+004B  K  Latin capital letter K                1      1      1
U+004C  L  Latin capital letter L                1      0      0
U+004D  M  Latin capital letter M                1      1      1
U+004E  N  Latin capital letter N                1      1      0
U+004F  O  Latin capital letter O                1      1      1
U+0050  P  Latin capital letter P                1      1      1
U+0051  Q  Latin capital letter Q                1      0      0
U+0052  R  Latin capital letter R                1      0      0
U+0053  S  Latin capital letter S                1      0      0
U+0054  T  Latin capital letter T                1      1      1
U+0055  U  Latin capital letter U                1      0      0
U+0056  V  Latin capital letter V                1      0      0
U+0057  W  Latin capital letter W                1      0      0
U+0058  X  Latin capital letter X                1      1      1
U+0059  Y  Latin capital letter Y                1      1      1
U+005A  Z  Latin capital letter Z                1      1      0

U+0391  Α  Greek capital letter Alpha            1      1      1
U+0392  Β  Greek capital letter Beta             1      1      1
U+0393  Γ  Greek capital letter Gamma            0      1      1
U+0394  Δ  Greek capital letter Delta            0      1      0
U+0395  Ε  Greek capital letter Epsilon          1      1      1
U+0396  Ζ  Greek capital letter Zeta             1      1      0
U+0397  Η  Greek capital letter Eta              1      1      1
U+0398  Θ  Greek capital letter Theta            0      1      0
U+0399  Ι  Greek capital letter Iota             1      1      0
U+039A  Κ  Greek capital letter Kappa            1      1      1
U+039B  Λ  Greek capital letter Lambda           0      1      1
U+039C  Μ  Greek capital letter Mu               1      1      1
U+039D  Ν  Greek capital letter Nu               1      1      0
U+039E  Ξ  Greek capital letter Xi               0      1      0
U+039F  Ο  Greek capital letter Omicron          1      1      1
U+03A0  Π  Greek capital letter Pi               0      1      1
U+03A1  Ρ  Greek capital letter Rho              1      1      1

U+03A3  Σ  Greek capital letter Sigma            0      1      0
U+03A4  Τ  Greek capital letter Tau              1      1      1
U+03A5  Υ  Greek capital letter Upsilon          1      1      1
U+03A6  Φ  Greek capital letter Phi              0      1      1
U+03A7  Χ  Greek capital letter Chi              1      1      1
U+03A8  Ψ  Greek capital letter Psi              0      1      0
U+03A9  Ω  Greek capital letter Omega            0      1      0

U+0401  Ё  Cyrillic capital letter Io            0      0      1

U+0410  А  Cyrillic capital letter A             1      1      1
U+0411  Б  Cyrillic capital letter Be            0      0      1
U+0412  В  Cyrillic capital letter Ve            1      1      1
U+0413  Г  Cyrillic capital letter Ghe           0      1      1
U+0414  Д  Cyrillic capital letter De            0      0      1
U+0415  Е  Cyrillic capital letter Ie            1      1      1
U+0416  Ж  Cyrillic capital letter Zhe           0      0      1
U+0417  З  Cyrillic capital letter Ze            0      0      1
U+0418  И  Cyrillic capital letter I             0      0      1
U+0419  Й  Cyrillic capital letter Short I       0      0      1
U+041A  К  Cyrillic capital letter Ka            1      1      1
U+041B  Л  Cyrillic capital letter El            0      1      1
U+041C  М  Cyrillic capital letter Em            1      1      1
U+041D  Н  Cyrillic capital letter En            1      1      1
U+041E  О  Cyrillic capital letter O             1      1      1
U+041F  П  Cyrillic capital letter Pe            0      1      1
U+0420  Р  Cyrillic capital letter Er            1      1      1
U+0421  С  Cyrillic capital letter Es            1      0      1
U+0422  Т  Cyrillic capital letter Te            1      1      1
U+0423  У  Cyrillic capital letter U             1      1      1
U+0424  Ф  Cyrillic capital letter Ef            0      1      1
U+0425  Х  Cyrillic capital letter Ha            1      1      1
U+0426  Ц  Cyrillic capital letter Tse           0      0      1
U+0427  Ч  Cyrillic capital letter Che           0      0      1
U+0428  Ш  Cyrillic capital letter Sha           0      0      1
U+0429  Щ  Cyrillic capital letter Shcha         0      0      1
U+042A  Ъ  Cyrillic capital letter hard sign     0      0      1
U+042B  Ы  Cyrillic capital letter Yeru          0      0      1
U+042C  Ь  Cyrillic capital letter soft sign     0      0      1
U+042D  Э  Cyrillic capital letter E             0      0      1
U+042E  Ю  Cyrillic capital letter Yu            0      0      1
U+042F  Я  Cyrillic capital letter Ya            0      0      1

1
Chào mừng đến với PPCG! Đây là một thử thách đầu tiên tốt đẹp. :) Một lưu ý về ghi chú UTF-8 của bạn: đó không phải là UTF-8 định nghĩa nhiều phiên bản của các ký tự này mà là Unicode (và UTF-8 chỉ là một cách cụ thể để mã hóa các điểm mã Unicode). Ngoài ra, vì phần này khá quan trọng để câu trả lời được đúng, bạn có thể muốn đưa vào danh sách rõ ràng tất cả các ký tự Unicode cần được xử lý chính xác.
Martin Ender

@ngn vâng, cảm ơn.
simonalexander2005 17/03/18

@Jonathan ALLan, ngn: Tôi đồng ý, tôi chỉ dự định các chữ cái trong sơ đồ Venn - nhưng tất cả các cách biểu thị của các chữ cái đó đều hợp lệ - ví dụ như tôi cố gắng nói trong câu hỏi, có nhiều cách biểu thị unicode của "A"
simonalexander2005 17/03/18

Cyrillic "El" thực ra là "Lambda" của Hy Lạp. Cyrillic "Pe" là "Pi" trong tiếng Hy Lạp.
simonalexander2005 17/03/18

@Jonathan ALLan Tùy thuộc vào phông chữ, Cyrillic Л có thể trông giống hệt tiếng Hy Lạp. Hình dạng giống như chỉ là một biến thể phong cách khác của cùng một chữ cái.
ngn 17/03/18

Câu trả lời:


4

Thạch , 56 byte

Một băm cũng có thể ngắn hơn.

O:⁹:2;ON©œị“ŒḂI4ƥƒⱮıtɱN¦“¤COṙṚ¹`“ÑṂḄẈɼ]ġÐ’b4¤+4Bṙ®Ḣµ€S÷L

Một liên kết đơn âm trả về một danh sách các tỷ lệ theo thứ tự tiếng Anh, tiếng Hy Lạp, tiếng Nga.

Hãy thử trực tuyến!
... hoặc xem một đầu ra được định dạng đầy đủ (bao gồm cả làm tròn ngụ ý đến một chữ số thập phân)

Làm sao?

Chúng tôi muốn có mã mà dịch mỗi nhân vật có thể để một ba của những người thân và số không đại diện cho dù họ thuộc về mỗi người trong số các bảng chữ cái (giống như bảng trong câu hỏi mà C1 0 1). Khi đã xong, chúng ta có thể tính tổng các giá trị này và chia cho độ dài để mang lại các tỷ lệ (giữa 0 và một bao gồm) - đây chỉ là S÷L(nhìn ở bên phải của mã).

Đối với bất kỳ ký tự đã cho nào, chúng tôi biết rằng nếu số thứ tự nhỏ hơn 256 thì nó được tính là tiếng Anh, nếu lớn hơn 1024 thì nó được tính là tiếng Nga và nếu ở giữa 256 và 1024 thì nó được tính là tiếng Hy Lạp. Vì vậy, lấy số nguyên và số nguyên chia cho 256 và sau đó số nguyên chia kết quả cho hai sản lượng 0cho không gian và ký tự Latinh (tính là tiếng Anh), 1cho Hellenic (tính là tiếng Hy Lạp) và 2cho Cyrillic (tính là tiếng Nga). Đây chỉ là O:⁹:2trong Jelly (nhìn ở bên trái của mã).

Nếu chúng ta xoay ba lần bit sao cho bit bảng chữ cái tự nhiên * là đáng kể nhất thì chúng ta có thể mã hóa hai bit thấp hơn (dưới dạng giá trị giữa 0 và ba) trong một bảng tra cứu có ba hàng và sau đó xoay sang phải số tìm thấy ở trên.

Khi chúng ta làm điều này, có hai điều đáng lưu ý - 1. Jelly có một nguyên tử xoay-trái-bởi không phải là xoay-phải-một-một; 2. hàng Hellenic của bảng tra cứu sẽ bắt đầu bằng số 0 (vì Ξchỉ là tiếng Hy Lạp), cản trở mã hóa cơ sở 4 đơn giản (vì các số 0 đứng đầu không thể mã hóa được). Để giảm bớt (1), chúng ta có thể xoay trái sang giá trị phủ định và để giảm bớt (2) chúng ta có thể mã hóa các hàng của mình theo chiều ngược lại và lập chỉ mục cho chúng với số lượng âm. Bằng cách này, chúng ta có thể phủ định cả chỉ mục hàng và cột bằng một byte ( N) do đó các chỉ số hàng và cột của chúng ta có thể được tính bằng O:⁹:2;ON.

Lưu ý rằng Jelly hiện có một nguyên tử lập chỉ mục đa chiều , œị.

Bảng được hình thành từ ba số lớn, một khi được chuyển đổi thành cơ sở bốn, đưa ra các bit thấp hơn cần thiết cho Cyrillic, Hy Lạp và Latin (+ Space) tương ứng. Chúng có độ dài tối thiểu sao cho việc lập chỉ mục mô-đun theo các giá trị thứ tự bị phủ định là có thể - 47, 25 và 30 tương ứng (các .s ở các chỉ mục không được sử dụng):

1: 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 1 3 3 2 3 1 3 3 3 1 3 0 0 0 0 3 0 1 3 0 3 0 0 0 0 0 0
   . . . . . . . . . Я Ю Э Ь Ы Ъ Щ Ш Ч Ц Х Ф У Т С Р П О Н М Л К Й И З Ж Е Д Г В Б А Ё . . . . .

2: 3 2 3 1 0 3 1 3 0 2 3 3 0 0 3 2 3 3 0 0 3 2 3 0 1
   Μ Λ Κ Ι Θ Η Ζ Ε Δ Γ Β Α Ω Ψ Χ Φ Υ Τ Σ . Ρ Π Ο Ξ Ν

3: 3 3 0 0 0 3 0 0 0 3 3 2 3 0 3 0 2 3 0 0 3 0 1 3 3 0 0 3 0 2
   Y X W V U T S R Q P O N M L K J I H G F E D C B A . .   . Z

Ví dụ, hãy xem xét ký tự Φ tại điểm Unicode U + 03A6 (sẽ mang lại [0,1,1]) nó có giá trị thứ tự là (3 × 16² + 10 × 16 + 6 =) 934. ( O:⁹:2có nghĩa là 934 // 256 // 2 =) 1 xác định nó là một phần của khối Hellenic. Sự ;Okết hợp thứ tự cho chúng ta [1,934]Nsau đó phủ nhận cả hai giá trị cho chúng ta [-1,-934]. Vì lập chỉ mục Jelly là cả dựa trên 1 và mô-đun và có ba hàng -1tham chiếu thứ hai trong ba hàng (hàng 2 trong khối mã ở trên), vì hàng giữa có độ dài 25 -934tham chiếu (-934% 25 =) mục thứ 16 trong hàng đó, đó là 2. Đoạn mã sau đó thêm bốn (bit quan trọng nhất) cho chúng ta 6chuyển đổi thành nhị phân là[1,1,0]. Sau đó, mã này xoay bên trái [-1,-934]và lấy phần đầu (tức là phần xoay trái bằng -1, phần xoay phải 1) cho năng suất [0,1,1]theo yêu cầu.

* Tiếng Anh cho không gian vì nó được nhóm với các ký tự Latin


Mã nhận xét

O:⁹:2;ON©œị“...“...“...’b4¤+4Bṙ®Ḣµ€S÷L - Link: list of characters        e.g.: "СЯ"
                                 µ€    - for €ach character:                С       Я
O                                      -   cast to ordinal               1057    1071
  ⁹                                    -   literal 256
 :                                     -   integer division                 4       4
   :2                                  -   integer divide by 2              2       2
      O                                -   cast to ordinal               1057    1071
     ;                                 -   concatenate                  [2,1057] [2,1071]
       N                               -   negate                     [-2,-1057] [-2,-1071]
        ©                              -   copy to register for later
                          ¤            -   nilad followed by link(s) as a nilad:
           “...“...“...’               -     list of integers encoded in base 250 = [4951760157204492290900832256, 1043285073970097, 1081712651052809266]
                        b4             -     convert to base 4                    = [[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,1,3,3,2,3,1,3,3,3,1,3,0,0,0,0,3,0,1,3,0,3,0,0,0,0,0,0],[3,2,3,1,0,3,1,3,0,2,3,3,0,0,3,2,3,3,0,0,3,2,3,0,1],[3,3,0,0,0,3,0,0,0,3,3,2,3,0,3,0,2,3,0,0,3,0,1,3,3,0,0,3,0,2]]
         œị                            -   index into                       2       0                   ^--[-2,-1071]   [-2,-1057]--^
                           +4          -   add four                         6       4
                             B         -   convert to binary             [1,1,0] [1,0,0]
                               ®       -   recall from register       [-2,-1057] [-2,-1071]
                              ṙ        -   rotate left         [[1,0,1],[0,1,1]] [[0,0,1],[1,0,0]]
                                Ḣ      -   head                          [1,0,1] [0,0,1]
                                   S   - sum                                 [1,0,2]
                                     L - length                                 2
                                    ÷  - divide                            [0.5,0,1]
                                       -   i.e.: 50.0% Latin, 0% Greek, 100% Russian

Có vẻ như bạn có một số thuật ngữ ở đó ... "băm" có nghĩa là một cấu trúc như thế (keys)iị(values)Ʋnào?
Erik các Outgolfer

Tôi có nghĩa là hình thành một bộ khóa riêng biệt từ một số thao tác toán học để người ta có thể lập chỉ mục vào một danh sách các giá trị, vâng. Vì vậy, thích ...ị“...hoặc có thể ...ṃ“...(nói đúng ra chuỗi đơn âm tôi hình thành là hàm băm )
Jonathan Allan

@ngn M kebard là Anning
Jonathan Allan

Ồ, tôi biết làm thế nào để khắc phục điều đó! Reconfigure bàn phím của bạn và gõ Cyrillic "у" và "о" thay vì "y" và "o": D
NGN

Tôi chưa bao giờ thấy một câu trả lời Jelly dài như vậy ... công việc tuyệt vời!
simonalexander2005 18/03/18

5

JavaScript (ES6), 197 179 byte

Trả về một mảng 3 tỷ lệ trong [0..1].

s=>[...s].map(_=>(x='b;C6cC6%c>b^[<$]_3--_c_acC-----$+aKHbKK[`H`H]'[(p=s[a='charCodeAt'](l++)%202%116%89)>>1][a]()-36,x/=p&1||8,L+=x/4&1,G+=x/2&1,C+=x&1),l=L=G=C=0)&&[L/l,G/l,C/l]

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

Làm sao?

Chúng tôi sử dụng hàm băm (khá kém hiệu quả) % 202 % 116 % 89để chuyển đổi từng mã ký tự thành một chỉ mục trong [0,88]. Bảng tra cứu tương ứng bao gồm các mục 3 bit trong đó bit # 2 = Latin, bit # 1 = tiếng Hy Lạp và bit # 0 = Cyrillic. Sử dụng chữ số thập phân, điều này mang lại:

76273722773722017732767267300071731711117377737577371111111111000775474476474767744474447

Chúng tôi nối thêm 1để có được số lượng mục nhập chẵn và mã hóa luồng bit này bằng các ký tự ASCII có thể in trong phạm vi [37..99] ( %đến c), với 6 bit dữ liệu tải trọng cho mỗi ký tự.

Điều này dẫn đến chuỗi sau:

b;C6cC6%c>b^[<$]_3--_c_acC-----$+aKHbKK[`H`H]

Phần bù được chọn để tránh các ký tự như \yêu cầu thoát.


3

Ruby , 165 byte

->s{(0..2).map{|x|s.chars.map{|c|o=c.ord;(o<33?7:"ĝ]ē¯]÷W59WUė½ñĝĕ×ßoĝėÏė55#{?!*15}"[o-[913,1040,65][y=o>>7<=>7]].ord+226>>3*-~y)[x]*1.0}.sum/s.size}}

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

Chỉnh sửa: Đánh gôn mã đáng kể và quan trọng nhất là ép 3 chuỗi dịch thành một chuỗi UTF-8. Mã dài hơn ban đầu được giữ bên dưới để dễ đọc và giải thích logic hơn.

Ruby, 211 byte

->s{(0..2).map{|x|s.chars.map{|x|o=x.ord;o<33?7:o<91?"77517117317173771117111773"[o-65]:o<938?"7762737237673276702776722"[o-913]:"74764744444767776757767#{?4*15}"[o-1040]}.inject(0.0){|y,z|y+=z.to_i[x]}/s.size}}

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

Có thể không phải là cách tiếp cận hiệu quả nhất, nhưng thực hiện công việc. Sử dụng bảng dịch cho mỗi bảng chữ cái với sự xuất hiện của ký tự trong các tập lệnh khác nhau được mã hóa bởi các bit của số (theo thứ tự: Latin, Hy Lạp, Nga). Đầu ra là một mảng tỷ lệ phần trăm theo cùng một thứ tự.

Để khắc phục Ёtrường hợp ngoại lệ, tôi đã mở rộng khối 4 chữ chỉ có tiếng Nga từ 10 vị trí ở cuối bảng chữ cái thành 15. Cách này, Ёđược chọn chính xác với chỉ số âm (và chúng tôi không bắt buộc phải xử lý các chữ cái viết thường hơn tương ứng với các chỉ số phụ).


1

Võng mạc 0.8.2 , 230 byte

.+
$&¶$&¶$&¶$&
T`ΓΔΘΛΞΠΣΦΨΩЁБГДЖ-ЙЛПФЦ-Я`_`.+(?=¶.+¶.+$)
T`CDFGJ\LQRSUVWЁБДЖ-ЙС-Я`_`.+(?=¶.+$)
T`DFGIJ\LNQRSUVWZΔΖΘΙΝΞΣΨΩ`_`.+$
¶(.*)
¶$.1$*
1
100$*
.
1
(1+)¶(\1)*1*¶(\1)*1*¶(\1)*1*
$#2 $#3 $#4

Hãy thử trực tuyến! Liên kết bao gồm các trường hợp thử nghiệm. Lưu ý: Đầu ra được giảm xuống% cho một số nguyên, vì việc tăng độ chính xác làm cho tập lệnh quá chậm và nó đã hết thời gian trên TIO.

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.