헝가리어 알파벳 순서


19

오래된 스페인어 알파벳 순서 보다 더 많은 도전을 원하는 사람들을 위해 헝가리 알파벳이 어떻게 정렬되는지 살펴 보겠습니다.

a, á, b, c, cs, d, dz, dzs, e, é, f, g, gy, h, i, í, j, k, l, ly, m, n, ny, o, ó, ö, ő, p, q, r, s, sz, t, ty, u, ú, ü, ű, v, w, x, y, z, zs

실제로, q, w, xy헝가리어 단어로 사용되지 않습니다,하지만 그들은 loanwords 외국 이름에 포함되어 있습니다. 헝가리어 알파벳의 일부가 아닌 외국어 발음 문자 (예 :)는 액센트가없는 문자 ñ와 우선 순위가 동일하지만이 문제에 대해서는 무시합니다.

규칙은 다음과 같이 요약됩니다.

  • Digraph ( cs, sz등)와 Trigraph ( dzs)는 자체적으로 글자로 간주됩니다.
cudar
cukor
cuppant
csalit
csata
  • : 같은 소리를 나타내는 두 글자 또는 trigraph 라는 단어의 각 차례로 두 번 직접 발생하는 경우, 그들은 단순화 된 방식으로 작성하는 ssz대신 szsz, ddzs대신 dzsdzs하지만, 알파벳 순서에 대한 비 단순화하기 위해 사용됩니다. 예를 들어 kasza< kaszinó< kassza때문이 kassza로 사용됩니다 k+ a+ sz+ sz+ a정렬을 위해서. 때로는 복합 단어의 경우 비 계약 버전을 단어에서 찾을 수 있습니다.
kasza
kaszinó
kassza
kaszt
nagy
naggyá
nagygyakorlat
naggyal
nagyít
  • 두 단어가 대문자없이 정확히 동일 할 경우를 제외하고 대문자는 중요하지 않습니다.이 경우 소문자가 우선합니다
jácint
Jácint
Zoltán
zongora
  • 악센트 모음의 짧고 긴 버전이 우선 순위가 같은 ( a - á, e -é, i - í, o - ó, ö - ő, u - ú ü - ű), 하나의 예외 : 두 단어 그렇지 않으면 정확하게 일치한다면, 짧은 모음은 장모음 우선 순위를 가지고있다. 참고 움라우트 (과 모음 것을 ö하고 ü) 전혀 다른 문자는 ou.
Eger
egér
író
iroda
irónia
kerek
kerék
kérek
szúr
szül
  • 하이픈 또는 공백 (예 : 복합 단어, 이름 등)은 완전히 무시됩니다.
márvány
márványkő
márvány sírkő
Márvány-tenger
márványtömb

작업

프로그램 / 함수는 헝가리어 알파벳 (소문자와 대문자)으로 구성된 문자열을 받지만 문자열에는 공백이나 하이픈이 포함될 수 있습니다. 간단히하기 위해 빼기 부호 (ASCII 45)를 하이픈으로 사용할 수 있습니다. 와 같은 일부 문자 ő는 ASCII의 일부가 아닙니다. 필요한 모든 문자를 지원하는 경우 원하는 인코딩을 사용할 수 있습니다.

라인을 올바르게 주문하고 결과를 표시 / 반환해야합니다.

테스트를 위해 위의 예제 중 임의 순서로 하위 집합을 사용할 수 있습니다.

편집하다:

헝가리어 알파벳 순서를 이미 알고있는 내장 또는 다른 방법을 사용하지 마십시오. 그것은 경쟁을 무의미하게 만들고 최고의 정규 표현이나 최고의 코드 골프 트릭을 찾는 데 모든 어려움을 겪습니다.

EDIT2 :

isaacg가 요청한 설명을 명확하게하기 위해 : "대문자와 긴 모음과 짧은 모음 만 다르지만 두 가지 방식이 다른 두 줄": 공식 문서 에서이 질문을 명시 적으로 다루는 규칙은 없지만 길이에 대한 예제 모음보다 대문자보다 더 중요합니다.


@FryAmTheEggman 어디서 볼 수 있습니까?
Morgan Thrapp

