Codegolf — Создание Корейского Персонажа В Нескольких Стилях Ascii/Box Art

  • Автор темы Ikobod
  • Обновлено
  • 22, Oct 2024
  • #1

О хангыле

Поскольку я кореец, я очень горжусь корейским характером. хангыль(한글).

Хангыль — слоговое письмо, изобретенное королем Седжоном, великим, четвертым королем династии Чосон, в 1443 году.

Поскольку сегодня (9 октября) в Корее день хангыля, я дам вам задание: приготовить немного хангыля.

Список персонажей

Итак, чтобы создать искусство ASCII, вы должны знать, что каждый символ представляет каждый слог, верно?

Нет. В корейском иероглифе 11172 слога, поэтому жестко закодировать его практически невозможно. Но основных символов всего 24:

 
 
 
 
 
  _ _||  ||||||  ────│ │
| | ||  [][]||  ╱│╱││ │
|_|_||  """"||  ││││├─┤
____||  ____||   ╷  │ │

|--||   |--||  ─┴──│ │

_ __    _ __    ─┐─┐

]__     ]][    ┌┘ │

[_()    [_""    └─ ╵
 

А по-корейски вы составляете все эти слоги.

Как составить

24 основных символа можно разделить на две части: согласную и гласную.

Первые 14 символов 뛟쀒3쫽 are consonants, and followingthe 10 characters __ | ---. │ │ ____|_ : │ ├─ () | : └── │ | ---- │ | ---. ───┐ | .--' ┌──┘ |__ '--- └─── являются гласными.

Корейский иероглиф состоит примерно из трех частей: начальная согласная, гласная и конечная согласная.

Начальная согласная

Начальная согласная (초성 по-корейски) — самая простая часть. Оно как раз созвучно, только с 1한2글3날 (double consonant). It placed in the top-left.

Гласный

Гласная (중성 или 모음 по-корейски) — самая сложная часть. Вот список гласных: ㄱ ───┐ │ │ ㄴ │ │ └── ㄷ ┌─── │ └─── ㄹ ───┐ ┌──┘ └─── ㅁ ┌──┐ │ │ └──┘ ㅂ │ │ ├──┤ └──┘ ㅅ ╱╲ │ │ │ │ ㅇ ?──╮ │ │ ╰──╯ ㅈ ──── ╱╲ ╱ ╲ ㅊ ── ──── ╱ ╲ ㅋ ───┐ ───┤ │ ㅌ ┌─── ├─── └─── ㅍ ─┬┬─ ││ ─┴┴─ ㅎ ── ──── () ㄲ ─┐─┐ │ │ │ │ ㄸ ┌─┌─ │ │ └─└─ ㅃ ││││ ├┤├┤ └┘└┘ ㅆ ╱│╱│ ││││ ││││ ㅉ ──── ╱│╱│ ││││ ㅏ │ ├─ │ │ ㅐ │ │ ├─┤ │ │ │ │ ㅑ │ ├─ ├─ │ ㅒ │ │ ├─┤ ├─┤ │ │ ㅓ │ ─┤ │ │ ㅔ ││ ─┤│ ││ ││ ㅕ │ ─┤ ─┤ │ ㅖ ││ ─┤│ ─┤│ ││ ㅗ ╷ ─┴── ㅘ │ │ ├─ ╷ │ ─┴──│ ㅙ │ │ │ │ ├─┤ ╷ │ │ ─┴──│ │ ㅚ │ │ │ ╷ │ ─┴──│ ㅛ ╷╷ ─┴┴─ ㅜ ─┬── ╵ ㅝ │ │ │ ─┬──│ ╵──┤ ㅞ ││ ││ ││ ─┬──││ ╵──┤│ ㅟ │ │ │ ─┬──│ ╵ │ ㅠ ─┬┬─ ╵╵ ㅡ ──── ㅢ │ │ │ │ ────│ ㅣ │ │ │ │ ㄳ ─┐?╮ │││ │││ ㄵ ╷ ── │ ╱│ └─╵╵ ㄶ │ ── │ ── └─() ㄺ ─┐─┐ ┌┘ │ └─ ╵ ㄻ ─┐┌┐ ┌┘││ └─└┘ ㄼ ─┐╷╷ ┌┘├┤ └─└┘ ㄽ ─┐?╮ ┌┘││ └─╵╵ ㄾ ─┐┌─ ┌┘├─ └─└─ ㄿ ─┐┬┬ ┌┘││ └─┴┴ ㅀ ─┐── ┌┘── └─()

ㄱ ---. : : ㄴ : : '--- ㄷ .--- : '--- ㄹ ---. .--' '--- ㅁ .--. : : '--' ㅂ : : :--: '--' ㅅ ,. : : : : ㅇ .. ( ) '' ㅈ -.,- ;: ' ` ㅊ -- -,.- ; : ㅋ ---. ---: : ㅌ .--- :--- '--- ㅍ -..- :: -''- ㅎ -- ---- () ㄲ -.-. : : : : ㄸ .-.- : : '-'- ㅃ :::: [][] '''' ㅆ ,:,: :::: :::: ㅉ ---- ,:,: :::: ㅏ : :- : : ㅐ : : :-: : : : : ㅑ : :- :- : ㅒ : : :-: :-: : : ㅓ : -: : : ㅔ :: -:: :: :: ㅕ : -: -: : ㅖ :: -:: -:: :: ㅗ : -^-- ㅘ : : :- : : -^--: ㅙ : : : : :-: : : : -^--: : ㅚ : : : : : -^--: ㅛ :: -^^- ㅜ -v-- : ㅝ : : : -v--: :--: ㅞ :: :: :: -v--:: :--:: ㅟ : : : -v--: : : ㅠ -vv- :: ㅡ ---- ㅢ : : : : ----: ㅣ : : : : ㄳ -.,: ::: ::: ㄵ : -- : ,: '-:: ㄶ : -- : -- '-() ㄺ -.-. .' : '- : ㄻ -... .':: '-'' ㄼ -.:: .'][ '-'' ㄽ -.,: .':: '-:: ㄾ -..- .':- '-'- ㄿ -... .'][ '-'' ㅀ -.-- .'-- '-() go on the right side of initial consonant; ㄱ ___ | | ㄴ | | |__ ㄷ ___ | |___ ㄹ ___ __| |___ ㅁ __ | | |__| ㅂ | | |__| |__| ㅅ /\ | | | | ㅇ __ / \ \__/ ㅈ ____ /\ / \ ㅊ __ ____ / \ ㅋ ___ ___| | ㅌ ___ |___ |___ ㅍ ____ || _;;_ ㅎ __ ____ () ㄲ _ _ | | | | ㄸ _ _ | | |_|_ ㅃ |||| [][] """" ㅆ /|/| |||| |||| ㅉ ____ /|/| |||| ㅏ | |_ | | ㅐ | | |_| | | | | ㅑ | |_ |_ | ㅒ | | |_| |_| | | ㅓ | _| | | ㅔ || _|| || || ㅕ | _| _| | ㅖ || _|| _|| || ㅗ | _|__ ㅘ | | |_ | | _|__| ㅙ | | | | |_| | | | _|__| | ㅚ | | | | | _|__| ㅛ || _][_ ㅜ ____ | ㅝ | | | ____| |--| ㅞ || || || ____|| |--|| ㅟ | | | ____| | | ㅠ ____ || ㅡ ____ ㅢ | | | | ____| ㅣ | | | | ㄳ _ /| ||| ||| ㄵ | __ | /| |_|| ㄶ | __ | __ |_() ㄺ _ _ ] | [_ | ㄻ _ ++ ]|| [_"" ㄼ _ || ][] [_"" ㄽ _ /| ]|| [_|| ㄾ _ _ ]|_ [_|_ ㄿ _ __ ]][ [_"" ㅀ _ __ ]__ [_() идти внизу; 한3글날 are both. For example: 1한2글3날 .

