Thứ tự chữ cái Hungary


19

Đối với những người muốn thử thách nhiều hơn sau đó theo thứ tự bảng chữ cái tiếng Tây Ban Nha cũ , hãy xem cách bảng chữ cái Hungary được sắp xếp.

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

trên thực tế, q, w, xykhông được sử dụng trong các từ Hungary, nhưng họ được bao gồm cho vay mượn và tên nước ngoài. Các ký tự có dấu nước ngoài không phải là một phần của bảng chữ cái Hungary (như ñ), có cùng mức độ ưu tiên như các ký tự không có dấu, nhưng chúng tôi bỏ qua chúng cho thử thách này.

Các quy tắc, tóm tắt:

  • Digraphs ( cs, szv.v.) và trecraft ( dzs) được coi như chúng là chữ cái của riêng chúng.
cudar
cukor
cuppant
csalit
csata
  • Nếu cùng một sơ đồ hoặc bộ ba xảy ra hai lần trực tiếp với nhau trong một từ, chúng được viết theo cách đơn giản: sszthay vì szsz, nhưng ddzsthay vì dzsdzstheo thứ tự chữ cái, thứ tự không đơn giản được sử dụng. Ví dụ kasza< kaszinó< kassza, vì kasszađược sử dụng như k+ a+ sz+ sz+ avì lợi ích của trật tự. Đôi khi bạn có thể tìm thấy phiên bản không hợp đồng trong một từ, trong trường hợp từ ghép.
kasza
kaszinó
kassza
kaszt
nagy
naggyá
nagygyakorlat
naggyal
nagyít
  • viết hoa không thành vấn đề, ngoại trừ khi hai từ này hoàn toàn giống nhau mà không viết hoa, trong trường hợp đó, chữ in thường được ưu tiên
jácint
Jácint
Zoltán
zongora
  • Các phiên bản ngắn và dài nguyên âm có dấu có cùng ưu tiên ( a - á, e -é, i - í, o - ó, ö - ő, u - ú ü - ű), với một ngoại lệ duy nhất: nếu hai từ nếu không sẽ giống hệt nhau, các nguyên âm ngắn có ưu tiên hơn các nguyên âm dài. Lưu ý rằng các nguyên âm có âm sắc ( öü) là các ký tự hoàn toàn khác nhau từ ou.
Eger
egér
író
iroda
irónia
kerek
kerék
kérek
szúr
szül
  • Dấu gạch ngang hoặc dấu cách (ví dụ: trong từ ghép, tên, v.v.) hoàn toàn bị bỏ qua
márvány
márványkő
márvány sírkő
Márvány-tenger
márványtömb

Nhiệm vụ

Chương trình / hàm của bạn nhận được các chuỗi, bao gồm các ký tự từ bảng chữ cái Hungary (cả chữ thường và chữ in hoa), nhưng một chuỗi có thể chứa dấu cách hoặc dấu gạch nối. Để đơn giản, dấu trừ (ASCII 45) có thể được sử dụng làm dấu gạch nối. Lưu ý rằng một số ký tự (như ő) không phải là một phần của ASCII. Bạn có thể sử dụng bất kỳ mã hóa nào bạn muốn, nếu nó hỗ trợ tất cả các ký tự được yêu cầu.

Bạn phải đặt hàng chính xác và hiển thị / trả về kết quả.

Bạn có thể sử dụng bất kỳ tập hợp con được sắp xếp ngẫu nhiên của các ví dụ trên để thử nghiệm.

CHỈNH SỬA:

Vui lòng không sử dụng bất kỳ cách tích hợp hoặc cách nào khác đã biết thứ tự bảng chữ cái Hungary. Nó sẽ làm cho cuộc thi trở nên vô nghĩa, và nhận mọi thách thức từ việc tìm ra biểu thức chính quy tốt nhất hoặc các thủ thuật đánh golf mã tốt nhất.

EDIT2:

Để làm rõ một câu hỏi được làm rõ bởi isaacg: "hai chuỗi chỉ khác nhau theo cách viết hoa và nguyên âm dài so với nguyên âm ngắn, nhưng khác nhau theo cả hai cách": Mặc dù không có quy tắc nào trong tài liệu chính thức giải quyết rõ ràng câu hỏi này, một ví dụ được tìm thấy trong các điểm theo chiều dài nguyên âm có tầm quan trọng hơn chữ viết hoa.


@FryAmTheEggman Bạn thấy điều đó ở đâu?
Morgan Thrapp 11/03/2016

9
Man, tôi thậm chí không thể ghi nhớ thứ tự chữ cái thích hợp của chúng tôi. Làm thế nào tôi sẽ lập trình này? ;)
Andras Deak

1
Tôi đã cố gắng đưa ra một ví dụ liên kết không thành công, trong đó một bản tóm tắt rõ ràng thực sự là hai chữ cái, chẳng hạn như malacsülthoặc nyílászáró. Tôi tự hỏi liệu có bất kỳ (nhưng bạn cần một từ vựng để kiểm tra điều đó, có lẽ không phải là một phần của thử thách này)
Andras Deak

1
Không có ví dụ nào chứa dzs
TheConstructor 11/03/2016

