อักขระข้ามตัวอักษร


17

พื้นหลัง

ฉันเห็น Venn Diagram ที่น่าสนใจในวิกิพีเดีย: https://simple.wikipedia.org/wiki/Alphabet#/media/File:Venn_diagram_gr_la_ru.svg

มันแสดงให้เห็นตัวอักษร (รูปร่างทางกายภาพ) ในตัวอักษรที่แตกต่างกันที่มีร่วมกันระหว่างตัวอักษรรัสเซีย, กรีกและละติน

ความท้าทาย

กำหนดสตริงอินพุตของอักขระจากสคริปต์ทั้งสามที่แสดง (เช่นตัวอักษรกรีกตัวอักษร Cyrillic หรือตัวอักษรละติน) ส่งออกเปอร์เซ็นต์ของสตริงที่ตรงกับแต่ละภาษา นับตัวอักษรซ้ำ ๆ ทุกครั้ง

ยกตัวอย่างเช่นเป็นตัวอักษรละตินเท่านั้นดังนั้นผลลัพธ์คือFFLURSFFLURS is 100% Latin, 0% Cyrillic and 0% Greek

ในทางตรงกันข้ามจะเกิดขึ้นอย่างสมบูรณ์ของตัวอักษรที่ปรากฏในทุกภาษาที่สามเพื่อส่งออกเป็นTOX BEAM PHPTOX BEAM PHP is 100% Cyrillic, 100% Greek and 100% Latin

ตารางการค้นหา

แผนภาพ Venn เป็นแหล่งที่มาของตัวอักษรด้านล่าง:

ละตินเท่านั้น:

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

ละตินและซิริลลิก:

C, С

ละตินและกรีก:

I,Ι, N,Ν, Z,Ζ

กรีกและซีริลลิก

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

ทั้งสาม:

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

ที่เหลือ ... เป็นภาษากรีกเท่านั้นหรือ Cyrillic-only

โน๊ตสำคัญ

