Виведіть пісню алфавіту ŋarâþ crîþ, не використовуючи (м) жодних літер


12

Ваша мета - написати програму, яка не потребує введення та виводить такий текст:

ca e na ŋa va o sa;
þa ša ra la ła.
ma a pa fa ga ta ča;
în ja i da ða.
ar ħo ên ôn ân uħo;
carþ taŋ neŋ es nem.
elo cenvos.

Але є улов: за кожну букву (будь-який символ, загальна категорія якого починається з Unicode L) у вашому джерелі, ви отримуєте штраф у 20 символів! (Для довідки, текст для друку має 81 букву.)

Код Perl 6 нижче містить 145 байт і 84 літери, тому він отримує оцінку 1845:

say "ca e na ŋa va o sa;
þa ša ra la ła.
ma a pa fa ga ta ča;
în ja i da ða.
ar ħo ên ôn ân uħo;
carþ taŋ neŋ es nem.
elo cenvos."

У наведеному нижче коді є 152 байти та 70 літер, тож він отримує оцінку 1552:

$_="C e N ŋa V o S;
Þ Š R L Ł.
M a P F G T Č;
în J i D Ð.
ar ħo ên ôn ân uħo;
Crþ Tŋ neŋ es nem.
elo cenvos.";s:g/<:Lu>/{$/.lc~'a'}/;.say

Стандартні лазівки заборонені.

Спочатку я думав взагалі забороняти листи, але не думаю, що існує багато мов, які роблять це можливим. Ви більше ніж бажаєте спробувати.

(ŋarâþ crîþ [ˈŋaɹa̰θ kɹḭθ] - це один з моїх конланг. Я хотів тут написати його великі літери, але тут я отримую некрасивий великий англ. Ну добре, мова не використовує великих букв у своїй романізації.)

Редагувати: зрозумів, що один із рядків невірний, але я буду його зберігати, оскільки відповіді вже є. Правильна версія третього рядка ma a fa ga pa ta ča; на ваш вибір ви можете замість цього виправити виправлений текст.


11
Колмогоров-складність , обмежене джерело та спеціальна оцінка - це всілякі речі, які отримують велику користь від уважного розгляду в пісочниці. В даний час, мабуть, найкращим підходом до цього виклику було б просто виписати всі кодові точки у десятковій формі, а потім перетворити їх у текст із вбудованим, з деяким ярликом для кодування всіх as - чи ні, залежно від кількості букви, які знадобляться, бо 20 символів - це справді велика кара (хоча коли все інше набирається байтами, це не зовсім чітко визначено ...)!
Непов’язана струна

4
І з огляду на виклик Unicode, певні правила, що регулюють спеціальні кодові сторінки, якими користується більшість гольфлангів, ймовірно, вимагаються (поряд, можливо, посилання на скрипт для підтвердження оцінки).
Непов’язана струна

Відповіді:


21

7 , 410 символів, 154 байти в кодуванні 7, 0 літер = оцінка 154

55104010504200144434451510201304004220120504005434473340353241135014335450302052254241052253052244241052335452241114014241310052340435303052335442302052335500302052335430302052313340435303135014243241310335514052312241341351052302245341351525755102440304030434030421030442030424030455733413512410523142410523030523112411350143355142410523414252410523102410523002410523413342411145257551220304010420030455741403

Спробуйте в Інтернеті!

У виклику, який не любить використання букв, яку кращу мову використовувати, ніж мову, що складається лише з цифр?

Це повноцінна програма, яка виходить із збоїв, тому сторонній вихід у stderr є, але stdout є правильним.

Пояснення

Програма 7 на першій ітерації просто натискає на стек декілька елементів (адже з 12 команд, що існують у 7, лише 8 з них можуть бути представлені у вихідній програмі, а ті 8 спеціалізовані для написання коду для виштовхування певних структур даних до стеку). Ця програма не використовує 6команду (що є найпростішим способом створення вкладених структур, але в іншому випадку має тенденцію не відображатися буквально у вихідній програмі), тому це 7визначають структуру лише команди; 7висуває новий порожній елемент у верхню частину стека (тоді як команди 05просто додаються до верхньої частини стека). Таким чином, ми можемо додати пробіли до програми, щоб показати її структуру:

