Imprimer du texte invisible


38

Avec une chaîne en entrée, génère un nombre de caractères d'espacement (0x0A et 0x20) égal à la longueur de la chaîne.

Par exemple, étant donné la chaîne dont Hello, World!votre code aurait besoin pour générer exactement 13 caractères d'espacement et rien d'autre. Ceux-ci peuvent être n'importe quelle combinaison d'espaces et de nouvelles lignes.

Votre code ne doit pas générer de saut de ligne supplémentaire ni d'espaces.

Cas de test:

     Input      -> Amount of whitespace to output
"Hello, World!" -> 13
"Hi"            -> 2
"   Don't
Forget about
Existing
Whitespace!   " -> 45
""              -> 0
"             " -> 13
"
"               -> 1

Notation:

C'est du si peu d'octets gagnent!


1
Je ne comprends pas ce que vous entendez par «0x0A». Où cela devrait-il être produit? Est-ce que cela devrait être gardé, alors “a␠b␊c” devient “␠␠␠␊␠”?
manatwork

1
@manatwork 0x0Aet 0x20sont les valeurs hexadécimales des caractères Newline et Space respectivement
Skidsdev

1
“Afficher un nombre de caractères d'espacement (0x0A et 0x20)” - Où devraient se trouver ces caractères de nouvelle ligne dans la sortie?
manatwork

3
These can be any mix of spaces and newlinesVotre sortie peut correspondre à n’importe quel mélange d’espaces et de nouvelles lignes. Vous pouvez simplement créer des espaces si vous le souhaitez, comme tout le monde, ou simplement produire des nouvelles lignes. À vous de
jouer

1
Je l'ai. Merci.
manatwork

Réponses:


137

Whitespace , 311 150 77 68 65 46 41 38 octets

-3 octets grâce à Kevin Cruijssen
-27 octets grâce à Ephphatha


  
   	 	 
 
  
 	
	 			
	  
	
  
 


Essayez-le en ligne!

Un format visible

'\n  \n   \t \t \n \n  \n \t\n\t \t\t\t\n\t  \n\t\n  \n \n\n'

Explication (s = espace, t = tabulation, n = nouvelle ligne)

nssn     # label(NULL) - loop start
ssststsn # push 10 in the stack -> [10]
sns      # duplicate the top of the stack -> [10, 10]
sns      # duplicate the top of the stack -> [10, 10, 10]
tnts     # read a single char from input, pop the stack and store at that address -> [10, 10] [10:<char that was read>]
ttt      # pop the stack and put the value at that adress on stack -> [10,<char>] [10:<char>]
ntssn    # jump to label(0) - since label(0) is not defined, the interpreter jumps to the end of the program - if the top of the stack (char) is 0 -> [10] [10:<char>]
tnss     # pop the top of the stack and print as ascii -> [] [10:<char>]
nsnn     # go back to the label(NULL)

25
En supposant que cela fonctionne réellement, cela remportera définitivement mon vote pour la réponse la plus créative
Skidsdev

24
Attends, où est la réponse? Est-ce invisible aussi?
Erik the Outgolfer

16
QU'EST-CE QUE LA MAGIE NOIRE? Votre code n'est même pas là! -1
Christopher

28
@Christopher plus comme WHITEspace MAGIC
Rod

12
Je savais que quelqu'un répondrait à cette question avec un programme d'espaces blancs
Draco18s

59

Japt , 1 octet

ç

Essayez-le en ligne!


22
Japt a-t-il sérieusement intégré cela? Merde ...
Skidsdev

22
@ Mayube et bien il a une fonction intégrée pour remplacer tous les caractères d'une chaîne par une autre, et le remplacement par défaut est un espace;)
Tom

4
Très agréable! Pour ceux qui exécutent le programme, vous pouvez ajouter le -Qdrapeau dans l'entrée pour mettre des guillemets autour de la sortie. TIO
Oliver

38

Haskell , 7 octets