Câu trả lời:


4

Perl, 250

Bao gồm +11 cho -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}<>

Sử dụng trang trí-sort-undecorate thành ngữ (AKA Schwartzian transform ), và đa cấp phân loại , nơi các mức như sau:

  • L1: so sánh các chữ cái cơ sở, bỏ qua dấu phụ, trường hợp và một số dấu câu.
  • L2: so sánh các chữ cái cơ bản và dấu phụ, bỏ qua trường hợp và một số dấu câu.
  • L3: so sánh các chữ cái cơ bản, dấu phụ và trường hợp, bỏ qua một số dấu câu.
  • Ln: so sánh mức byte phá vỡ.

Trong nội bộ, (Dấu tách trường ASCII 0x1C - có giá trị nhỏ hơn bất kỳ ký tự nào trong bảng chữ cái cho thử thách này) được sử dụng làm dấu tách mức.

Việc thực hiện này có nhiều hạn chế, trong số đó:

  • Không hỗ trợ cho các nhân vật nước ngoài.
  • Không thể phân biệt giữa các bản đồ / bản dịch được ký hợp đồng (dài) và phụ âm + bản dịch / bản sao, ví dụ: könnyű nên đối chiếu là <k> <ö> <ny> <ny> <ű> , trong khi tizennyolc nên đối chiếu là <t> i> <z> <e> <n> <ny> <o> <l> <c> ; házszám 'address = house (ház) number (szám)' nên đối chiếu là <h> <á> <z> <sz> <á> <m> và không phải là * <h> <á> <zs> <z> <á> <m> .
  • Đối chiếu cho các bản vẽ dài ký hợp đồng không nhất quán (nhưng nó ổn định): chúng tôi phân tán ở cấp độ giống hệt nhau ( ssz < n szsz, ..., zszs < n zzs ); glibc đối chiếu các biểu mẫu ngắn trước các biểu mẫu đầy đủ ( ssz <szsz, ..., zzs <zszs ), ICU đối chiếu các biểu mẫu dài trước khi các biểu mẫu ngắn bắt đầu tại L3 Case và Biến thể ( szsz < 3 ssz, ..., zszs < 3 zz )

Phiên bản mở rộng:

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

†. Một số thuật toán đối chiếu đa cấp nổi tiếng là Thuật toán đối chiếu Unicode (UCA, Unicode UTS # 10) , ISO 14651 (có sẵn tại trang web ISO ITTF ) các phần LC_COLLATE tại ISO TR 30112 (bản nháp có sẵn tại ISO / IEC JTC1 / Nhà SC35 / WG5 ) đã lỗi thời ISO / IEC TR 14652 (có sẵn tại nhà ISO / IEC JTC1 / SC22 / WG20 ) và LC_COLLATE tại POSIX.

‡. Làm điều này một cách chính xác sẽ yêu cầu một từ điển. Xử lý ICU thật là thú vị nhóm vốn là không co thắt / phi chữ ghép / phi trigraphs, ví dụ như: 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


Bạn sẽ có thể lưu một số byte bằng cách sử dụng RegExp mở rộng của tôi.
TheConstructor 19/03/2016

6

Java 8, 742 byte

Có thể giảm thêm 3 byte khi đặt tên hàm sthay vì sorthoặc 16 byte khác nếu không tính định nghĩa lớp.

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");}}

Có thể được sử dụng như thế này:

new H().sort(list);

Bộ thử nghiệm:

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

năng suất

[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

Ung dung:

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");
    }
}

Tôi đang sử dụng List-type của Java và order()chức năng của nó, nhưng bộ so sánh là tất cả của tôi.


Ấn tượng! Tôi tưởng tượng bạn sẽ có thể bỏ trình xác định loại danh sách <String>và lưu một vài ký tự với chi phí của một vài cảnh báo?
Josh

@Josh nah, nó sẽ tạo ra hai phôi khi Java sẽ suy ra Objectkiểu a và b sau đó. Tôi có lẽ có thể thoát khỏi việc xác định mở rộng tham số chung-lớp String. Ngoài ra tôi không mong đợi có mã ngắn nhất. ;-)
TheConstructor

3

Trăn 3, 70

Đã lưu 8 byte nhờ shooqie.

Tôi yêu Python. : D

Mong đợi một danh sách các chuỗi.

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

3
Đây không phải là một lỗ hổng tiêu chuẩn?
vsz

1
@vsz Không xa như tôi biết. Sử dụng tích hợp là một phần của rất nhiều thách thức.
Morgan Thrapp

1
@vsz Nó có tỷ lệ bỏ phiếu lên xuống quá thấp trên bài đăng sơ hở tiêu chuẩn được tính là một tiêu chuẩn, bạn phải cấm nó một cách rõ ràng.
FryAmTheEggman

1
Ok, làm đi. Tôi đã cân nhắc việc cấm nó một cách rõ ràng nhưng tôi mặc dù rõ ràng là nó sẽ làm cho toàn bộ thách thức trở thành một điểm cần thiết. Tôi xin lỗi vì sự bất tiện.
vsz

1
from locale import*tiết kiệm rất nhiều byte
shooqie
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.