9
남자, 나는 우리의 올바른 알파벳 순서를 암기조차 할 수 없습니다. 이것을 어떻게 프로그래밍 할 것입니까? ;)
Andras Deak

1
나는 명백한 소리를 나타내는 두 글자가 실제로 같은 두 글자 인 바운드 - 투 - 실패 반례로 마련하려고했는데 malacsültnyílászáró. (어쩌면이 도전의 일부가 아닌 것을 확인하기 위해 어휘가 필요합니다.)
Andras Deak

1
dzs를 포함하는 예는 없습니다
TheConstructor

답변:


4

펄, 250

에 +11이 포함됩니다 -Mutf8 -CS.

use Unicode::Normalize;$r="(?=cs|zs|dz|sz|[glnt]y)";print map/\PC*
/g,sort map{$d=$_;s/d\Kd(zs)|(.)\K$r\2(.)/\L$+\E$&/gi;s/d\Kzs/~$&/gi;s/$r.\K./~$&/gi;s/(\p{Ll}*)(\w?)\s*-*/\U$1\L$2/g;$c=$_;$b=$_=NFD lc;y/̈̋/~~/d;join$;,$_,$b,$c,$d}<>

용도 장식-정렬 undecorate 관용구 (AKA 찌언 변환 ) 및 멀티 레벨 정렬 수준이 있습니다 :

  • L1 : 기본 문자를 비교하고 분음 부호, 대소 문자 및 구두점을 무시합니다.
  • L2 : 기본 글자와 분음 부호를 비교하고 대소 문자와 구두점을 무시합니다.
  • L3 : 기본 글자, 분음 부호 및 대소 문자를 비교하고 구두점을 무시하십시오.
  • Ln : 타이-바이트 바이트 수준 비교.

내부적으로 (ASCII 0x1C 필드 구분 기호-이 챌린지의 알파벳 문자보다 작은 값) 레벨 구분 기호로 사용됩니다.

이 구현에는 다음과 같은 많은 제한이 있습니다.

  • 외국 문자를 지원하지 않습니다.
  • 수축 geminated (긴) 이중 음자 / trigraph를, 그리고 자음과 명확하지 + 이중 음자 /의 trigraph는, 예를 들어 수 könnyű은 으로 대조한다 <K> <O> <NY> <NY> <U> 반면 tizennyolc이 같은 대조한다 <t> < i> z <e> <n> <l> c ; házszám '주소 = 집 (ház) 번호 (szám)'는 * <h> <á> <zs> <z>가 아니라 <h> <á> <z> <sz> <á> <m> 로 정렬되어야합니다. <á> <m> .
  • 장기 계약의 장기 데이터 정렬은 일관 적이 지 않지만 (안정적 임) : 동일한 수준에서 명확하게 구분됩니다 ( ssz < n szsz, ..., zszs < n zzs ). glibc는 전체 형식 ( ssz <szsz, ..., zzs <zszs ) 전에 짧은 형식을 대조하고, ICU는 L3 Case 및 Variants ( szsz < 3 ssz, ..., zszs < 3 zzs )

확장 버전 :

use Unicode::Normalize;

$r="(?=cs|zs|dz|sz|[glnt]y)";   # look-ahead for digraphs

print map/\PC*\n/g,             # undecorate
  sort                          # sort
  map{                          # decorate

          $d=$_;                # Ln: identical level

          # expand contracted digraphs and trigraphs
          s/d\Kd(zs)|(.)\K$r\2(.)/\L$+\E$&/gi;

          # transform digraphs and trigraphs so they 
          #  sort correctly
          s/d\Kzs/~$&/gi;s/$r.\K./~$&/gi;

          # swap case, so lower sorts before upper
          # also, get rid of space, hyphen, and newline
          s/(\p{Ll}*)(\w?)\s*-*/\U$1\L$2/g;

          $c=$_;                # L3: Case

          $b=$_=NFD lc;         # L2: Diacritics

          # transform öő|üű so they sort correctly
          # ignore diacritics (acute) at this level
          y/\x{308}\x{30b}\x{301}/~~/d;

                                # L1: Base characters
          join$;,$_,$b,$c,$d
  }<>

