Mon défi précédent, Imprimer du texte invisible était très populaire, probablement en raison de sa banalité.
Cependant, les plus attentifs d'entre vous ont peut-être remarqué que vous n'imprimez pas vraiment du texte invisible, car il est impossible de lire ce qui a été entré étant donné uniquement la sortie.
J'ai donc pensé à un véritable défi de texte invisible.
Étant donné une chaîne composée uniquement de caractères ASCII imprimables ( 0x20-0x7E
), convertissez chaque caractère en un caractère Unicode distinct (dans le codage UTF-8) qui n'est pas l'un des 95 caractères ASCII imprimables (tout caractère UTF-8 en dehors de la 0x20-0x7E
plage)
Contribution
Une chaîne de caractères ASCII imprimables, sous forme de chaîne ou de tableau / liste de caractères
Production
La chaîne d'entrée avec chaque caractère remplacé par un caractère non imprimable distinct. Chaque caractère donné doit avoir un caractère non imprimable correspondant qui n'est utilisé comme substitut à aucun autre caractère.
Si vous ne parvenez pas à imprimer des caractères non imprimables, vous pouvez plutôt afficher les valeurs des caractères.
Par exemple, si votre code remplace tous les minuscules a
par 0x01
, vous ne pouvez pas utiliser 0x01
comme substitution d'autres caractères.
Votre code doit également être déterministe . Cela signifie que si, étant donné la chaîne Hello
, tous les minuscules l
sont remplacés par 0x03
, votre code doit également remplacer tous les minuscules l
par 0x03
une autre chaîne.
Cas de test
Il est quelque peu difficile d'écrire des cas de test pour ce défi, je vais donc simplement montrer la sortie sous forme de liste de codes hexadécimaux
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]
Classement
Voici un extrait de pile pour générer à la fois un classement régulier et un aperçu des gagnants par langue.
/* 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>
Réponses:
Gelée , 3 octets
Essayez-le en ligne!
Met en carré chaque point de code.
la source
Espace ,
3936 octetsEssayez-le en ligne!
Explication
À l'origine, je voulais multiplier par -0 ou -1 car ce seraient les chiffres les plus courts possibles à déclarer en espace blanc. TIO ne fait pas de différence entre -0 et +0, c'est donc fini. Malheureusement, alors que le didacticiel / spécification est ambigu quant à la façon d'interpréter une valeur négative en tant que TIO de caractère (à juste titre), il génère une erreur concernant l'argument non valide, ce qui n'est pas non plus une option.
La prochaine constante de travail la plus courte est 4, nous finissons donc par appliquer la même approche de base que les solutions Powershell / Pyth.
Espace ,
5653 octets - mappe pour étiqueter les caractèresEssayez-le en ligne!
Explication
Effectivement, la même approche que la version précédente, sauf qu'elle utilise 0xE0000 comme constante et ajoute au lieu de multiplier. Cela mappe les caractères ASCII visibles au caractère de balise Unicode correspondant (la plage U + E0000-U + E007F). L'utilisation prévue pour cette plage était d'indiquer la langue du texte dans un fichier en texte brut, mais cette utilisation est déconseillée. Ce code affichera des étiquettes valides si vous préfixez des chaînes avec un caractère 0x01.
Le standard Unicode dit que les personnages de cette gamme n'ont pas de rendu visible, donc je pense que cela répond mieux à l'esprit du défi que l'approche précédente.
la source
Japt ,
52 octetsEssayez-le en ligne
Explication
la source
126 ** 3 == 2000376
ce n'est pas dans la plage [0..1114111]. Vous pouvez quand même carrer :) C'est parce que l'UTF-8 s'arrête là, tandis que l'UTF-16 continue.Brain-Flak , 33 octets
Comprend +1 pour
-c
Essayez-le en ligne!
la source
Braingolf v0.6, 17 octets
Squares chaque valeur de char puis imprime.
-1 octet grâce à la solution de quadrillage d'Erik l'Outgolfer
Braingolf v0.7, 6 octets [non concurrent]
Squares également chaque valeur puis imprime, mais v0.7 a la
{}
boucle "foreach"la source
Mathematica, 48 octets
Explication:
Fait intéressant, parmi les deux options de module inférieures à 1000, qui ont changé les 96 caractères en 96 valeurs uniques avec le module 978, les deux valeurs les plus basses étaient 7 puis 33. Heureusement, les temps de 4 convertissent cela en 28 et 132 qui tombent tous deux en dehors de la plage visible. Si j'utilisais l'autre module de 784, je devais multiplier par 18 pour déplacer les nombres en dehors de la plage.
Cas de test.
Remarque: des barres obliques inverses supplémentaires sont là comme caractères d'échappement pour
"
et\
. Le caractère 0x7E ne semble pas non plus vouloir coller correctement.Production:
L'usage de
Hash
s'est produit car ilToCharacterCode
est vraiment long. Cependant le hachage était presque aussi cher. La manière mathématique simple de le faire serait de 49 octets:la source
CJam ,
85 octetsEssayez-le en ligne!
Ajoute 95 à chaque point de code.
la source
Pyth, 6 octets
Essayez-le ici.
Multiplie chaque point de code par 4.
la source
PowerShell,
3231 octets-1 Merci à neil,
99+
à4*
multiplie 9 par chaque code de caractère et le réimprime.
la source
05AB1E , 4 octets
Essayez-le en ligne!
Met en carré chaque point de code.
la source
CJam , 4 octets
XOR chaque point de code avec -1 . Les caractères de CJam ont une largeur de 16 bits, donc cela mappe le point de code n au point de code 65535 - n .
Essayez-le en ligne!
la source
Décimal , 37 octets
Explication:
Essayez-le en ligne!
la source
90D
) se termine?Google Sheets, 68 octets
Je voulais publier ceci pour montrer à quel point il est difficile de faire certaines fonctions de base dans Sheets. Voulez-vous effectuer une opération sur chaque personnage d'une cellule et supprimer le résultat concaténé? Vous êtes à 42 octets avant même d' agir sur ces personnages.
Sinon, c'est la même chose que pour les autres solutions: mettre au carré le point de code de chaque caractère.
la source
Python 3,
4038 octetsEssayez-le en ligne!
la source
C, 42 octets
Suppose un environnement local UTF-8. L'entrée est au carré.
Essayez-le en ligne!
la source
Nettoyer , 25 octets
Un littéral de fonction partielle.
Essayez-le en ligne!
De façon réaliste:
Compréhension du tableau sans boîte sur un tableau sans boîte du même type (
{#Char} -> {#Char}
). Clean pourra déterminer que l'unicité est transférable (!u:{#Char} -> u:{#Char}
) et que la taille est la même que la taille d'entrée. Cela signifie que si vous passez un*String
, chaque caractère sera mis à jour de manière destructrice avec celui correspondant dans la sortie, ce qui signifie qu'aucune allocation ou mouvement de mémoire n'est effectué et que le nœud du graphique est entièrement réutilisé.Essayez-le en ligne!
la source