Mi desafío anterior, Imprimir texto invisible era bastante popular, probablemente debido a lo trivial que era.
Sin embargo, los más observadores de usted pueden haber notado que realmente no está imprimiendo texto invisible, porque es imposible leer lo que se ingresó dado solo el resultado.
Así que pensé qué tal un verdadero desafío de texto invisible.
Dada una cadena que consta de solo caracteres ASCII imprimibles ( 0x20-0x7E
), convierta cada carácter en un carácter Unicode distinto (en codificación UTF-8) que no sea uno de los 95 caracteres ASCII imprimibles (cualquier carácter UTF-8 fuera del 0x20-0x7E
rango)
Entrada
Una cadena de caracteres ASCII imprimibles, ya sea como una cadena o una matriz / lista de caracteres
Salida
La cadena de entrada con cada carácter reemplazado por un carácter distinto no imprimible. Cada carácter dado debe tener un carácter no imprimible correspondiente que no se use como sustituto de ningún otro carácter.
Si no puede imprimir caracteres no imprimibles, puede generar los valores de caracteres en su lugar.
Por ejemplo, si su código reemplaza todas las minúsculas a
con 0x01
, no puede usarlo 0x01
como sustitución de ningún otro carácter.
Su código también debe ser determinista . Esto significa que si, dada la cadena Hello
, l
se reemplazan todas las minúsculas 0x03
, su código también debe reemplazar todas las minúsculas l
con 0x03
cualquier otra cadena dada.
Casos de prueba
Es un poco difícil escribir casos de prueba para este desafío, así que simplemente mostraré el resultado como una lista de códigos hexadecimales
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]
Tabla de clasificación
Aquí hay un fragmento de pila para generar una tabla de clasificación regular y una descripción general de los ganadores por idioma.
/* 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>
Respuestas:
Jalea , 3 bytes
Pruébalo en línea!
Ajusta cada punto de código.
fuente
Espacio en blanco ,
3936 bytesPruébalo en línea!
Explicación
Originalmente quería multiplicar por -0 o -1 ya que serían los dígitos más cortos posibles para declarar en espacios en blanco. TIO no diferencia entre -0 y +0, así que eso está fuera. Desafortunadamente, aunque el tutorial / especificación es ambiguo sobre cómo interpretar un valor negativo como un char TIO (con razón) arroja un error sobre el argumento no válido, por lo que tampoco es una opción.
La siguiente constante de trabajo más corta es 4, por lo que terminamos realizando el mismo enfoque básico que las soluciones Powershell / Pyth.
Espacio en blanco ,
5653 bytes: mapas para etiquetar caracteresPruébalo en línea!
Explicación
Efectivamente, el mismo enfoque que la versión anterior, excepto que usa 0xE0000 como constante y suma en lugar de multiplicar. Esto asigna los caracteres ASCII visibles al carácter de etiqueta Unicode correspondiente (el rango U + E0000-U + E007F). El uso previsto para este rango era indicar el idioma del texto en un archivo de texto sin formato, sin embargo, se desaconseja su uso. Este código generará etiquetas válidas si antepone cadenas con un carácter 0x01.
El estándar Unicode dice que los personajes en este rango no tienen una representación visible, por lo que creo que esto cumple con el espíritu del desafío mejor que el enfoque anterior.
fuente
Japt ,
52 bytesPruébalo en línea
Explicación
fuente
126 ** 3 == 2000376
no está en el rango [0..1114111]. Sin embargo, aún puede cuadrar :) Eso es porque UTF-8 termina allí, mientras que UTF-16 continúa.Brain-Flak , 33 bytes
Incluye +1 para
-c
Pruébalo en línea!
fuente
Braingolf v0.6, 17 bytes
Cuadra cada valor de carácter y luego imprime.
-1 byte gracias a la solución de cuadratura de Erik the Outgolfer
Braingolf v0.7, 6 bytes [no competidor]
También cuadra cada valor y luego se imprime, pero v0.7 tiene el
{}
bucle "foreach"fuente
Mathematica, 48 bytes
Explicación:
Curiosamente, de las dos opciones de módulo de menos de 1000 que cambiaron los 96 caracteres a 96 valores únicos con el módulo 978, los dos valores más bajos fueron 7 y 33. Afortunadamente, 4 veces convierte esto en 28 y 132, que ambos quedan fuera del rango visible. Si usaba el otro módulo de 784, necesitaba multiplicar por 18 para mover los números fuera del rango.
Caso de prueba.
Nota: barras invertidas adicionales allí como caracteres de escape para
"
y\
. Además, el carácter 0x7E no parece querer pegar correctamente.Salida:
El uso de
Hash
surgió comoToCharacterCode
es realmente largo. Sin embargo, el hashing era casi tan caro. La forma matemática fácil de hacer esto sería de 49 bytes:fuente
CJam ,
85 bytesPruébalo en línea!
Agrega 95 a cada punto de código.
fuente
Pyth, 6 bytes
Pruébalo aquí.
Multiplica cada punto de código por 4.
fuente
PowerShell,
3231 bytes-1 Gracias a Neil,
99+
a4*
multiplica 9 por cada código de carácter y lo imprime de nuevo.
fuente
05AB1E , 4 bytes
Pruébalo en línea!
Ajusta cada punto de código.
fuente
CJam , 4 bytes
XOR cada punto de código con -1 . Los caracteres de CJam tienen 16 bits de ancho, por lo que esto asigna el punto de código n al punto de código 65535 - n .
Pruébalo en línea!
fuente
Decimal , 37 bytes
Explicación:
Pruébalo en línea!
fuente
90D
) termina?Hojas de cálculo de Google, 68 bytes
Quería publicar esto para mostrar lo incómodo que es hacer algunas funciones básicas en Sheets. ¿Desea hacer una operación a cada personaje en una celda y sacar el resultado concatenado? Tienes 42 bytes incluso antes de actuar sobre esos personajes.
De lo contrario, esto es lo mismo que otras soluciones: eleva al cuadrado el punto de código de cada carácter.
fuente
Python 3,
4038 bytes¡Pruébelo en línea!
fuente
C, 42 bytes
Asume un entorno local UTF-8. La entrada es al cuadrado.
Pruébalo en línea!
fuente
Limpio , 25 bytes
Una función parcial literal.
Pruébalo en línea!
De modo realista:
Comprensión de matriz sin caja sobre una matriz sin caja del mismo tipo (
{#Char} -> {#Char}
). Clean podrá determinar que la unicidad es transferible (!u:{#Char} -> u:{#Char}
) y que el tamaño es el mismo que el tamaño de entrada. Esto significa que si pasa un*String
, todos los caracteres se actualizarán destructivamente con el correspondiente en la salida, lo que significa que no se realiza ninguna asignación o movimiento de memoria y el nodo gráfico se reutiliza por completo.Pruébalo en línea!
fuente