Конечная согласная

Последняя согласная (종성 по-корейски) находится внизу. Вот список последних согласных: 1 , or blank.

Примеры символов, использующих конечную согласную: ㅗㅛㅜㅠㅡ

Как разложить Юникод

Видеть эта веб-страница за помощью.

Испытание

Ввод имеет такой формат: 3 Where (number) is optional. If a number is given, switch to a different style as specified below. 2 и 1 are ASCII only, and (number) Korean char (number) Korean char ... это бокс-арт в формате Unicode.

Разделяйте символы двумя пробелами. Обратите внимание, что не все символы имеют одинаковую ширину.

Если гласная не 각, 갌, 갏 , the following final consonant must be indented with a space.

Стиль по умолчанию: ㄱㄲㄳㄴㄵㄶㄷㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅄㅅㅆㅇㅈㅊㅋㅌㅍㅎ , so if first character doesn't have a number, style 1 is used.

Пример ввода может быть: 가, 고, 과 or ㅘㅙㅚㅝㅞㅟㅢ .

Вот список корейского искусства ascii (стили 1 и 2).

Вот список корейских бокс-артов в Юникоде (стиль 3).

Список изображений ASCII

Стиль 1

ㅗㅛㅜㅠㅡ

Стиль 2

ㅏㅐㅏㅒㅓㅔㅕㅖㅣ