Unicode กำหนด (ตัวอย่าง) "A" ใน (อย่างน้อย) สามวิธีแยก - หนึ่งวิธีสำหรับแต่ละภาษา สิ่งที่ใช้ในการป้อนข้อมูล (& # 0391, & # 0410 หรือ & # 0041) โปรแกรมควรเข้าใจว่าเป็นการจับคู่ทั้งสามภาษา ดังนั้นA(ละติน), Α(กรีกอัลฟ่า) และА(ซีริลลิก) ควรให้100% Cyrillic, 100% Greek and 100% Latinคำตอบทั้งหมด

รูปแบบอินพุต

สตริงใด ๆ ที่มีเฉพาะА-Я, Α-Ω, A-Zและ(เว้นวรรค) อักขระเหล่านี้สามารถทำซ้ำได้หลายครั้งภายในสตริง

รูปแบบผลลัพธ์

เอาต์พุตสามารถอยู่ในรูปแบบใดก็ได้โดยที่ฟังก์ชันสร้างผลลัพธ์ที่สอดคล้องกัน ฉันต้องการที่จะเห็นผลลัพธ์ในรูปแบบที่ฉันแสดงในตัวอย่างของฉัน ( FFLURS is 100% Latin, 0% Cyrillic and 0% Greek) แต่เพื่อให้ความท้าทายเปิดกว้างสำหรับทุกคนฉันยินดีที่จะยอมรับอาร์เรย์ / สตริงร้อยละ / อัตราส่วน:

[100,0,0],

100 0 0

[1.0 0.0 0.0]

ตราบใดที่มันชัดเจนว่าหมายเลขใดเป็นภาษาใด - ดังนั้นผลลัพธ์ควรสอดคล้องกัน

บางกรณีทดสอบเพิ่มเติม

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

เกณฑ์การชนะ

ใช้กฎและการยกเว้นตามปกติ คำตอบที่สั้นที่สุด (ไบต์) ชนะ

(ลิงก์แซนด์บ็อกซ์: https://codegolf.meta.stackexchange.com/a/14984/62289 )

เพื่อหลีกเลี่ยงข้อสงสัยอักขระ Unicode เท่านั้นที่ใช้ได้ในอินพุตคือ:

  • 0020, 0041-005A (อักษรละติน)
  • 0020, 0391-03A9 (ตัวอักษรกรีก)
  • 0020, 0401, 0410-042F (อักษรซีริลลิก)

แต่ดังที่แสดงในตารางการค้นหาอักขระอาจเป็นตัวอักษรไขว้

เพิ่มตารางของ Jonathan Allan จากความคิดเห็น:

                                                 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
ยินดีต้อนรับสู่ PPCG! นี่เป็นความท้าทายครั้งแรกที่ดี :) หมายเหตุในหมายเหตุ UTF-8 ของคุณ: ไม่ใช่ UTF-8 ซึ่งกำหนดอักขระเหล่านี้ได้หลายรุ่น แต่ Unicode (และ UTF-8 เป็นเพียงวิธีหนึ่งในการเข้ารหัสจุดโค้ด Unicode) นอกจากนี้เนื่องจากส่วนนี้ค่อนข้างสำคัญสำหรับคำตอบที่ถูกต้องคุณอาจต้องการรวมรายการที่ชัดเจนของอักขระ Unicode ทั้งหมดที่ต้องจัดการอย่างถูกต้อง
Martin Ender

@ngn ใช่ขอบคุณ
simonalexander2005

@JanathanAllan, ngn: ฉันเห็นด้วยฉันตั้งใจแค่ตัวอักษรที่อยู่ในแผนภาพ Venn - แต่การแสดงทั้งหมดของตัวอักษรเหล่านั้นใช้ได้ - เหมือนกับที่ฉันพยายามจะพูดในคำถาม
simonalexander2005

ซีริลลิก "เอล" เป็นจริงกรีก "แลมบ์ดา" ซีริลลิก "Pe" คือกรีก "Pi"
simonalexander2005

@JonathanAllan ขึ้นอยู่กับแบบอักษร Cyrillic ЛสามารถดูเหมือนกรีกΛ รูปร่างคล้ายΠเป็นเพียงรูปแบบโวหารอื่น ๆ ของตัวอักษรเดียวกัน
ngn

คำตอบ:


4

เยลลี่ , 56 ไบต์

แฮชอาจสั้นกว่านี้

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

ลิงก์ monadic ส่งคืนรายการจำนวนอัตราส่วนตามลำดับภาษาอังกฤษกรีกรัสเซีย

ลองออนไลน์!
... หรือดูผลลัพธ์ที่จัดรูปแบบเต็มรูปแบบ (รวมถึงการปัดเศษโดยนัยถึงทศนิยมหนึ่งตำแหน่ง)

อย่างไร?

เราต้องการให้โค้ดที่แปลอักขระแต่ละตัวที่เป็นไปได้เป็นสามเท่าของค่าและศูนย์แสดงว่าพวกมันเป็นของตัวอักษรแต่ละตัวหรือไม่ (เหมือนกับตารางในคำถามที่Cมี1 0 1) เมื่อเสร็จแล้วเราสามารถรวมกันข้ามสิ่งเหล่านี้และหารด้วยความยาวเพื่อให้ได้อัตราส่วน (ระหว่างศูนย์และหนึ่งรวม) - นี่เป็นเพียงS÷L(เห็นทางด้านขวาของรหัส)

สำหรับตัวละครที่กำหนดเรารู้ว่าถ้าอันดับน้อยกว่า 256 จะนับเป็นภาษาอังกฤษถ้ามากกว่า 1024 จะนับเป็นรัสเซียและถ้าอยู่ระหว่าง 256 ถึง 1024 จะนับเป็นกรีก เช่นการใช้เลขลำดับและจำนวนเต็มหารด้วย 256 จากนั้นจำนวนเต็มหารผลลัพธ์ด้วยสองอัตราผลตอบแทน0สำหรับช่องว่างและอักขระละติน (นับเป็นภาษาอังกฤษ) 1สำหรับกรีก (นับเป็นกรีก) และ2Cyrillic (นับเป็นรัสเซีย) นี่เป็นเพียงO:⁹:2เจลลี่ (เห็นทางด้านซ้ายของรหัส)

ถ้าเราหมุน triples ของบิตเพื่อให้ตัวอักษรธรรมชาติบิต * สำคัญที่สุดจากนั้นเราสามารถเข้ารหัสสองบิตล่าง (เป็นค่าระหว่างศูนย์และสามรวม) ในตารางการค้นหาที่มีสามแถวแล้วหมุนไปทางขวาโดย ตัวเลขที่พบข้างต้น

เมื่อเราทำสิ่งนี้มีสองสิ่งที่ควรค่าแก่การจดบันทึก - 1. เจลลี่มีอะตอมหมุนซ้าย - ซ้ายไม่ใช่หมุน - ขวา - ทีละ; 2. แถว Hellenic ของตารางการค้นหาจะเริ่มต้นด้วยศูนย์ (เนื่องจากΞเป็นภาษากรีกเท่านั้น) การขัดขวางการเข้ารหัสพื้นฐาน 4 อย่างง่าย (เนื่องจากศูนย์นำหน้าไม่สามารถเข้ารหัสได้) เพื่อบรรเทา (1) เราสามารถหมุนซ้ายด้วยค่าที่ถูกทำให้ยุ่งเหยิงและเพื่อบรรเทา (2) เราสามารถเข้ารหัสแถวของเราในสิ่งที่ตรงกันข้ามและดัชนีลงในพวกเขาด้วยจำนวนลบ วิธีนี้เราสามารถลบล้างทั้งแถวและคอลัมน์ที่มีดัชนี byte เดียว ( N) O:⁹:2;ONเช่นแถวและคอลัมน์ของเราดัชนีอาจจะคำนวณด้วย

œịโปรดทราบว่าวุ้นตอนนี้มีการจัดทำดัชนีอะตอมหลายมิติ

ตารางถูกสร้างจากตัวเลขขนาดใหญ่สามตัวซึ่งเมื่อแปลงเป็นฐานสี่ให้บิตที่ต่ำกว่าที่จำเป็นสำหรับ Cyrillic, กรีกและละติน (+ Space) ตามลำดับ มีความยาวน้อยที่สุดเช่นการจัดทำดัชนีแบบแยกส่วนโดยค่าอันดับที่เป็นลบเป็นไปได้ - 47, 25 และ 30 ตามลำดับ ( .s อยู่ที่ดัชนีที่ไม่ได้ใช้):

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

จากตัวอย่างให้พิจารณาอักขระΦที่ Unicode point U + 03A6 (ซึ่งควรให้ได้[0,1,1]) โดยมีค่าตามลำดับ (3 ×16² + 10 × 16 + 6 =) O:⁹:2934 ( หมายถึง 934 // 256 // 2 =) 1 ระบุว่าเป็นส่วนหนึ่งของบล็อกกรีก ;Oconcatenates ลำดับให้เรา[1,934]และจากนั้นขัดแย้งทั้งสองค่าให้เราN [-1,-934]เนื่องจากการจัดทำดัชนี Jelly นั้นมีทั้งแบบ 1 และโมดูลาร์และมีสามแถวการ-1อ้างอิงที่สองของสามแถว (แถว 2 ในโค้ดบล็อกด้านบน) เนื่องจากแถวกลางมีความยาว 25 การ-934อ้างอิง (-934%) 25 =) 16 TH2รายการในแถวนั้นซึ่งเป็น จากนั้นโค้ดจะเพิ่มสี่ (บิตที่สำคัญที่สุด) 6ซึ่งให้เราแปลงเป็นไบนารี่[1,1,0]. จากนั้นรหัสจะหมุนไปทางซ้ายโดยแต่ละส่วน[-1,-934]และนำส่วนหัว (เช่นการหมุนซ้าย -1, การหมุนขวา 1) ให้ผล[0,1,1]ตามที่ต้องการ

* ภาษาอังกฤษสำหรับเว้นวรรคเนื่องจากมีการจัดกลุ่มด้วยอักขระละติน


รหัสแสดงความคิดเห็น

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

ดูเหมือนว่าคุณจะมีคำศัพท์อยู่ที่นั่น ... "hash" หมายถึงโครงสร้างเหมือน(keys)iị(values)Ʋหรือไม่?
Erik the Outgolfer

ฉันหมายถึงการสร้างชุดคีย์ที่แตกต่างจากการจัดการทางคณิตศาสตร์บางอย่างเพื่อให้สามารถจัดทำดัชนีในรายการค่าใช่ ดังนั้นชอบ...ị“...หรืออาจ...ṃ“...(พูดอย่างเคร่งครัดโซ่ monadic ฉันเกิดขึ้นเป็นฟังก์ชั่นแฮ )
Jonathan Allan

@ngn M kebard กำลังก่อกวน
Jonathan Allan

โอ้ฉันรู้วิธีแก้ไข! กำหนดค่าแป้นพิมพ์ของคุณใหม่และพิมพ์ Cyrillic "у" และ "о" แทน "y" และ "o": D
ngn

ฉันไม่เคยเห็นคำตอบของเจลลี่ที่ยาวขนาดนี้มาก่อน ... ทำได้ดีมาก!
simonalexander2005

5

JavaScript (ES6), 197 179 ไบต์

ส่งคืนอาร์เรย์ 3 อัตราส่วนใน [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]

ลองออนไลน์!

อย่างไร?

เราใช้ฟังก์ชันแฮช (ไม่มีประสิทธิภาพ) % 202 % 116 % 89เพื่อแปลงรหัสอักขระแต่ละตัวเป็นดัชนีใน [0..88] ตารางการค้นหาที่สอดคล้องกันประกอบด้วยรายการ 3 บิตโดยที่บิต # 2 = ละตินบิต # 1 = กรีกและบิต # 0 = ซิริลลิก การใช้ตัวเลขทศนิยมจะทำให้:

76273722773722017732767267300071731711117377737577371111111111000775474476474767744474447

เราเพิ่มส่วนเพิ่มเติม1เพื่อรับจำนวนรายการและเข้ารหัสสตรีมบิตนี้ด้วยอักขระ ASCII ที่พิมพ์ได้ในช่วง [37..99] ( %ถึงc) โดยมีข้อมูล payload 6 บิตต่อตัวอักษร

สิ่งนี้นำไปสู่สตริงต่อไปนี้:

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

ออฟเซ็ตถูกเลือกเพื่อหลีกเลี่ยงอักขระเช่น\ที่จะต้องมีการหลบหนี


3

ทับทิมขนาด 165 ไบต์

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

ลองออนไลน์!

แก้ไข: แปลโค้ดอย่างมีนัยสำคัญและที่สำคัญที่สุดคือบีบลำดับการแปล 3 ลำดับเป็น UTF-8 หนึ่งสตริง รหัสที่ยาวกว่าเดิมจะถูกเก็บไว้ด้านล่างเพื่อให้สามารถอ่านและอธิบายตรรกะได้ดียิ่งขึ้น

Ruby, 211 ไบต์

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

ลองออนไลน์!

อาจไม่ใช่วิธีที่มีประสิทธิภาพที่สุด แต่ทำงานได้ ใช้ตารางการแปลสำหรับตัวอักษรแต่ละตัวที่มีอักขระในสคริปต์ต่าง ๆ ที่เข้ารหัสด้วยบิตของตัวเลข (ตามลำดับ: ละติน, กรีก, รัสเซีย) ผลลัพธ์คืออาร์เรย์ของเปอร์เซ็นต์ในลำดับเดียวกัน

ในการแก้ไขЁกรณีที่ผิดปกติฉันขยายบล็อกภาษารัสเซียอย่างเดียวของ 4-s จาก 10 ตำแหน่งที่ส่วนท้ายของตัวอักษรเป็น 15 ด้วยวิธีนี้Ёได้รับการเลือกอย่างถูกต้องด้วยดัชนีเชิงลบ (และเราไม่จำเป็นต้องจัดการตัวอักษรตัวเล็กกว่า ดัชนีพิเศษเหล่านี้)


1

เรติน่า 0.8.2 , 230 ไบต์

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

ลองออนไลน์! ลิงค์รวมถึงกรณีทดสอบ หมายเหตุ: ผลลัพธ์เป็น% ที่ถูกตัดทอนลงเป็นจำนวนเต็มเนื่องจากการเพิ่มความแม่นยำทำให้สคริปต์ช้าเกินไปและหมดเวลากับ TIO

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