551040105042001444344515102013040042201205040054344 7

33403532411350143354503020522542410522530522442410523354522411140142413100523
40435303052335442302052335500302052335430302052313340435303135014243241310335
514052312241341351052302245341351525 7

55102440304030434030421030442030424030455 7

33413512410523142410523030523112411350143355142410523414252410523102410523002
41052341334241114525 7

551220304010420030455 7

41403

Елементи в кінці програми висуваються останніми, тому знаходяться на вершині стека на початку другої ітерації. Після цієї ітерації та всіх майбутніх ітерацій інтерпретатор 7 автоматично робить копію верхньої частини стека та інтерпретує її як програму. Літерал 41403підштовхує (нелітеральний, живий код) 47463(7 має 12 команд, але лише 8 з них мають імена; як такий, я використовую жирний шрифт для показу коду, а нежирний - для того, щоб показати літерал, який генерує цей код, тобто це, наприклад 4, команда, яка додається 4до верхнього елемента стека). Отже програма, яка працює на другій ітерації 47463. Ось що це робить:

47463 
4        Замініть два верхні елементи стека, додайте порожній елемент між
  7       Додайте порожній елемент стека у верхню частину стека
   4      Помініть двома елементами стека на вершині стека, Додайте порожній елемент між
    6     Опрацюйте, які команди створювали б верхній елемент стека;
        додайте це до елемента внизу (і виведіть стару верхівку стека)
    3    Виведіть верхній елемент стека, викладіть елемент нижче

Це легше зрозуміти, якщо ми подивимось, що відбувається зі стеком:

  • ... d Ĉ б а 47463 (код для запуску: 47463)
  • ... d з б спорожнити а (код для запуску: )47463 7463
  • ... d з б спорожнити в порожній (код для запуску: )47463 463
  • ... d з б порожній порожній порожній а (код для запуску: )47463 63
  • ... d з б порожній порожній « в » (код для запуску: )47463 3
  • D c b порожній (код для запуску: порожній )47463

Іншими словами, ми беремо верхню частину стека a , опрацьовуємо, який код, швидше за все, його створив, і виводимо цей код. 7 інтерпретатор автоматично вискакує порожні елементи з верхньої частини стека в кінці ітерації, тому ми закінчуємо 47463спинку вгорі стека, як і в оригінальній програмі. Слід легко зрозуміти, що буде далі: ми закінчуємо перебирання кожного елемента стека один за одним, виводячи їх усі, поки стек не переллється і програма не руйнується. Таким чином, ми в основному створили простий цикл виводу, який дивиться на вихідний код програми, щоб визначити, що виводити (ми не виводимо структури даних, які були натиснуті на стек нашими 0...5команди, ми замість цього відтворюємо, які команди використовувались, переглядаючи, які структури створені, і виводити їх). Таким чином, перший фрагмент виведення даних є 551220304010420030455(вихідний код, який генерує другий елемент зверху стека), другий - 3341351…114525вихідний код, що генерує третій з верхнього елемента стека) тощо.

Очевидно, однак, ці фрагменти вихідного коду не виводяться некодованими. 7 містить кілька різних доменних мов для кодування виводу; Після вибору мови, що залежить від домену, вона залишається у використанні до явного очищення, але якщо жодна з мов ще не була обрана, перша цифра коду, що виводиться, визначає, яку з мов використовувати. У цій програмі використовуються лише дві мови: 551і 3.

551досить простий: це, в основному, старий код Бодо / телетип, який використовується для передачі букв по телетипах, як 5-бітний набір символів, але модифікований, щоб зробити всі літери малими літерами. Отже, перший фрагмент коду для виведення декодується таким чином:

551  22 03 04 01 04 20 03 04  55
     c  a  SP e  SP n  a  SP  reset output format

