Выведите алфавитную песню ŋarâþ crîþ без использования (m) букв


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.

Но есть одна загвоздка: за каждую букву (любого символа, с которого начинается общая категория в Юникоде 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обратную вершину стека, как в исходной программе. Должно быть легко увидеть, что происходит дальше: мы в конечном итоге перелистываем каждый элемент стека один за другим, выводим их все до тех пор, пока стек не опустится и программа не выйдет из строя. Итак, мы в основном создали простой цикл вывода, который просматривает исходный код программы, чтобы определить, что выводить (мы не выводим структуры данных, которые были помещены в стек нашей 05команды, мы вместо этого воссоздаем, какие команды были использованы, посмотрев, какие структуры были созданы, и вывеся их). Таким образом, первая часть данных выводится 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
@ Грими: Вы путаете байты с символами. Упакованное представление состоит из 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-only

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

Порт ответа Artermis ЛПЛЗ в , и мой первый вход codegolf!

Оставляю мне желание, которое chr()могло бы просто поддерживать UTF-8; эти лишние 3 байта + 40 символов больно!


Добро пожаловать в PPCG :)
Shaggy

1

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

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

Попробуйте онлайн!

Единственное письмо есть ç. Символы валюты €£¢не считаются буквами в Юникоде.


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 's Jelly ответа .

Постараюсь улучшить здесь. Число делится на несколько чисел , но, к сожалению, ни одно из них не спасет ни одного байта, а сжатые делители большего размера содержат как минимум одну букву.

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

Попробуйте онлайн.


1
Jможно .««за -18. Или для совершенно другого подхода, см. Мой ответ .
Grimmy

@ Грими Спасибо! :) И хороший ответ!
Кевин Круйссен
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.