(>>" ")

Essayez-le en ligne! Utilisation: (>>" ") "Hello, world!".

Étant donné deux listes (et les chaînes sont des listes de caractères dans Haskell), l' >>opérateur répète la deuxième liste autant de fois que la première liste contient des éléments. Définir " "comme deuxième argument signifie que nous concaténons autant d'espaces que la chaîne d'entrée est longue.


Alternative (même nombre d'octets):

(' '<$)

Essayez-le en ligne! Utilisation: (' '<$) "Hello, world!".

À partir d’une valeur et d’une liste, l’ <$opérateur remplace chaque valeur de la liste par la valeur donnée. Il en 5 <$ "abc"résulte [5,5,5], et ' ' <$ "abc"dans " ".

La fonction peut être écrite de la même manière (<$)' ', au cas où vous voudriez trouver plus de créatures marines dans mon code.


18
C'est comme un adorable petit poisson sans fin
Taylor Scott



17

Retina, 3 4 octets

S\`.

Ancienne version, ne fonctionne pas car Retina imprime un saut de ligne final.

.
 

(La deuxième ligne contient un espace).


2
La rétine TIO est assez facile à utiliser. Voici votre réponse
Digital Trauma

2
Malheureusement, Retina imprime un saut de ligne de fin par défaut. Vous devrez prévoir \`pour éviter cela. Ensuite, son utilisation est plus courte S\`., car chaque caractère est remplacé par un saut de ligne (car il divise l’entrée autour de chaque caractère).
Martin Ender

@MartinEnder Ahhh n'était pas sûr qu'il s'agisse d'un problème de rétine ou de TIO. Merci pour l'aide sur la sauvegarde d'un octet!
TheLethalCoder


13

Brainfuck, 16 octets

Imprime les nouvelles lignes.

,[>++++++++++.,]

11

C #, 28 24 octets

s=>"".PadLeft(s.Length);

Ancienne version utilisant le stringconstructeur pour 28 octets:

s=>new string(' ',s.Length);

3
Voulait faire exactement la même chose
LiefdeWen

1
@StefanDelport Il faut être rapide avec C # quand je suis dans le coin :) Linq veut faire de même, mais ils sont BEAUCOUP plus longs ...
TheLethalCoder


9

Mathematica, 21 octets

StringReplace[_->" "]

1
Si l'entrée de liste de caractères était autorisée, cela pourrait être le cas #/._->" "&. Malheureusement, l'entrée est une chaîne et Characters [] le rend un octet plus long que votre solution :(
CalculatorFeline

1
Cela n'a-t-il pas besoin d'un #et d'un &? Par exempleStringReplace[#,_->" "]&
Ian Miller

3
@IanMiller Pas dans Mathematica 10.4 ou 11. reference.wolfram.com/language/ref/StringReplace.html
alephalpha

2
Ah ok. Je n'ai que 10.3. Peut-être temps de surclasser ...
Ian Miller

8

JavaScript ES6, 22 octets

a=>a.replace(/./g," ")

f=a=>a.replace(/./g," ");

var test = f("Hello, World!");
console.log(test, test.length);


3
Hein, je me suis dit: "Oh, sachez que ça devrait être s=>s.replace(/[^]/g," ")un octet plus long que l'autre solution". Il ne m'est pas
venu à l'esprit

8

C, 31 octets

f(char*c){puts(""),*c++&&f(c);}

1
Comment cela diffère-t-il de votre autre réponse C ? Il est clair que celui-ci est plus court, mais devriez-vous simplement éditer l’autre? Devrait-il s'agir d'une réponse avec deux solutions?
Tas

4
@Tas Tout d'abord, je pense que dans un certain sens, je pense que ce n'est pas aussi bon que l'autre, même s'il est plus court, car il ne compile pas réellement tel quel. C'est juste une fonction donc vous devez écrire une routine principale autour d'elle. Cependant, il est plus court et d’autres semblent ne publier que des fonctions. Clairement, ce sont deux solutions très différentes. L’un n’est pas l’affinement de l’autre, il est donc logique que ce soit deux réponses différentes. Cependant, je suis nouveau dans cette communauté. Le consensus est-il qu'un utilisateur ne publie qu'une seule réponse? Si c'est le cas, je le ferai la prochaine fois.
Sigvaldm

La virgule doit-elle vraiment être une virgule et non un point-virgule?
Oskar Skog

1
@OskarSkog eh bien, dans ce cas, cela n'a pas beaucoup d'importance, car il n'y a pas de lhs
chat.

1
@OskarSkog Oui, cela devrait être une virgule. Comme @cat le dit, cela n'a pas vraiment d'importance dans ce cas, mais j'ai choisi une virgule comme variante :) L'opérateur de virgule évalue deux expressions (par exemple, i++, j++une boucle for) et renvoie celle qui se trouve le plus à droite. Un détail important est que la récursivité doit s'arrêter d'une manière ou d'une autre. &&n'évalue pas si c'est faux si c'est faux. *c++évalue false lorsqu'il pointe vers la terminaison NULL de la chaîne.
Sigvaldm


7

Excel VBA, 17 15 octets

Fonction de fenêtre immédiate VBE anonyme qui prend en entrée la cellule [A1]et en sortie des espaces de longueur de l'entrée dans la fenêtre immédiate VBE

?Spc([Len(A1)])

7

05AB1E , 3 octets

vð?

Essayez-le en ligne!

v   # For each character...
 ð? #    Output a space without a newline

Autres solutions sur 3 octets (Merci à Magic Octopus Urn et à Kevin Cruijssen pour la plupart)

v¶? # For each character print a newline (without adding a newline)
võ, # For each character print the empty string with a newline
gð× # Get the length, concatenate that many copies of space
g¶× # Get the length, concatenate that many copies of newline
Sð: # Split, push a space, replace each char in input with a space
ðs∍ # Push ' ', swap, make the string of spaces as long as the input was
võJ # For each char, push a space and ''.join(stack)
v¶J # For each char, push a newline and ''.join(stack)
€ðJ # For each char, push a space. Then ''.join(stack)
ۦJ # For each char, push a newline. Then ''.join(stack)

1
Autre solution: gð×le reste que j'ai trouvé était au-dessus de 3 comme:õ‚.B¤
Urne Magique Octopus

2
Un autre amusant:Sð:
Urne Magique Octopus

1
Plus de plaisir:ðs∍
Urne magique Octopus

Quelques autres alternatives 3-byters: võJ/ v¶J; €ðJ/ €¶J. Et comme une séquence de caractères en tant qu'E / S est autorisée par défaut lorsque des chaînes d'E / S sont demandées, certaines versions à 2 octets sont possibles: €ð/ €¶/ εð/ ε¶et ð:/ ¶:. Bien qu’il s’agisse d’un défi assez ancien et que toutes les autres réponses utilisent des chaînes réelles, je pourrais comprendre si vous le conserviez en tant que chaîne d’entrée / sortie.
Kevin Cruijssen



6

C, 45 octets

Utilisation de main. Compilez avec gcc, ignorez les avertissements.

main(c,v)char**v;{while(*(v[1]++))puts("");}

Usage:

$./a.out "Hello, World!"

1
Toute raison pour laquelle vous ne pouvez pas mettre char**ven main(c,v)?
CalculatriceFeline

@CalculatorFeline Au moins la compilation de GCC 6.3.1 avec gcc main.cne semble pas permettre de mélanger la définition de fonction ANSI avec la définition de fonction K & R, main(c,char**v)elle ne compilera donc pas. Je dois faire main(int c,char**v)ou main(c,v)char**v;dont le dernier est plus court de 3 octets. Par hasard, vous ne connaissez aucun drapeau ou quelque chose qui permette de mélanger ces styles?
Sigvaldm

3
Non, vous ne pouvez pas les mélanger. Aucun drapeau ne le permet. Le style K & R est depuis longtemps obsolète, utilisé uniquement à des fins de golf et de dissimulation de code.
Cody Grey

Et je suppose que supprimer char**ventièrement ne compile pas non plus.
CalculatriceFeline

@CalculatorFeline Si vous omettez char**complètement, le compilateur l'interprétera comme int. Si je ne me trompe pas, vous obtenez une erreur en essayant de déréférencer un lien intet même si vous ne le faites pas, le programme ne ferait pas ce que vous espériez, étant donné qu’il en intconsomme plusieurs charet donc vous n’obtenez jamais de NULLvaleur.
Sigvaldm



5

> <> , 7 octets

i0(?;ao

Le programme est une boucle

i         //Push a character from the input onto the stack
 0        //Add a 0 to the stack
  (       //Pop the top two values of the stack, and push a 1 if the second is less than the first (In this case, the input has all been read), else push a 0
   ?      //Pop the top of the stack. If the value is a 0, skip the next instruction
    ;     // Terminate the program
     a    // Add a newline to the stack
      o   // Pop the top character of the stack and print it


5

Hexagone , 12 11 octets

-1 octet grâce à Martin Ender

,<.;.M@.>~8

Essayez-le en ligne!

Voici l'hexagone élargi:

  , < . 
 ; . M @
. > ~ 8 .
 . . . .
  . . .

Tant qu'il y a entrée, ce code s'exécute:

,        # Get input
 <       # Turn right (SE) if we didn't get EOF
  M8     # Set the memory edge to 778 which is 10 (mod 256)
    ;    # Print as a character (newline)
     >   # Redirect East
      ~  # Multiply by -1. This makes the pointer go to the top when it runs off the edge
       8 # Effectively a no-op.

Lorsque EOF est atteint:

,    # Get input
 <   # Turn left (NE)
  8  # Effectively a no-op
   @ # End program

Vous pouvez imprimer un saut de ligne de trois octets avec M8;(ce qui donne 778 = 10 (mod 256)). Cela devrait vous permettre de déplacer le ~où le ;est maintenant, en sauvegardant un octet.
Martin Ender


5

Python 2, 25 octets

exec'print;'*len(input())

-2 octets grâce à Loovjo
-2 octets dans le code invalide grâce à totalementhuman: p
-3 octets


1
Vous pouvez supprimer les parens après execcar c'est un mot clé dans Python 2
Loovjo

1
@ Loovjo Oh oui, Python 2. Merci!
HyperNeutrino

Je sais que c'est vieux, mais ça exec'print;'*len(input())marche.
totalement humain

1
@totallyhuman oh vrai, merci: P
HyperNeutrino

1
@TheMatt n'est probablement pas dans les spécifications du problème, mais c'est l'une des méthodes d'entrée acceptables par défaut. Essayez de chercher sur meta, je ne veux pas aller le chercher tout de suite
HyperNeutrino


4

Cubix , 6 octets

Wahoo un 6 octets!

wi?@oS

Cubifié

  w
i ? @ o
  S
  • i obtient l'entrée
  • ? test de la pile
    • si négatif (EOI) redirige vers le wchangement de voie qui va jusqu'à l' @arrêt
    • si 0 (nul) s'arrête, cela ne devrait pas être touché
    • si l’ Sowespace sur la pile est positif , afficher la sortie et changer de voie suri

Essayez-le en ligne!


1
Doux, ce n'est pas trop souvent qu'un programme Cubix est court :-)
ETHproductions

4

C, 32 octets

Essayez en ligne modifiant des caractères dans des espaces

f(char*t){(*t=*t?32:0)&&f(t+1);}

C, 37 octets

Essayez en ligne Rembourrant la fin de chaîne avec sa longueur

f(char*t){printf("%*c",strlen(t),0);}

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.