Як видно, ми вписуємо кожен символ у дві восьми цифри, що є досить пристойним коефіцієнтом стиснення. Пари цифр у діапазоні 0-5 дають нам 36 можливостей, на відміну від 32 можливостей, які потребують Бодо, тому інші чотири використовуються для спеціальних команд; в цьому випадку, 55наприкінці очищається запам'ятовується вихідний формат, дозволяючи нам використовувати інший формат для наступного виробу, який ми виробляємо.

3концептуально ще простіше, але з поворотом. Основна ідея - взяти групи з трьох цифр (знову ж таки, в діапазоні 0-5, оскільки це ті цифри, для яких ми можемо гарантувати, що ми зможемо відтворити вихідний вихідний код з його виводу), інтерпретувати їх як тризначні число в базі 6, і просто виводимо його як байт у двійковій формі (таким чином дозволяючи нам виводити багатобайтові символи на потрібний вихід просто шляхом виведення декількох байт). Поворот, однак, пов'язаний з тим, що в базі 6 є лише 216 трицифрових чисел (з можливими провідними нулями), але 256 можливих байтів. 7 обходить це шляхом з'єднання чисел від 332₆ = 128₁₀ вгору до двох різних байтів; 332може виводити або байт 128 або 192, 333або байт 129 або 193 тощо, до 515якого виводить або байт 191, або 255.

Як програма знає, яку з двох можливостей вивести? Можна використовувати трійки цифр 520вгору, щоб це чітко контролювати, але в цій програмі нам не потрібно: 7 за замовчуванням - це вибрати всі неоднозначні байти таким чином, щоб вихід був дійсним UTF-8! Виявляється, завжди існує максимум один спосіб зробити це, доки ми хочемо (і це робимо в цьому випадку UTF-8), ми можемо просто залишити це неоднозначно, і програма все одно працює.

Кінець кожного з 3…розділів є 525, який скидає вихідний формат, і ми повернемося до 551наступного розділу.


Це або 410 байт + 0 літер у розпакованому поданні, або 154 байти + багато літер у упакованому поданні. Підрахунок байтів в одній і літер в іншому здається шахрайським.
Grimmy

1
@Grimy: ти плутаєш байти з символами. Упаковане представлення складається з 154 байт у кодуванні 7, які кодують 410 восьмеричних цифр, кожен з яких є цифрою, а не літерою. Ваші міркування означають, що, скажімо, ɓв Jelly це не лист (оскільки його кодування в кодуванні Jelly відповідає коду управління "CSI", якщо його інтерпретувати в типовому 8-бітовому наборі символів, а не літери). Так само, як Jelly, 7 також використовує користувацьке кодування; але оскільки 7 не використовує літер, кодування не потребує кодування букв і, отже, не може.
ais523

10

Haskell, 0 літер, 423 байт = оцінка 423

(['\10'..]!!)<$>[89,87,22,91,22,100,87,22,321,87,22,108,87,22,101,22,105,87,49,0,244,87,22,343,87,22,104,87,22,98,87,22,312,87,36,0,99,87,22,87,22,102,87,22,92,87,22,93,87,22,106,87,22,259,87,49,0,228,100,22,96,87,22,95,22,90,87,22,230,87,36,0,87,104,22,285,101,22,224,100,22,234,100,22,216,100,22,107,285,101,49,0,89,87,104,244,22,106,87,321,22,100,91,321,22,91,105,22,100,91,99,36,0,91,98,101,22,89,91,100,108,101,105,36]

Спробуйте в Інтернеті!


6

Желе ,  274 260  212 байт + 2 літери =  314 300  252

-48 байт завдяки Ніку Кеннеді

“19ב+49;7883,8220,8216,7884Ọ“19937801,1169680277365253“38“68112“;107¤+1+\“@“&%"("/%"@%"6%"0"3%$!<%" %"2%"-%"?%#!.%"%"1%")%"*%"4%"=%$!9/",%"+"'%":%#!%2">0"8/";/"7/"5>0$!&%2<"4%@"/(@"(3"/(.#!(-0"&(/603#“_32¤”;";/V

