교차 알파벳 문자


17

배경

나는 Wikipedia 에서이 매우 흥미로운 벤 다이어그램을 보았습니다 : https://simple.wikipedia.org/wiki/Alphabet#/media/File:Venn_diagram_gr_la_ru.svg

러시아어, 그리스어 및 라틴어 알파벳 사이에 공통된 다른 알파벳으로 문자 (물리적 모양)를 표시합니다.

도전

표시된 세 가지 스크립트 (예 : 대문자 그리스어, 키릴 문자 또는 라틴 문자) 중 하나에서 입력 된 문자열이 제공되면 각 언어와 일치하는 문자열의 백분율을 출력합니다. 반복되는 글자는 매번 계산됩니다.

예를 들어, FFLURS모든 라틴 전용 문자이므로 출력은 FFLURS is 100% Latin, 0% Cyrillic and 0% Greek입니다.

대조적으로, TOX BEAM PHP세 언어 모두에 나타나는 문자로 완전히 구성되므로 출력은 TOX BEAM PHP is 100% Cyrillic, 100% Greek and 100% Latin입니다.

조회 테이블

벤 다이어그램은 아래 문자의 출처입니다.

라틴어 만 :

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)

나머지는 ... 그리스어 만 또는 키릴 어만입니다.

중요 사항

유니 코드는 (예를 들어) 각 언어마다 하나씩 세 가지 방법으로 "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 )

의심의 여지를 없애기 위해 입력에 유효한 유일한 유니 코드 문자는 다음과 같습니다.

  • 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이 아니라 유니 코드입니다 (UTF-8은 유니 코드 코드 포인트를 인코딩하는 특정 방법 일뿐입니다). 또한이 부분은 정답을 얻는 데 다소 중요하기 때문에 올바르게 처리해야하는 모든 유니 코드 문자의 명시적인 목록을 포함 할 수 있습니다.
Martin Ender

@ngn 예, 감사합니다.
simonalexander2005

@JonathanAllan, ngn : 나는 Venn 다이어그램에있는 글자 만 의도했지만 그 문자의 모든 표현은 유효합니다-질문에서 말하려고하는 것처럼 "A"의 여러 유니 코드 표현이 있습니다.
simonalexander2005

키릴 자모 "El"는 실제로 그리스어 "Lambda"입니다. 키릴 자모 "Pe"는 그리스어 "Pi"입니다.
simonalexander2005

@JonathanAllan 글꼴에 따라 Cyrillic Л는 Greek Λ와 똑같이 보일 수 있습니다. Π 모양은 같은 문자의 또 다른 문체 변형입니다.
ngn

답변:


4

젤리 , 56 바이트

해시는 훨씬 짧을 수 있습니다.

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

영어, 그리스어, 러시아어 순서로 비율 금액 목록을 반환하는 모나드 링크.

온라인으로 사용해보십시오!
... 또는 완전한 형식의 출력을 참조하십시오(암시 적 반올림을 포함하여 소수점 이하 한 자리 포함)

어떻게?

우리는 사람과 그들이 (문제의 테이블과 같은 많은 알파벳의 각에 속하는지 여부를 나타내는 제로의 배에 각각의 가능한 문자 변환 코드를 얻고 자 C입니다 1 0 1). 일단 완료되면 우리는 이것들을 합하고 길이로 나눠서 비율을 산출 할 수 있습니다 (0과 1 사이)-이것은 단지 S÷L코드의 오른쪽에서 볼 수 있습니다.

주어진 문자의 경우 서 수가 256보다 작 으면 영어로 계산되고 1024보다 크면 러시아어로 계산되며 256에서 1024 사이이면 그리스어로 계산됩니다. 따라서 서수와 정수를 256으로 나눈 다음 0공백과 라틴 문자 (영어로 1계산), 그리스어 (그리스로 계산) 및 2키릴 자모 (러시아로 계산 )에 대해 결과를 두 개의 수율 로 나누는 정수로 나눕니다 . 이것은 O:⁹:2젤리에 있습니다 (코드 왼쪽에서 볼 수 있습니다).

자연 알파벳 비트 *가 가장 큰 비트의 트리플을 회전 시키면 3 개의 행이있는 룩업 테이블에서 하위 2 비트 (0에서 3까지의 값)를 인코딩 한 다음 오른쪽으로 회전 할 수 있습니다. 위에서 발견 한 숫자.

