Moje poprzednie wyzwanie, Drukuj niewidoczny tekst było dość popularne, prawdopodobnie z powodu jego trywialności.
Jednak ci bardziej spostrzegawczy mogli zauważyć, że tak naprawdę nie drukujesz niewidocznego tekstu, ponieważ niemożliwe jest odczytanie tego, co zostało wprowadzone, biorąc pod uwagę tylko wynik.
Pomyślałem więc, co powiesz na prawdziwe niewidzialne wyzwanie tekstowe.
Biorąc pod uwagę ciąg znaków składający się tylko z drukowalnych znaków ASCII ( 0x20-0x7E
), przekonwertuj każdy znak na odrębny znak Unicode (w kodowaniu UTF-8), który nie jest jednym z 95 drukowanych znaków ASCII (dowolny znak UTF-8 spoza 0x20-0x7E
zakresu)
Wejście
Ciąg znaków drukowalnych ASCII, jako ciąg znaków lub tablica znaków / lista
Wynik
Ciąg wejściowy z każdym znakiem zastępowany odrębnym znakiem, który nie może być wydrukowany. Każdy dany znak musi mieć odpowiadający znak niedrukowalny, który nie jest używany jako zamiennik żadnego innego znaku.
Jeśli nie możesz wydrukować znaków niedrukowalnych, możesz zamiast tego wydrukować wartości znaków.
Na przykład jeśli Twój kod zastępuje wszystkie małe a
„sz 0x01
, nie może wykorzystywać 0x01
jako substytutu innych znaków.
Twój kod musi być również deterministyczny . Oznacza to, że jeżeli dany ciąg Hello
, wszystkie małe l
„s są zastąpione 0x03
, kod musi również wymienić wszystkie małe l
” s z 0x03
danej jakiegokolwiek innego napisu.
Przypadki testowe
Trochę trudno jest napisać przypadki testowe dla tego wyzwania, więc po prostu pokażę dane wyjściowe jako listę kodów szesnastkowych
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]
Tabela liderów
Oto fragment kodu, który pozwala wygenerować zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka.
/* 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>
Odpowiedzi:
Galaretka , 3 bajty
Wypróbuj online!
Kwadratuje każdy punkt kodowy.
źródło
Biała spacja ,
3936 bajtówWypróbuj online!
Wyjaśnienie
Początkowo chciałem pomnożyć przez -0 lub -1, ponieważ byłyby to najkrótsze cyfry możliwe do zadeklarowania w białej spacji. TIO nie rozróżnia między -0 a +0, więc to nie działa. Niestety, podczas gdy samouczek / specyfikacja nie są jednoznaczne, jak interpretować wartość ujemną jako znak TIO (słusznie) zgłasza błąd dotyczący nieprawidłowego argumentu, więc również nie jest to opcja.
Następna najkrótsza stała robocza to 4, więc w rezultacie wykonujemy to samo podstawowe podejście, co rozwiązania Powershell / Pyth.
Biała spacja ,
5653 bajtów - mapy do oznaczania znakówWypróbuj online!
Wyjaśnienie
Efektywnie takie samo podejście jak w poprzedniej wersji, z tą różnicą, że używa 0xE0000 jako stałej i dodaje zamiast mnożenia. Spowoduje to odwzorowanie widocznych znaków ASCII na odpowiedni znak znacznika Unicode (zakres U + E0000-U + E007F). Zamierzonym zastosowaniem tego zakresu było wskazanie języka tekstu w pliku jawnego tekstu, jednak użycie to jest odradzane. Ten kod wyświetli prawidłowe etykiety, jeśli poprzedzisz ciąg znaków znakiem 0x01.
Standard Unicode mówi, że znaki w tym zakresie nie mają widocznego rendering tak czuję, że to spotyka ducha wyzwanie lepiej niż poprzedniego podejścia.
źródło
Japt ,
52 bajtyWypróbuj online
Wyjaśnienie
źródło
126 ** 3 == 2000376
to nie jest w zakresie [0..1114111]. Nadal możesz jednak wyrównać :) To dlatego, że UTF-8 się tam kończy, podczas gdy UTF-16 trwa.Brain-Flak , 33 bajty
Obejmuje +1 dla
-c
Wypróbuj online!
źródło
Braingolf v0.6, 17 bajtów
Kwadraty każdej wartości char następnie drukuje.
-1 bajt dzięki rozwiązaniu Erika the Outgolfer
Braingolf v0.7, 6 bajtów [nie konkuruje]
Również kwadratuje każdą wartość, a następnie drukuje, ale v0.7 ma
{}
pętlę „foreach”źródło
Mathematica, 48 bajtów
Wyjaśnienie:
Co ciekawe, z dwóch opcji modułu mniejszych niż 1000, które zmieniły 96 znaków na 96 unikatowych wartości z modułem 978, dwie najniższe wartości wynosiły 7, a następnie 33. Na szczęście czasy o 4 konwertują to na 28 i 132, które po prostu nie mieszczą się w widocznym zakresie. Gdybym użył drugiego modułu 784, musiałbym pomnożyć przez 18, aby przenieść liczby poza zakres.
Przypadek testowy.
Uwaga: dodatkowe odwrotne ukośniki jako znaki specjalne dla
"
i\
. Również znak 0x7E nie chce poprawnie wkleić.Wynik:
Korzystanie z
Hash
pojawiło się, ponieważToCharacterCode
jest naprawdę długie. Jednak mieszanie było prawie tak drogie. Prostym sposobem matematycznym na wykonanie tego byłoby 49 bajtów:źródło
CJam ,
85 bajtówWypróbuj online!
Dodaje 95 do każdego punktu kodowego.
źródło
Pyth, 6 bajtów
Wypróbuj tutaj.
Mnoży każdy punkt kodowy przez 4.
źródło
PowerShell,
3231 bajtów-1 Dzięki neil,
99+
do4*
mnoży 9 przez każdy kod znaku i drukuje go z powrotem.
źródło
05AB1E , 4 bajty
Wypróbuj online!
Kwadratuje każdy punkt kodowy.
źródło
CJam , 4 bajty
XORs każdy punkt kodowy z -1 . Znaki CJam mają szerokość 16 bitów, więc mapuje to punkt kodowy n na punkt kodowy 65535 - n .
Wypróbuj online!
źródło
Dziesiętny , 37 bajtów
Wyjaśnienie:
Wypróbuj online!
źródło
90D
) kończy się?Arkusze Google, 68 bajtów
Chciałem to opublikować, aby pokazać, jak niewygodne jest wykonywanie podstawowych funkcji w Arkuszach. Czy chcesz wykonać operację dla każdej postaci w komórce i wyciągnąć konkatenowany wynik? Masz 42 bajty, zanim zaczniesz działać na tych postaciach.
W przeciwnym razie jest to to samo, co w przypadku innych rozwiązań: wyprostuj punkt kodowy każdego znaku.
źródło
Python 3,
4038 bajtówWypróbuj online!
źródło
C, 42 bajty
Zakłada ustawienia regionalne UTF-8. Dane wejściowe są podniesione do kwadratu.
Wypróbuj online!
źródło
Czysty , 25 bajtów
Literał funkcji cząstkowej.
Wypróbuj online!
Realistycznie:
Zrozumienie tablicy rozpakowanej nad tablicą rozpakowanego tego samego typu (
{#Char} -> {#Char}
). Clean będzie w stanie ustalić, że niepowtarzalność jest przenoszalna (!u:{#Char} -> u:{#Char}
) i że rozmiar jest taki sam jak rozmiar wejściowy. Oznacza to, że jeśli zdasz*String
, każdy znak zostanie destrukcyjnie zaktualizowany z odpowiadającym mu znakiem na wyjściu, co oznacza, że nie dokonuje się alokacji pamięci ani ruchu, a węzeł wykresu jest w pełni ponownie wykorzystywany.Wypróbuj online!
źródło