Моя предыдущая задача « Распечатать невидимый текст» была довольно популярной, вероятно, из-за ее тривиальности.
Однако те, кто более наблюдателен, возможно, заметили, что вы на самом деле не печатаете невидимый текст, потому что невозможно прочитать то, что было введено, только на выходе.
Итак, я подумал, как насчет настоящей невидимой текстовой задачи.
Учитывая строку, состоящую только из печатаемых символов ASCII ( 0x20-0x7E
), преобразуйте каждый символ в отдельный символ Unicode (в кодировке UTF-8), который не является одним из 95 печатных символов ASCII (любой символ UTF-8 вне 0x20-0x7E
диапазона)
вход
Строка печатных символов ASCII, либо в виде строки, либо в виде массива / списка символов
Выход
Входная строка с каждым символом заменяется отдельным непечатным символом. Каждый данный символ должен иметь соответствующий непечатный символ, который не используется в качестве замены для любого другого символа.
Если вы не можете печатать непечатаемые символы, вы можете вместо этого вывести значения символов.
Например, если ваш код заменяет все строчные буквы a
на 0x01
, вы не можете использовать 0x01
в качестве замены любые другие символы.
Ваш код также должен быть детерминированным . Это означает, что, если для данной строки Hello
все строчные буквы l
заменены на 0x03
, ваш код также должен заменить все строчные буквы l
на 0x03
любую другую строку.
Testcases
Для этой задачи довольно сложно написать тестовые сценарии, поэтому я просто покажу вывод в виде списка шестнадцатеричных кодов.
input -> output
"Hello" -> [0x01, 0x02, 0x03, 0x03, 0x04]
"Hi!" -> [0x01, 0x05, 0x06]
"" -> []
" H " -> [0x07, 0x07, 0x07, 0x01, 0x07, 0x07, 0x07]
"yo! " -> [0x08, 0x04, 0x06, 0x07]
Leaderboard
Вот фрагмент стека, который генерирует как регулярную таблицу лидеров, так и обзор победителей по языкам.
/* Configuration */
var QUESTION_ID = 123447; // Obtain this from the url
// It will be like https://XYZ.stackexchange.com/questions/QUESTION_ID/... on any question page
var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";
var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk";
var OVERRIDE_USER = 48934; // This should be the user ID of the challenge author.
/* App */
var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page;
function answersUrl(index) {
return "https://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER;
}
function commentUrl(index, answers) {
return "https://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER;
}
function getAnswers() {
jQuery.ajax({
url: answersUrl(answer_page++),
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function (data) {
answers.push.apply(answers, data.items);
answers_hash = [];
answer_ids = [];
data.items.forEach(function(a) {
a.comments = [];
var id = +a.share_link.match(/\d+/);
answer_ids.push(id);
answers_hash[id] = a;
});
if (!data.has_more) more_answers = false;
comment_page = 1;
getComments();
}
});
}
function getComments() {
jQuery.ajax({
url: commentUrl(comment_page++, answer_ids),
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function (data) {
data.items.forEach(function(c) {
if (c.owner.user_id === OVERRIDE_USER)
answers_hash[c.post_id].comments.push(c);
});
if (data.has_more) getComments();
else if (more_answers) getAnswers();
else process();
}
});
}
getAnswers();
var SCORE_REG = /<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/;
var OVERRIDE_REG = /^Override\s*header:\s*/i;
function getAuthorName(a) {
return a.owner.display_name;
}
function process() {
var valid = [];
answers.forEach(function(a) {
var body = a.body;
a.comments.forEach(function(c) {
if(OVERRIDE_REG.test(c.body))
body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>';
});
var match = body.match(SCORE_REG);
if (match)
valid.push({
user: getAuthorName(a),
size: +match[2],
language: match[1],
link: a.share_link,
});
});
valid.sort(function (a, b) {
var aB = a.size,
bB = b.size;
return aB - bB
});
var languages = {};
var place = 1;
var lastSize = null;
var lastPlace = 1;
valid.forEach(function (a) {
if (a.size != lastSize)
lastPlace = place;
lastSize = a.size;
++place;
var answer = jQuery("#answer-template").html();
answer = answer.replace("{{PLACE}}", lastPlace + ".")
.replace("{{NAME}}", a.user)
.replace("{{LANGUAGE}}", a.language)
.replace("{{SIZE}}", a.size)
.replace("{{LINK}}", a.link);
answer = jQuery(answer);
jQuery("#answers").append(answer);
var lang = a.language;
if (/<a/.test(lang)) lang = jQuery(lang).text();
languages[lang] = languages[lang] || {lang: a.language, user: a.user, size: a.size, link: a.link};
});
var langs = [];
for (var lang in languages)
if (languages.hasOwnProperty(lang))
langs.push(languages[lang]);
langs.sort(function (a, b) {
if (a.lang > b.lang) return 1;
if (a.lang < b.lang) return -1;
return 0;
});
for (var i = 0; i < langs.length; ++i)
{
var language = jQuery("#language-template").html();
var lang = langs[i];
language = language.replace("{{LANGUAGE}}", lang.lang)
.replace("{{NAME}}", lang.user)
.replace("{{SIZE}}", lang.size)
.replace("{{LINK}}", lang.link);
language = jQuery(language);
jQuery("#languages").append(language);
}
}
body { text-align: left !important}
#answer-list {
padding: 10px;
width: 290px;
float: left;
}
#language-list {
padding: 10px;
width: 290px;
float: left;
}
table thead {
font-weight: bold;
}
table td {
padding: 5px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b">
<div id="answer-list">
<h2>Leaderboard</h2>
<table class="answer-list">
<thead>
<tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr>
</thead>
<tbody id="answers">
</tbody>
</table>
</div>
<div id="language-list">
<h2>Winners by Language</h2>
<table class="language-list">
<thead>
<tr><td>Language</td><td>User</td><td>Score</td></tr>
</thead>
<tbody id="languages">
</tbody>
</table>
</div>
<table style="display: none">
<tbody id="answer-template">
<tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
</tbody>
</table>
<table style="display: none">
<tbody id="language-template">
<tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
</tbody>
</table>
Ответы:
Желе , 3 байта
Попробуйте онлайн!
Квадраты каждой кодовой точки.
источник
Пробел ,
3936 байтПопробуйте онлайн!
объяснение
Первоначально я хотел умножить на -0 или -1, так как они будут самыми короткими цифрами, которые можно объявить в пробелах. TIO не делает различий между -0 и +0, так что это не так. К сожалению, хотя урок / спецификация неоднозначны относительно того, как интерпретировать отрицательное значение как символ TIO (правильно) выдает ошибку о недопустимом аргументе, так что это тоже не вариант.
Следующая самая короткая рабочая константа - 4, поэтому мы используем тот же базовый подход, что и решения Powershell / Pyth.
Пробелы ,
5653 байта - карты для обозначения символовПопробуйте онлайн!
объяснение
По сути, тот же подход, что и в предыдущей версии, за исключением того, что 0xE0000 используется в качестве константы и добавляет вместо умножения. Это отображает видимые символы ASCII на соответствующий символ тега Unicode (диапазон U + E0000-U + E007F). Предполагаемое использование для этого диапазона состояло в том, чтобы указать язык текста в текстовом файле, однако такое использование не рекомендуется. Этот код выведет правильные метки, если вы префикс строки с символом 0x01.
Стандарт Unicode говорит , что символы в этом нет диапазона имеют видимый рендеринг , поэтому я считаю , что это отвечает духу вызов лучше , чем предыдущий подход.
источник
Japt ,
52 байтаПопробуйте онлайн
объяснение
источник
126 ** 3 == 2000376
, что это не в диапазоне [0..1114111]. Вы все еще можете возвести в квадрат :) Это потому, что там заканчивается UTF-8, а UTF-16 продолжается.Brain-Flak , 33 байта
Включает +1 для
-c
Попробуйте онлайн!
источник
Braingolf v0.6, 17 байт
Квадраты каждое значение символа затем печатает.
-1 байт благодаря квадратному решению Эрика Аутгольфера
Braingolf v0.7, 6 байт [не конкурирует]
Также квадраты каждое значение затем печатает, но v0.7 имеет
{}
цикл "foreach"источник
Mathematica, 48 байтов
Объяснение:
Интересно, что из двух вариантов модуля менее 1000, которые изменили 96 символов на 96 уникальных значений с модулем 978, самые низкие два значения были 7, а затем 33. К счастью, умноженное на 4 преобразует это в 28 и 132, которые оба просто выходят за пределы видимого диапазона. Если бы я использовал другой модуль 784, то мне нужно было умножить на 18, чтобы переместить числа за пределы диапазона.
Прецедент.
Примечание: дополнительные обратные косые черты там как escape-символы для
"
и\
. Также символ 0x7E, похоже, не хочет правильно вставлять.Выход:
Использование
Hash
пришло такToCharacterCode
долго. Однако хеширование было почти таким же дорогим. Простой математический способ сделать это будет 49 байтов:источник
CJam ,
85 байтовПопробуйте онлайн!
Добавляет 95 к каждой кодовой точке.
источник
Pyth, 6 байт
Попробуй это здесь.
Умножает каждую кодовую точку на 4.
источник
PowerShell,
3231 байт-1 Спасибо Нилу,
99+
чтобы4*
умножает 9 на каждый код символа и печатает его обратно.
источник
05AB1E , 4 байта
Попробуйте онлайн!
Квадраты каждой кодовой точки.
источник
CJam , 4 байта
XOR каждая кодовая точка с -1 . Символы CJam имеют ширину 16 битов, поэтому это отображает кодовую точку n на кодовую точку 65535 - n .
Попробуйте онлайн!
источник
Десятичный , 37 байт
Объяснение:
Попробуйте онлайн!
источник
90D
) заканчивается?Google Sheets, 68 байтов
Я хотел опубликовать это, чтобы показать, как неловко выполнять некоторые основные функции в Sheets. Вы хотите выполнить операцию для каждого символа в ячейке и получить объединенный результат? Вы в 42 байтах, прежде чем вы даже действуете на этих персонажей.
Иначе, это то же самое, что и другие решения: возвести в квадрат кодовую точку каждого символа.
источник
Python 3,
4038 байтПопробуйте онлайн!
источник
C, 42 байта
Предполагается UTF-8 локаль. Ввод в квадрате.
Попробуйте онлайн!
источник
Чисто , 25 байт
Частичная функция литерал.
Попробуйте онлайн!
Реалистично:
Понимание распакованного массива над распакованным массивом того же типа (
{#Char} -> {#Char}
). Clean сможет определить, что уникальность переносима (!u:{#Char} -> u:{#Char}
) и что размер совпадает с размером ввода. Это означает, что если вы передадите a*String
, каждый символ будет деструктивно обновлен соответствующим символом в выводе, что означает, что никакого выделения памяти или перемещения не будет выполнено, и узел графа будет полностью использован повторно.Попробуйте онлайн!
источник