Imprimer du vrai texte invisible


15

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

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 apar 0x01, vous ne pouvez pas utiliser 0x01comme 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 lsont remplacés par 0x03, votre code doit également remplacer tous les minuscules lpar 0x03une 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.


9
Il n'y a pas de caractère UTF-8: UTF-8 est une sérialisation d'Unicode, pas un jeu de caractères. Et si "non imprimable" a un sens dans un contexte Unicode, il est certainement beaucoup plus étroit que "tous sauf 95 des centaines de milliers de points de code alloués".
Peter Taylor

11
@PeterTaylor Étant donné que nous parlons ici en termes de codes hexadécimaux de caractères, j'ai supposé qu'il était clair que lorsque je dis caractère UTF-8, je veux dire un caractère Unicode dans l'encodage UTF-8. ASCII est également une norme de codage, pas un jeu de caractères, mais les gens n'ont aucun problème avec le terme "caractère ASCII". Quoi qu'il en soit, je vais modifier le libellé pour clarifier.
Skidsdev

3
Une raison particulière UTF-8 est requise?
CalculatriceFeline

L'entrée peut-elle être vide?
Dennis

1
+1 pour "Si vous ne parvenez pas à imprimer des caractères non imprimables"
Robert Fraser

Réponses:


13

Gelée , 3 octets

O²Ọ

Essayez-le en ligne!

Met en carré chaque point de code.


Très similaire à la solution Japt que j'ai trouvée, attendez-vous à ce que je coupe le point de code au cube au lieu de le mettre au carré - ça va avec moi de le poster?
Shaggy

2
@Shaggy Japt ≠ Jelly, vous pouvez donc le poster.
Erik the Outgolfer

Solution intelligente, ne pensait pas à la quadrature.
Skidsdev

1
Grand, je voulais juste être sûr, de peur que tu ne penses que je venais de t'arracher ta solution :)
Shaggy

4
@Shaggy il n'y a aucune directive contre le portage d'une solution dans une autre langue; s'il y en avait, ce serait terrible car il y a généralement un algorithme optimal qui donne des implémentations optimales dans la plupart des langages, et personne d'autre que la première affiche ne pourrait prouver qu'ils sont venus avec l'algorithme par eux-mêmes. Bien sûr, si vous portez en effet la solution de quelqu'un d'autre, ce n'est que du fairplay de mentionner sa réponse.
Aaron

13

Espace , 39 36 octets


  
   	  
 
  
 	
	 				  
	
  
 


Essayez-le en ligne!

Explication

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'

À 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 , 56 53 octets - mappe pour étiqueter les caractères


  
   			                 
 
  
 	
	 				   	
  
 


Essayez-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.


5
Utilisation d'un programme invisible pour imprimer du texte invisible. J'aime.
Mark

7

Japt , 5 2 octets

cp

Essayez-le en ligne


Explication

     :Implicit input of string U
c    :Map over the character codes of the string.
p    :Square them.
     :Implicit output of result.

Hmm, après un examen plus approfondi, il semble que 126 ** 3 == 2000376ce 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.
Erik the Outgolfer

1
@EriktheOutgolfer Ehm. UTF-8 a exactement la même plage que UTF-16 par définition. (En théorie, UTF-8 pourrait stocker des points de code plus élevés, en utilisant 5 ou 6 octets par point de code, mais cela est illégal.)
M. Lister

5

Brain-Flak , 33 octets

Comprend +1 pour -c

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

Essayez-le en ligne!

# 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
}<>

4

Braingolf v0.6, 17 octets

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

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"


4

Mathematica, 48 octets

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

Explication:

                             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

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.

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

Production: enter image description here

L'usage de Hashs'est produit car il ToCharacterCodeest vraiment long. Cependant le hachage était presque aussi cher. La manière mathématique simple de le faire serait de 49 octets:

FromCharacterCode[4ToCharacterCode@Characters@#]&

2

CJam , 8 5 octets

l95f+

Essayez-le en ligne!

Ajoute 95 à chaque point de code.


N'y a-t-il pas un moyen de multiplier ou de quadriller à la place?
NieDzejkob

@NieDzejkob Non, ceci est basé sur le fait que Caractère + Long = chr (ord (Caractère) + Long). Caractère * Long = [Caractère] * Long. Caractère # Long = erreur (# est l'exponentiation dans CJam).
Erik the Outgolfer


2

PowerShell, 32 31 octets

-1 Merci à neil, 99+à4*

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

multiplie 9 par chaque code de caractère et le réimprime.


Par intérêt, la multiplication par un petit nombre (4-9) fonctionnerait-elle?
Neil

le plus petit temps imprimable 4 est supérieur au plus grand imprimable, c'est -1 - merci!
colsw


1

CJam , 4 octets

lWf^

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!


1

Décimal , 37 octets

91D31030030012255D412D590D543D301291D

Explication:

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

Essayez-le en ligne!


donc sauter à zéro ( 90D) se termine?
Skidsdev

@Mayube Exactement.
MD XF

1

Google Sheets, 68 octets

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

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.

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

Sinon, c'est la même chose que pour les autres solutions: mettre au carré le point de code de chaque caractère.




0

Nettoyer , 25 octets

import StdEnv

map((+)'~')

Un littéral de fonction partielle.

Essayez-le en ligne!

De façon réaliste:

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

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!

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.