†. 잘 알려진 일부 다중 레벨 조합 알고리즘은 Unicode Collation Algorithm (UCA, Unicode UTS # 10) , ISO 14651 ( ISO ITTF 사이트 에서 사용 가능 ) , ISO TR 30112의 LC_COLLATE 부품 ( ISO / IEC JTC1 / 에서 제공되는 초안)입니다. SC35 / WG5 홈 ) : ISO / IEC TR 14652 ( ISO / IEC JTC1 / SC22 / WG20 홈에서 사용 가능 ) 및 POSIX에서 LC_COLLATE를 폐기합니다 .

‡. 이 작업을 올바르게 수행하려면 사전이 필요합니다. ICU는 이상하게 대문자로 된 그룹을 비 계약 / 비 인구 / 비 기록으로 취급합니다. 예 : ccS < 3 CcS < 3 c Cs < 3 c CS < 3 C Cs < 3 cS < 3 cs < 3 Cs < 3 CS < 3 ccs < 3 Ccs < 3 CCS


내 확장 RegExp를 사용하여 일부 바이트를 저장할 수 있어야합니다.
생성자

6

자바 8, 742 바이트

기능을 명명 다른 3 바이트로 줄일 수있는 s대신에 sort또는 다른 16 바이트 클래스 정의를 계산하지 경우.

public class H{String d="cs|dzs?|gy|ly|sz|ty|zs";void sort(java.util.List<String>l){l.sort((a,b)->{String o="-a-á-b-cs-dzs-e-é-f-gy-h-i-í-j-k-ly-m-ny-o-ó-ö-ő-p-q-r-sz-ty-u-ú-ü-ű-v-w-x-y-zs-";int i=c(r(a),r(b),r(o));return i!=0?i:(i=c(a,b,o))!=0?i:b.charAt(0)-a.charAt(0);});}String r(String a){for(int i=0;i<8;i++)a=a.toLowerCase().replace("ááéíóőúű".charAt(i),"aaeioöuü".charAt(i));return a;}int c(String a,String b,String o){a=n(a);b=n(b);while(!"".equals(a+b)){int i=p(a,o),j=p(b,o);if(i!=j)return i-j;a=a.substring(i%4);b=b.substring(j%4);}return 0;}int p(String a,String o){a=(a+1).replaceAll("("+d+"|.).*","-$1");return o.indexOf(a)*4+a.length()-1;}String n(String a){return a.toLowerCase().replaceAll("(.)(?=\\1)("+d+")| |-","$2$2");}}

다음과 같이 사용할 수 있습니다 :

new H().sort(list);

시험 스위트 :

public static void main(String[] args) {
    test(Arrays.asList("cudar", "cukor", "cuppant", "csalit", "csata"));
    test(Arrays.asList("kasza", "kaszinó", "kassza", "kaszt", "nagy", "naggyá", "nagygyakorlat", "naggyal",
            "nagyít"));
    test(Arrays.asList("jácint", "Jácint", "Zoltán", "zongora"));
    test(Arrays.asList("Eger", "egér", "író", "iroda", "irónia", "kerek", "kerék", "kérek", "szúr", "szül"));
    test(Arrays.asList("márvány", "márványkő", "márvány sírkő", "Márvány-tenger", "márványtömb"));
}

private static void test(final List<String> input) {
    final ArrayList<String> random = randomize(input);
    System.out.print(input + " -> " + random);
    new H().sort(random);
    System.out.println(" -> " + random + " -> " + input.equals(random));
}

private static ArrayList<String> randomize(final List<String> input) {
    final ArrayList<String> temp = new ArrayList<>(input);
    final ArrayList<String> randomOrder = new ArrayList<>(input.size());
    final Random r = new Random();
    for (int i = 0; i < input.size(); i++) {
        randomOrder.add(temp.remove(r.nextInt(temp.size())));
    }
    return randomOrder;
}

굽힐 수 있는

[cudar, cukor, cuppant, csalit, csata] -> [csata, cudar, cuppant, csalit, cukor] -> [cudar, cukor, cuppant, csalit, csata] -> true
[kasza, kaszinó, kassza, kaszt, nagy, naggyá, nagygyakorlat, naggyal, nagyít] -> [naggyá, kassza, kaszinó, nagygyakorlat, nagyít, nagy, kaszt, kasza, naggyal] -> [kasza, kaszinó, kassza, kaszt, nagy, naggyá, nagygyakorlat, naggyal, nagyít] -> true
[jácint, Jácint, Zoltán, zongora] -> [Zoltán, jácint, zongora, Jácint] -> [jácint, Jácint, Zoltán, zongora] -> true
[Eger, egér, író, iroda, irónia, kerek, kerék, kérek, szúr, szül] -> [egér, Eger, kerék, iroda, író, kerek, kérek, szúr, irónia, szül] -> [Eger, egér, író, iroda, irónia, kerek, kerék, kérek, szúr, szül] -> true
[márvány, márványkő, márvány sírkő, Márvány-tenger, márványtömb] -> [márványtömb, márványkő, Márvány-tenger, márvány sírkő, márvány] -> [márvány, márványkő, márvány sírkő, Márvány-tenger, márványtömb] -> true

언 골프 드 :

public class HungarianOrder {

    String d = "cs|dzs?|gy|ly|sz|ty|zs";

    void sort(java.util.List<String> l) {
        l.sort((a, b) -> {
            String o = "-a-á-b-cs-dzs-e-é-f-gy-h-i-í-j-k-ly-m-ny-o-ó-ö-ő-p-q-r-sz-ty-u-ú-ü-ű-v-w-x-y-zs-";
            int i = c(r(a), r(b), r(o));
            return i != 0 ? i
                    : (i = c(a, b, o)) != 0 ? i
                            : b.charAt(0) - a.charAt(0);
        });
    }

    // toLower + remove long accent
    String r(String a) {
        for (int i = 0; i < 8; i++)
            a = a.toLowerCase().replace("ááéíóőúű".charAt(i), "aaeioöuü".charAt(i));
        return a;
    }

    // iterate over a and b comparing positions of chars in o
    int c(String a, String b, String o) {
        a = n(a);
        b = n(b);
        while (!"".equals(a + b)) {
            int i = p(a, o), j = p(b, o);
            if (i != j)
                return i - j;
            a = a.substring(i % 4);
            b = b.substring(j % 4);
        }
        return 0;
    }

    // find index in o, then looking if following characters match
    // return is index * 4 + length of match; if String is empty or first character is unknown -1 is returned
    int p(String a, String o) {
        a = (a+1).replaceAll("("+d+"|.).*", "-$1");
        return o.indexOf(a) * 4 + a.length() - 1;
    }

    // expand ddz -> dzdz and such
    String n(String a) {
        return a.toLowerCase().replaceAll("(.)(?=\\1)("+ d +")| |-", "$2$2");
    }
}

Java의 List유형과 기능을 사용하고 order()있지만 비교기는 모두 내 것입니다.


감동적인! 목록 유형 지정자를 삭제하고 <String>몇 번의 경고 비용으로 몇 개의 문자를 저장할 수 있어야한다고 생각 하십니까?
Josh

@Josh nah, Java가 Objecta 및 b 유형으로 유추하는 것처럼 두 개의 캐스트를 생성 합니다. 그래도 아마도 class-generic-parameter extending을 정의 할 수 있습니다 String. 또한 가장 짧은 코드를 기대하지 않습니다. ;-)
The Constructor

3

파이썬 3, 70

shooqie 덕분에 8 바이트가 절약되었습니다.

저는 파이썬을 좋아합니다. :디

문자열 목록이 필요합니다.

from locale import*;setlocale(0,'hu')
f=lambda x:sorted(x,key=strxfrm)

3
이것이 표준 허점이 아닌가?
vsz

1
@vsz 내가 아는 한. 내장을 사용하는 것은 많은 도전의 일부입니다.
Morgan Thrapp

1
@vsz 표준 허점 포스트에서 최대 / 하향 투표 비율이 너무 낮아 표준으로 계산할 수 없으므로 명시 적으로 금지해야합니다.
FryAmTheEggman

1
알았어 나는 그것을 명시 적으로 금지하는 것을 고려했지만 전체 도전을 혼란에 빠뜨릴 것임은 분명합니다. 불편을 드려 죄송합니다.
vsz

1
from locale import*많은 바이트 절약
shooqie
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.