Çapraz Alfabetik Karakterler


17

Arka fon

Bu çok ilginç Venn Diyagramını wikipedia'da gördüm: https://simple.wikipedia.org/wiki/Alphabet#/media/File:Venn_diagram_gr_la_ru.svg

Rusça, Yunanca ve Latin alfabeleri arasında yaygın olan farklı alfabelerde harfleri (fiziksel şekiller) gösterir.

Meydan okuma

Gösterilen üç komut dosyasından herhangi birinden (yani büyük harflerle yazılmış Yunanca, Kiril veya Latin harfleri) herhangi bir karakter dizesi verildiğinde, her dile uyan dizenin bir yüzdesini çıktılar. Tekrarlanan harfler her seferinde sayılır.

Örneğin FFLURS, tüm karakterler yalnızca latin harfidir, bu nedenle çıktı olur FFLURS is 100% Latin, 0% Cyrillic and 0% Greek.

Aksine, TOX BEAM PHPüç dilde de görünen karakterlerden oluşur, böylece çıktı olur TOX BEAM PHP is 100% Cyrillic, 100% Greek and 100% Latin.

Arama Tabloları

Venn diyagramı aşağıdaki harflerin kaynağıdır:

Yalnızca Latince:

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

Latin ve Kiril:

C, С

Latince ve Yunanca:

I,Ι, N,Ν, Z,Ζ

Yunan ve Kiril

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

Her üçü:

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

Gerisi ... sadece Yunanca ya da Kiril alfabesi.

ÖNEMLİ NOT