우리가 이것을 할 때 주목할 가치가있는 두 가지가 있습니다. 1. 젤리는 오른쪽으로 회전하지 않고 왼쪽으로 회전하는 원자를 가지고 있습니다. 2. 룩업 테이블의 Hellenic 행은 0으로 시작하며 ( Ξ그리스 만이 므로 ) 기본 4 인코딩 (앞의 0은 인코딩 할 수 없으므로)을 방해합니다. (1) 완화 된 값만큼 왼쪽으로 회전하고 완화시키기 위해 (2) 행을 역으로 인코딩하고 음수로 색인화 할 수 있습니다. 이런 식으로 N행과 열 인덱스가로 계산 될 수 있으므로 단일 바이트 ( )로 행과 열 인덱스를 모두 무시할 수 있습니다 O:⁹:2;ON.

Jelly는 이제 다차원 인덱싱 아톰을 갖습니다 œị.

테이블은 3 개의 큰 숫자로 구성되며, 일단베이스 4로 변환되면 키릴 자모, 그리스어 및 라틴어 (+ 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

예를 들어 유니 코드 포인트 U + 03A6에서 문자 Φ를 고려하면 (항복해야하는 [0,1,1]) 서수 값은 (3 × 16² + 10 × 16 + 6 =) 934입니다. ( O:⁹:2934 // 256 // 2 =) 1 그것을 그리스 블록의 일부로 식별합니다. 은 ;O우리를주는 서수을 연결 [1,934]하고는 N그 다음 우리에게주는 두 값을 모두 부정한다 [-1,-934]. 젤리 인덱싱은 1 기반이며 모듈 식이며 3 개의 행이 있으며 3 개의 행 중 -1두 번째 행 (위의 코드 블록에서 2 행)을 참조하십시오. 중간 행의 길이는 25입니다 -934(-934 % 25 =) 해당 행의 16 번째 항목 2. 그런 다음 코드는 4 (가장 중요한 비트)를 추가 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

"해시"는 다음과 같은 구성을 의미 (keys)iị(values)Ʋ합니까?
아웃 골퍼 에릭

나는 어떤 수학적 조작과 구별되는 키 세트를 형성하여 값 목록으로 색인 할 수 있음을 의미합니다. 그래서 ...ị“...또는 아마도 ...ṃ“...(엄격히 말하면 내가 형성 한 수도원 체인은 해시 함수입니다 )
Jonathan Allan

@ngn M kebard는 anning입니다
Jonathan Allan

오, 나는 그것을 고치는 방법을 알고있다! 키보드를 재구성하고 "y"및 "o"대신 Cyrillic "у"및 "о"를 입력하십시오. : D
ngn

나는 그렇게 긴 젤리 대답을 본 적이 없다 ... 훌륭한 직업!
simonalexander2005

5

자바 스크립트 (ES6), 197 179 바이트

[0..1]에 3 개의 비율 배열을 반환합니다.

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]의 색인으로 변환합니다. 해당 룩업 테이블은 비트 # 2 = 라틴어, 비트 # 1 = 그리스어 및 비트 # 0 = 키릴 문자 인 3 비트 항목으로 구성됩니다. 십진수를 사용하여 다음을 제공합니다.

76273722773722017732767267300071731711117377737577371111111111000775474476474767744474447

우리는 1짝수의 엔트리를 얻고 문자 당 6 비트의 페이로드 데이터와 함께 [37..99] ( %에서 c) 범위의 인쇄 가능한 ASCII 문자로이 비트 스트림을 인코딩하기 위해 추가 기능 을 추가합니다 .

이것은 다음 문자열로 이어집니다.

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 문자열로 압축했습니다. 더 긴 원래 코드는 아래에 유지되어 로직의 가독성과 설명을 향상시킵니다.

루비, 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}}

온라인으로 사용해보십시오!

가장 효율적인 방법은 아니지만 일을합니다. 숫자의 비트 (라틴, 그리스어, 러시아어 순서)로 인코딩 된 다른 스크립트에서 문자 발생과 함께 각 알파벳에 대한 변환 표를 사용합니다. 출력은 동일한 순서로 백분율 배열입니다.

특이한 Ё경우 를 고치기 위해 알파벳 끝의 10 위치에서 4의 러시아어 전용 블록을 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.