Imprimir texto invisible real

15

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-0x7Erango)

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 acon 0x01, no puede usarlo 0x01como sustitución de ningún otro carácter.

Su código también debe ser determinista . Esto significa que si, dada la cadena Hello, lse reemplazan todas las minúsculas 0x03, su código también debe reemplazar todas las minúsculas lcon 0x03cualquier 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.

Skidsdev
fuente
99
No existe un carácter UTF-8: UTF-8 es una serialización de Unicode, no un juego de caracteres. Y si "no imprimible" tiene sentido en un contexto Unicode, ciertamente es mucho más estrecho que "todos menos 95 de los cientos de miles de puntos de código asignados".
Peter Taylor
11
@PeterTaylor Dado que aquí estamos hablando en términos de códigos hexadecimales de caracteres, supuse que estaba claro que cuando digo carácter UTF-8 me refiero a un carácter Unicode en la codificación UTF-8. ASCII también es un estándar de codificación, no un juego de caracteres, pero la gente no tiene ningún problema con el término "carácter ASCII". De todos modos, editaré la redacción para aclarar.
Skidsdev
3
¿Alguna razón en particular se requiere UTF-8?
CalculatorFeline
¿Puede la entrada estar vacía?
Dennis
1
+1 para "Si no puede imprimir caracteres no imprimibles"
Robert Fraser

Respuestas:

13

Jalea , 3 bytes

O²Ọ

Pruébalo en línea!

Ajusta cada punto de código.

Erik el Outgolfer
fuente
Muy similar a la solución de Japt que se me ocurrió, espere que cubique el punto de código en lugar de cuadrarlo: ¿está bien que lo publique?
Shaggy
2
@Shaggy Japt ≠ Jelly, para que puedas publicarlo.
Erik the Outgolfer
Solución inteligente, no pensé en cuadrar.
Skidsdev
1
Grandioso, solo quería estar seguro, no sea que pensaras que solo estaba estafando tu solución :)
Shaggy
44
@Shaggy no existe una directriz en contra de portar una solución a otro idioma; si lo hubiera, sería terrible ya que generalmente hay un algoritmo óptimo que brinda implementaciones óptimas en la mayoría de los idiomas, y nadie más que el primer póster no podría probar que vinieron con el algoritmo por sí mismos. Por supuesto, si portas la solución de otra persona, solo es justo mencionar su respuesta.
Aaron
13

Espacio en blanco , 39 36 bytes


  
   	  
 
  
 	
	 				  
	
  
 


Pruébalo en línea!

Explicación

nssn  ; label 'loop'
ssstssn ; push 4 to use as a multiplication operand
sns   ; dup 4 to use as a heap address
sns   ; dup 4 to use as a heap address
tnts  ; getchar and store at address 4
ttt   ; retrieve the value at address 4
tssn  ; multiply the character value by 4
tnss  ; putchar output the new character
nsnn  ; jmp 'loop'

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 , 56 53 bytes: mapas para etiquetar caracteres


  
   			                 
 
  
 	
	 				   	
  
 


Prué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.

Ephphatha
fuente
55
Usando un programa invisible para imprimir texto invisible. Me gusta.
Mark
7

Japt , 5 2 bytes

cp

Pruébalo en línea


Explicación

     :Implicit input of string U
c    :Map over the character codes of the string.
p    :Square them.
     :Implicit output of result.
Lanudo
fuente
Hmm, después de un examen más detallado, parece que 126 ** 3 == 2000376no 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.
Erik the Outgolfer
1
@EriktheOutgolfer Ehm. UTF-8 tiene exactamente el mismo rango que UTF-16 por definición. (En teoría, UTF-8 podría almacenar puntos de código más altas, usando 5 o 6 bytes por punto de código, pero que es ilegal.)
Sr. Lister
5

Brain-Flak , 33 bytes

Incluye +1 para -c

{((({}){}){}<>)<>}<>{({}<>)<>}<>

Pruébalo en línea!

# For each character
{
  # Multiply by 4 and move to the other stack
  ((({}){}){}<>)

# End loop
<>}

# For each character on the other stack
<>{

  # Copy it back (reverse the stack)
  ({}<>)<>

# End loop
}<>
Riley
fuente
4

Braingolf v0.6, 17 bytes

VRl1-M[R.*>v]R&@

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"

Skidsdev
fuente
4

Mathematica, 48 bytes

FromCharacterCode[4Mod[Hash/@Characters@#,978]]&

Explicación:

                             Characters@#      & - Convert string to array of characters
                       Hash/@                    - Hash them all using default hash
                   Mod[                  ,978]   - apply a modulus which uniquely transforms each potential character's hash into a number
                  4                              - times by 4 to move values out of 0x20-0x7E.
FromCharacterCode[                            ]  - Convert array of numbers back to string

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.

Input: "!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"

Salida: ingrese la descripción de la imagen aquí

El uso de Hashsurgió como ToCharacterCodees realmente largo. Sin embargo, el hashing era casi tan caro. La forma matemática fácil de hacer esto sería de 49 bytes:

FromCharacterCode[4ToCharacterCode@Characters@#]&
Ian Miller
fuente
2

CJam , 8 5 bytes

l95f+

Pruébalo en línea!

Agrega 95 a cada punto de código.

Erik el Outgolfer
fuente
¿No hay una manera de multiplicar o cuadrar en su lugar?
NieDzejkob
@NieDzejkob No, esto se basa en el hecho de que Character + Long = chr (ord (Character) + Long). Carácter * Largo = [Carácter] * Largo. Carácter # largo = error (# es exponenciación en CJam).
Erik the Outgolfer
2

PowerShell, 32 31 bytes

-1 Gracias a Neil, 99+a4*

[char[]]"$args"|%{[char](4*$_)}

multiplica 9 por cada código de carácter y lo imprime de nuevo.

colsw
fuente
Por interés, ¿funcionaría multiplicar por un pequeño número (4-9)?
Neil
los tiempos de impresión más bajos 4 son mayores que los imprimibles más grandes, eso es -1 - ¡gracias!
colsw
1

CJam , 4 bytes

lWf^

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!

Dennis
fuente
1

Decimal , 37 bytes

91D31030030012255D412D590D543D301291D

Explicación:

91D             ; declare jump 1
    310         ; push user input to stack
    300         ; duplicate
    300         ; duplicate
    12255D      ; push EOF to stack
    412D        ; compare top two values, pop, push result
    5 90D 5     ; if result == true, quit
    43D         ; multiply top two values, pop, push result
    301         ; print
    2           ; pop
91D             ; goto jump 1

Pruébalo en línea!

MD XF
fuente
Entonces, ¿saltar a cero ( 90D) termina?
Skidsdev
@Mayube Exactamente.
MD XF
1

Hojas de cálculo de Google, 68 bytes

=ArrayFormula(Join("",IfError(Char(Code(Mid(A1,Row(A:A),1))^2),"")))

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.

=ArrayFormula(Join("",Mid(A1,Row(A:A),1)))

De lo contrario, esto es lo mismo que otras soluciones: eleva al cuadrado el punto de código de cada carácter.

Tostadas de ingeniero
fuente
0

C, 42 bytes

c;f(){while(~(c=getchar()))putwchar(c*c);}

Asume un entorno local UTF-8. La entrada es al cuadrado.

Pruébalo en línea!

MD XF
fuente
0

Limpio , 25 bytes

import StdEnv

map((+)'~')

Una función parcial literal.

Pruébalo en línea!

De modo realista:

f s = {# c+'~' \\ c <-: s}

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!

Οurous
fuente