Unicode (örneğin) "A" yı (en az) üç ayrı şekilde tanımlar - her dil için bir tane. Girişte hangisi kullanılırsa kullanılsın (& # 0391, & # 0410 veya & # 0041), program bunu üç dilin hepsiyle eşleştiğini anlamalıdır. Yani, A(Latin), Α(Yunan Alfa) ve А(Kiril)100% Cyrillic, 100% Greek and 100% Latin cevap olarak .

Giriş Formatı

Herhangi bir dize münhasıran içeren А-Я, Α-Ω, A-Zve (boşluk). Bu karakterler dize içinde birden çok kez tekrarlanabilir.

Çıkış formatı

Fonksiyonun tutarlı sonuçlar üretmesi koşuluyla çıktı herhangi bir formatta olabilir. Ben ediyorum gibi benim örneklerle (göstermek biçiminde çıkış görmek için FFLURS is 100% Latin, 0% Cyrillic and 0% Greek), ancak herkese meydan daha açık hale getirmek için ben yüzdeler / oranların diziler / dizeleri kabul mutluyum:

[100,0,0],

100 0 0

[1.0 0.0 0.0]

hangi sayının hangi dilde olduğu her zaman açık olduğu sürece çıktı tutarlı olmalıdır.

Biraz daha test vakası

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

Kazanma Kriterleri

Genel kurallar ve istisnalar geçerlidir; en kısa cevap (bayt) kazanır.

(korumalı alan bağlantısı: https://codegolf.meta.stackexchange.com/a/14984/62289 )

Şüpheye yer bırakmamak için girişte geçerli olan sadece Unicode karakterler şunlardır:

  • 0020, 0041-005A (Latin alfabesi)
  • 0020, 0391-03A9 (Yunan alfabesi)
  • 0020, 0401, 0410-042F (Kiril alfabesi)

Ancak, arama tablolarında gösterildiği gibi, karakterler çapraz alfabetik olabilir.

Jonathan Allan'ın tablosunu yorumlardan ekleme:

                                                 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'ye Hoşgeldiniz! Bu güzel bir ilk zorluk. :) UTF-8 notunuzda bir not: bu karakterlerin birden çok sürümünü tanımlayan UTF-8 değil, Unicode (ve UTF-8, Unicode kod noktalarını kodlamanın yalnızca belirli bir yoludur). Ayrıca, bu bölüm yanıtların doğru olması için oldukça önemli olduğundan, doğru bir şekilde ele alınması gereken tüm Unicode karakterlerin açık listesini de eklemek isteyebilirsiniz.
Martin Ender

@ngn evet, teşekkürler.
simonalexander2005

@JonathanAllan, ngn: Katılıyorum, sadece Venn şemasındaki harfleri amaçladım - ancak bu harflerin tüm gösterimleri geçerlidir - soruda söylemeye çalıştığım gibi, "A" nın birden fazla unicode gösterimi var, örneğin
17.08.2018

Kiril "El" aslında Yunanca "Lambda" dır. Kiril "Pe" Yunanca "Pi" dir.
17.08.2018

@JonathanAllan Yazı tipine bağlı olarak Kiril Л tam olarak Yunanca look gibi görünebilir. Like-benzeri şekil, aynı mektubun sadece başka bir stil varyasyonudur.
ngn

Yanıtlar:


4

Jöle , 56 bayt

Bir karma daha kısa olabilir.

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

İngilizce, Yunanca, Rusça düzenindeki oran miktarlarının listesini döndüren monadik bir bağlantı.

Çevrimiçi deneyin!
... veya tam biçimlendirilmiş bir çıktıya bakın (bir ondalık basamağa ima edilen yuvarlama dahil)

Nasıl?

Biz olanları ve onlar (söz konusu tablo gibi çok alfabeler her birine ait olup temsil sıfırların üçlü için olası her karaktere çevirir koduna sahip istiyoruz Colan 1 0 1). Bir kez yapıldıktan sonra bunları toplayabilir ve oranları (sıfır ile bir dahil arasında) vermek için boyuta bölebiliriz - bu sadece S÷L(kodun sağında görülür).

Verilen herhangi bir karakter için Sıra sayısı 256'dan küçükse İngilizce olarak, 1024'ten büyükse Rusça olarak ve 256 ile 1024 arasındaysa Yunanca olarak sayıldığını biliyoruz. Sıralı ve tamsayıyı 256'ya bölen ve daha sonra sonucu 0boşluk ve Latin karakterleri (İngilizce olarak sayın), 1Helenik (Yunanca olarak sayın) ve 2Kiril (Rusça olarak sayın ) için iki verimle bölen tamsayı alır . Bu sadece O:⁹:2Jelly'de (kodun solunda görülür).

Bit üçlülerini doğal alfabe biti * en önemli olacak şekilde döndürürsek, üç satırlı bir arama tablosunda alt iki biti (sıfır ve üç dahil arasındaki değerler olarak) kodlayabilir ve ardından sağa numaralar yukarıda bulundu.

Bunu yaptığımızda dikkat edilmesi gereken iki şey vardır - 1. Jelly'in sağa sola döndürme değil, sola döndürme atomu vardır; 2. Arama tablosunun Helenik sırası sıfır ile başlayacaktır ( Ξsadece Yunanca olduğu için), basit bir base-4 kodlamasını önler (baştaki sıfırlar kodlanamadığı için). (1) 'i hafifletmek için negatif değere göre sola dönebilir ve (2)' yi hafifletmek için sıralarımızı tersine kodlayabilir ve negatif miktarla endeksleyebiliriz. Bu şekilde hem satır hem de sütun dizinini tek bir bayt ( N) ile reddedebiliriz, böylece satır ve sütun dizinlerimiz hesaplanabilir O:⁹:2;ON.

Jelly artık çok boyutlu bir indeksleme atomuna sahip œị.

Tablo, bir kez dördüncü kata dönüştürüldüğünde, sırasıyla Kiril, Yunanca ve Latince (+ Boşluk) için gereken daha düşük bitleri veren üç büyük sayıdan oluşur. Negatif uzunluklar tarafından modüler indeksleme mümkün olacak şekilde minimum uzunluktadırlar - sırasıyla 47, 25 ve 30 ( .s kullanılmayan indekslerde):

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

Örnek olarak, Unicode U + 03A6 noktasındaki character karakterini düşünün (vermesi gerekir [0,1,1]), sıra değeri (3 × 16² + 10 × 16 + 6 =) 934'tür. ( O:⁹:2934 // 256 // 2 =) 1 demektir Yunan bloğunun bir parçası olarak tanımlamak. ;OBize verilen sıralamayı birleştirir [1,934]ve Nsonra bize veren her iki değeri de reddeder [-1,-934]. Jelly indeksleme hem 1 tabanlı hem de modüler olduğundan ve üç satır -1referans olduğundan, üç satırın ikincisi (yukarıdaki kod bloğundaki satır 2), çünkü orta satır 25 uzunluğa sahiptir -934(% -934) 25 =) 16 inci olduğu satır, giriş 2. Kod, daha sonra dört (en önemli bit) bize veren ekler 6olduğunu ikilik biçime dönüştürülüp hangi[1,1,0]. Kod daha sonra bunu her biri tarafından sola döndürür [-1,-934]ve gerektiğinde baş veren (yani -1 ile sola dönüş, 1 ile sağa dönüş) alır [0,1,1].

* Latin karakterleriyle gruplandırıldığından alan için İngilizce


Yorumlanan kod

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

Görünüşe göre orada bir terminoloji var ... "karma" gibi bir yapı anlamına (keys)iị(values)Ʋmı geliyor ?
Outgolfer Erik

Demek istediğim, bir matematiksel manipülasyondan farklı bir anahtar kümesi oluşturmak, böylece bir değerler listesine indekslenebilir, evet. Öyle ...ị“...ya da muhtemelen ...ṃ“...(kesinlikle oluşturduğum monadik zinciri konuşmak bir karma işlevidir )
Jonathan Allan

@ngn M kebard canlanıyor
Jonathan Allan

Oh, bunu nasıl düzeltebileceğimi biliyorum! D: yeniden yapılandırın Klavyeniz ve Kiril "Ó" yerine "y" nin "ï" ve "o" tip
ngn

Daha önce hiç böyle uzun bir Jelly cevabı görmedim ... harika bir iş!
18.08.2018

5

JavaScript (ES6), 197 179 bayt

[0..1] 'de 3 oranlı bir dizi döndürür.

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]

Çevrimiçi deneyin!

Nasıl?

% 202 % 116 % 89Her karakter kodunu [0..88] 'de bir dizine dönüştürmek için (oldukça verimsiz) karma işlevini kullanıyoruz. Karşılık gelen arama tablosu, bit # 2 = Latin, bit # 1 = Yunanca ve bit # 0 = Kiril olan 3 bitlik girişlerden oluşur. Ondalık basamaklar kullanarak, bu:

76273722773722017732767267300071731711117377737577371111111111000775474476474767744474447

1Eşit sayıda giriş almak ve bu bit akışını [37..99] ( %to c) aralığındaki yazdırılabilir ASCII karakterleriyle, karakter başına 6 bit veri yükü ile kodlamak için ekstra bir değer ekliyoruz .

Bu, aşağıdaki dizeye yol açar:

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

Ofset, \kaçmayı gerektirecek karakterlerden kaçınmak için seçildi .


3

Yakut , 165 bayt

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

Çevrimiçi deneyin!

Düzenleme: Kodu önemli ölçüde golf ve en önemlisi, bir UTF-8 dizesine 3 çeviri dizileri sıktı. Daha iyi okunabilirlik ve mantığın açıklaması için orijinal daha uzun kod aşağıda tutulur.

Yakut, 211 bayt

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

Çevrimiçi deneyin!

En etkili yaklaşım olmayabilir, ancak iş de öyle. Her alfabe için, sayının bitleri tarafından kodlanan farklı komut dosyalarında (Latin, Yunanca, Rusça sırasıyla) karakter oluşumunu içeren bir çeviri tablosu kullanır. Çıktı, aynı sırayla bir yüzdeler dizisidir.

Aykırı Ёdurumu düzeltmek için , 4-s'lik sadece Rusça bloğunu alfabenin sonundaki 10 konumdan 15'e uzattım. Bu şekilde, Ёnegatif indeks ile doğru bir şekilde seçilir (ve karşılık gelen harflerden daha küçük harfleri kullanmamız gerekmez) bu ekstra endeksler).


1

Retina 0.8.2 , 230 bayt

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

Çevrimiçi deneyin! Bağlantı, test senaryolarını içerir. Not: Çıktı% olarak bir tamsayıya kısaltılır, çünkü hassasiyeti artırmak komut dosyasını çok yavaşlattı ve TIO'da zaman aşımına uğradı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.