(Використання !"#$%&'()*+,-./0123456789:;<=>?@V\_¤×Ọ‘“”яких Vі є літерами Unicode і використовується один раз)

Спробуйте в Інтернеті!




@NickKennedy Я грав з гольф-номером, але не відступав і не просто дивився на компенсацію порядків, хороший матеріал - дякую!
Джонатан Аллан

3

PowerShell , бали 601 546

-join(67,65,0,69,0,78,65,0,299,65,0,86,65,0,79,0,83,65,27,-22,222,65,0,321,65,0,82,65,0,76,65,0,290,65,14,-22,77,65,0,65,0,80,65,0,70,65,0,71,65,0,84,65,0,237,65,27,-22,206,78,0,74,65,0,73,0,68,65,0,208,65,14,-22,65,82,0,263,79,0,202,78,0,212,78,0,194,78,0,85,263,79,27,-22,67,65,82,222,0,84,65,299,0,78,69,299,0,69,83,0,78,69,77,14,-22,69,76,79,0,67,69,78,86,79,83,14|%{[char]($_+32)})

Спробуйте в Інтернеті!

Наївний підхід; Я щойно взяв кодові точки і перетворив їх у десятковий, відніс 32, потім цей код розглядає їх як charперед тим, -joinяк повернути його назад в єдиний рядок.




3

Желе , 321 байт + 2 літери = оцінка 361

3343781777797791350694255572961968519437585132057650209974147122192542459108221624793330048943528237823681411832154316740173721249435700067706302064570847610741421342406380917446310820012503592770000532190167243585300911078873144513786923305473352724133578818457026824110152529235136461572588027747840738399150398304b354Ọ

Спробуйте в Інтернеті!

Це огидно, і хтось точно може зробити краще.

Перевірте рахунок .


1
насправді менш погано, ніж здається
лише ASCII

2

Python 3 , 380 байт + 5 літер = 480

print("""\143\141 \145 \156\141 \513\141 \166\141 \157 \163\141;
\376\141 \541\141 \162\141 \154\141 \502\141.
\155\141 \141 \160\141 \146\141 \147\141 \164\141 \415\141;
\356\156 \152\141 \151 \144\141 \360\141.
\141\162 \447\157 \352\156 \364\156 \342\156 \165\447\157;
\143\141\162\376 \164\141\513 \156\145\513 \145\163 \156\145\155.
\145\154\157 \143\145\156\166\157\163.""")

Спробуйте в Інтернеті!


1

Сітківка , 140 символів, 159 байт, 14 літер = оцінка 439


%# ' 1# !# 9# 2 6#;¶þ# š# 5# /# ł#.¶0# # 3# (# )# 7# č#;¶î1 ,# + &# ð#.¶#5 ħ2 ê1 ô1 â1 8ħ2;¶%#5þ 7#! 1'! '6 1'0.¶'/2 %'1926.
T`!--/-9`ŋ\`-{

Спробуйте в Інтернеті! Редагувати: збережено 1 лист, перейшовши K`на новий рядок. Зараз також працює в Retina 0.8.2 (але заголовок був би занадто довгим).


1

Japt -S , 304 286 байт + 2 1 буква s = 344 306

Ну, це просто бого-жахливо!

"3 1
5
14 1
235 1
22 1
15
19 1 -37 -86 158 1
257 1
18 1
12 1
226 1 -50 -86 13 1
1
16 1
6 1
7 1
20 1
173 1 -37 -86 142 14
10 1
9
4 1
144 1 -50 -86 1 18
199 15
138 14
148 14
130 14
21 199 15 -37 -86 3 1 18 158
20 1 235
14 5 235
5 19
14 5 13 -50 -86 5 12 15
3 5 14 22 15 19 -50"·®¸®°d96} ¬

Спробуй це


1

PHP -a, 402 байти + 200 штрафних балів = 602 бали

foreach([67,65,0,69,0,78,65,0,299,65,0,86,65,0,79,0,83,65,27,-22,222,65,0,321,65,0,82,65,0,76,65,0,290,65,14,-22,77,65,0,65,0,80,65,0,70,65,0,71,65,0,84,65,0,237,65,27,-22,206,78,0,74,65,0,73,0,68,65,0,208,65,14,-22,65,82,0,263,79,0,202,78,0,212,78,0,194,8,0,85,263,79,27,-22,67,65,82,222,0,84,65,299,0,78,69,299,0,69,83,0,78,69,77,14,-22,69,76,79,0,67,69,78,86,79,83,14] as $i){echo ''.mb_chr($i+32);}

Відповідь Порт Артерміса Фаула , і моя перша запис кодового гольфу!

Залишає мене, що бажає chr()просто підтримувати UTF-8; ці зайві 3 байти + 40 символів боляче!


Ласкаво просимо в PPCG :)
Shaggy