Стиль 3

ㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣ

Пример ввода и вывода

ㄲㄸㅃㅆㅉ

ㅏㅑㅓㅕㅗㅛㅜㅠㅡㅣ

ㄱㄴㄷㄹㅁㅂㅅㅇㅈㅊㅋㅌㅍㅎ

ㄱㄴㄷㄹㅁㅂㅅㅇㅈㅊㅋㅌㅍㅎㅏㅑㅓㅕㅗㅛㅜㅠㅡㅣ

Подсчет очков

Это , поэтому побеждает самый короткий код в байтах.

#ascii-art #code-golf #code-golf #ascii-art

Ikobod


Рег
02 Feb, 2011

Тем
78

Постов
184

Баллов
604
  • 26, Oct 2024
  • #2

С, 1832 байта

Что ж, я впервые играю в гольф, и это, пожалуй, самый уродливый код, который я когда-либо писал:

(скомпилировано с помощью gcc 7.5.0)

 main 

Он работает только со стилем 2; задача уже была для меня достаточно сложной, даже без необходимости поддерживать все три стиля! Однако это досадно, потому что я действительно влюблен в очаровательную ASCII-иллюстрацию, созданную ОП (кстати, они забыли предоставить иллюстрацию для ㅃ jamo, поэтому я сделал ее сам).

Посмотреть проект можно здесь: https://repl.it/@Mahkoe/hangul-ASCII-art