1

05AB1E , оцінка 209 (189 байт + 20 штрафних санкцій за 1 букву)

•£?;\:'%¢;.'¡£/':¢?'¢°':¢°#@¢«>#%¡¤;®[¢:¥¢:©¢:¦¢;®¢>#¡£#¨¢#&¢+¢#,¢:§¡¤#¬¢#@¢#)¢#(¢#<¢#¢#/¡£#¯¢#.¢#>¢#±¢#«¡¤#?¢;¢#\¢#°¢#:¢'¢#%•[₅‰`©®_#∞158+902201401301670804020409010150250102709022¾¡.¥>:ç?

Спробуйте в Інтернеті!

Єдиний лист ç. Символи валюти €£¢не вважаються літерами в Unicode.


0

Python 3 , 397 байт + 19 літер = 777 балів

print(''.join(chr(i+32)for i in[67,65,0,69,0,78,65,0,299,65,0,86,65,0,79,0,83,65,27,-22,222,65,0,321,65,0,82,65,0,76,65,0,290,65,14,-22,77,65,0,65,0,80,65,0,70,65,0,71,65,0,84,65,0,237,65,27,-22,206,78,0,74,65,0,73,0,68,65,0,208,65,14,-22,65,82,0,263,79,0,202,78,0,212,78,0,194,78,0,85,263,79,27,-22,67,65,82,222,0,84,65,299,0,78,69,299,0,69,83,0,78,69,77,14,-22,69,76,79,0,67,69,78,86,79,83,14]))

Спробуйте в Інтернеті!

Відповідь порту AdmBorkBork .




562 , -2, якщо використовується python 2
лише для ASCII

TIO не працює в моїй організації, тому мені доведеться чекати, щоб повернутися додому, щоб додати їх.
Артеміда досі не вірить SE

0

R , 384 байти + 12 літер * 20 балів = 684 балів

Не страшно оригінально.

cat(intToUtf8(c(67,65,0,69,0,78,65,0,299,65,0,86,65,0,79,0,83,65,27,-22,222,65,0,321,65,0,82,65,0,76,65,0,290,65,14,-22,77,65,0,65,0,80,65,0,70,65,0,71,65,0,84,65,0,237,65,27,-22,206,78,0,74,65,0,73,0,68,65,0,208,65,14,-22,65,82,0,263,79,0,202,78,0,212,78,0,194,78,0,85,263,79,27,-22,67,65,82,222,0,84,65,299,0,78,69,299,0,69,83,0,78,69,77,14,-22,69,76,79,0,67,69,78,86,79,83,14)+32))

Спробуйте в Інтернеті!


0

05AB1E , оцінка 383 365 (325 байт + 2 літери * 20 штрафних санкцій)

3343781777797791350694255572961968519437585132057650209974147122192542459108221624793330048943528237823681411832154316740173721249435700067706302064570847610741421342406380917446310820012503592770000532190167243585300911078873144513786923305473352724133578818457026824110152529235136461572588027747840738399150398304 354вç.««

Порт @HyperNeutrino Jelly відповіді «s .

Спробуємо вдосконалитись тут. Число поділяється на купу чисел , але жоден з них не збереже жодного байта, на жаль, а більші стиснуті дільники містять щонайменше 1 букву.

-18 (+2 байти та -20 штрафу) завдяки @Grimy , замінивши букву J(приєднатись) на.«« (зменшити шляхом конкатенації).

Спробуйте в Інтернеті.


1
Jможе бути .««за -18. Або для зовсім іншого підходу дивіться мою відповідь .
Grimmy

@Grimy Дякую! :) І приємна відповідь!
Kevin Cruijssen
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.