Краткие подсказки для понимания кода

  • Это приводит к интенсивному использованию escape-последовательностей ANSI для перемещения курсора. T macro moves the cursor up by x персонажи и w macro moves the cursor left by W символы затем уменьшаются на один. ( T stands for "up", and S означает «мот», что по-французски означает «слово»).
  • Потому что R appeared enough times, I defined Q к P ( A ничего не означает, это был всего лишь один из немногих оставшихся односимвольных идентификаторов).
  • V function reads stdin and parses out a UTF-8 sequence. It correctly returns EOF when it sees one.
  • U and A макросы используются для сокращения регистров в операторах переключения в V function.
  • U string contains all the tail consonants (copy-paste the string to a text file and break it into three 30-character wide lines to see it better). They are ordered according to increasing UTF-8 codepage addresses. (I originally called this string p потому что раньше в нем были только головные согласные, но название закрепилось даже после того, как я передумал и вставил хвостовые согласные).
  • Некоторые согласные являются только головными (ㄸ, ㅃ и ㅉ), поэтому я прикрепил их к «правой части» буквы. H . The p Массив представляет собой сопоставление числа согласных головы с позицией в H string. (I originally called this array H потому что я думал об этом как о перестановке, но название прижилось после того, как я понял, что на самом деле это не перестановка).
  • У гласных было так много особых случаев, что мне пришлось разделить гласную на три действия: «нижнее» (все, что окажется между головными и хвостовыми согласными), остальная часть гласной и любые корректировки, необходимые для курсора после рисуем хвостовую согласную. Эти три величины хранятся в H , g , и c strings, respectively.
  • Если что-нибудь появлялось достаточно часто в C , g , или l strings, I made a macro for it. This consists of the U(4) , l , U(4) , M , U , n , M(n) , и n macros (I started having name collisions, which is why the macro name pattern breaks after U(n) ).
  • Все вместе, #define C(x,y)case 0x##x:y;break; #define c(x)case x:r=r<<6|getchar()&63; #define F(x,n)for(x=0;x<n;x++) #define M(n)"\e["#n"D\e[B" #define m M(1) #define U(n)"\e["#n"A" #define l U(4) char p[]={0,1,3,6,27,7,15,16,28,18,19,20,21,29,22,23,24,25,26},*H="---.-.-.-.,:: : --: --.------.-.-.-...-.::-.,:-..--...-.--.--.: :::,: ,. ,:,: .. -.,- -- ---..----..- -- .-.-::::---- : : : :::: : ,:: --: .--'.' :.'::.'][.'::.':-.'][.'--: ::--:[]::: :::::( ) ;: -,.----::--- :: ----: : [][],:,: : : : :::'---'-::'-()'---'---'- :'-'''-'''-::'-'-'-'''-()'--''--'''::: ::::: '' ' `; : :'----''- () '-'-''''::::",*B=M(4), #define P " "U(3) #define Q " :"M(2)"-^--"l *U[]={P,P,P,P,P,P,P,P,Q,Q,Q,Q," ::"M(3)"-^^-"l,"-v--"M(4)" : "l,"-v--"M(4)" :--"l,"-v--"M(4)" :--"l,"-v--"M(4)" : "l,"-vv-"M(4)" :: "l,"----"," "M(4)"----"U(4),P}, #define X(x,y)x y x #define Y(x,y)x y y #define Z(x,y)x x y x #define R "\e[4B"M(4) #define S Z(":"m,":"m)":"M(4) *V[]={X(":"m,":-"M(2))":"M(4),X(": :"M(3),":-:"M(3))": :"M(6),Y(":"m,":-"M(2))":"M(4),Y(": :"M(3),":-:"M(3))": :"M(6),X(" :"M(2),"-:"M(2))" :"M(5),X(" ::"M(3),"-::"M(3))" ::"M(6),Y(" :"M(2),"-:"M(2))" :"M(5),Y(" ::"M(3),"-::"M(3))" ::"M(6),R,Z(":"m,":-"M(2))":"M(4),Z(": :"M(3),":-:"M(3))": :"M(6),S,R,R,S,Z("::"M(2),"::"M(2))"::"M(5),S,R,M(4),S,Z(":"m,":"m)"\e[3D"}, #define w(m,n)"\e["#m"C"U(n) #define T w(7,7) #define W w(8,7) #define x w(6,8) *A[]={T,W,T,W,T,W,T,W,x,w(7,8),w(7,8),x,x,x,x,w(7,8),x,x,x,x,x}; #define D(x) printf(x); g(){int r=getchar(),n=~0;switch(r>>4){C(f,n=7)C(e,n=15)C(d,C(c,n=31))}r&=n;switch(n){c(7)c(15)c(31)}return r;}main(){D("\e[2J\e[H")int n,j,k,t,v,h;while(~(n=g())){if(n>>8){n-=44032;t=n%28;v=n/28%21;h=p[n/588];F(j,3){F(k,4)putchar(H[(j*30+h)*4+k]);D(B)}D(U[v])D(V[v])if(t--)F(j,3){F(k,4)putchar(H[(j*30+t)*4+k]);D(B)}else D("\e[3B")D(A[v])}}} function eats characters from stdin until it gets an EOF. If it sees a Hangul character, it prints the head consonant, then the underneath, then the rest of the vowel, then the tail consonant, then the adjustment.

Это испытание было восхитительным, и я очень рад, что выучил хангыль. Спасибо!

 

Sergsansin


Рег
29 Oct, 2019

Тем
92

Постов
209

Баллов
679
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно