Imprimir texto invisível

38

Dada uma sequência como entrada, produza um número de caracteres de espaço em branco (0x0A e 0x20) igual ao comprimento da sequência.

Por exemplo, dada a cadeia de caracteres, Hello, World!seu código precisaria gerar exatamente 13 caracteres de espaço em branco e nada mais. Podem ser qualquer mistura de espaços e novas linhas.

Seu código não deve gerar novas linhas ou espaços à direita adicionais.

Casos de teste:

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

Pontuação:

Este é o pois o menor número de bytes vence!

Skidsdev
fonte
1
Eu não entendo o que você quer dizer com esse "0x0A". Onde isso deve ser produzido? Isso deve ser mantido, para que “a␠b␊c” se torne “␠␠␠␊␠”?
Manatwork 25/05
1
@manatwork 0x0Ae 0x20são os valores hexadecimais para os caracteres nova linha e espaço, respectivamente
Skidsdev
1
“Gera vários caracteres de espaço em branco (0x0A e 0x20)” - Onde devem estar esses caracteres de nova linha na saída?
manatwork
3
These can be any mix of spaces and newlinesSua saída pode ser qualquer mistura de espaços e novas linhas; você pode apenas gerar espaços se desejar, como todos os outros, ou apenas gerar novas linhas.
Depende de
1
Consegui. Obrigado.
Manatwork

Respostas:

137

Espaço em branco , 311 150 77 68 65 46 41 38 bytes

-3 bytes graças a Kevin Cruijssen
-27 bytes graças a Ephphatha


  
   	 	 
 
  
 	
	 			
	  
	
  
 


Experimente online!

Um formato visível

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

Explicação (s = espaço, t = tabulação, n = nova linha)

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)
Cajado
fonte
25
Assumindo que este realmente funciona, isso definitivamente ganha meu voto para a maioria resposta criativa
Skidsdev
24
Espere, onde está a resposta? Também é invisível?
Erik the Outgolfer
16
O QUE É MAGIA NEGRA? Seu código nem está lá! -1
Christopher
28
@Christopher mais como WHITEspace MAGIC
Rod
12
Eu sabia que alguém iria responder a esta pergunta com um programa de espaço em branco
Draco18s
59

Japt , 1 byte

ç

Experimente online!

Tom
fonte
22
O japt seriamente tem um builtin para isso? Droga ...
Skidsdev 25/05
22
O @Mayube também possui um builtin para substituir todos os caracteres de uma string por outra, e a substituição padrão é um espaço;)
Tom
4
Muito agradável! Para aqueles que executam o programa, você pode adicionar o -Qsinalizador na entrada para colocar aspas na saída. TIO
Oliver
38

Haskell , 7 bytes

(>>" ")

Experimente online! Uso: (>>" ") "Hello, world!".

Dadas duas listas (e seqüências de caracteres são listas de caracteres em Haskell), o >>operador repetirá a segunda lista quantas vezes a primeira lista tiver elementos. Definir " "como segundo argumento significa que concatenamos tantos espaços quanto a string de entrada é longa.


Alternativo (mesma contagem de bytes):

(' '<$)

Experimente online! Uso: (' '<$) "Hello, world!".

Dado algum valor e uma lista, o <$operador substitui cada valor na lista pelo valor fornecido. portanto5 <$ "abc" resulta em [5,5,5], e ' ' <$ "abc"em " ".

A função pode ser escrita equivalentemente como (<$)' ', caso você queira encontrar mais algumas criaturas marinhas no meu código.

Laikoni
fonte
18
É como um adorável peixes pequenos finless
Taylor Scott
21

brainfuck , 18 bytes

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

Experimente online!

Imprime uma nova linha para cada byte de entrada. Os espaços de impressão adicionariam 4 bytes.

Nitrodon
fonte
4
Para a posteridade: Mika Lammi postou uma resposta inteligente de 16 bytes que foi enterrada. ,[>++++++++++.,]
Lynn
18

Python, 19 bytes

lambda s:' '*len(s)
Gábor Fekete
fonte
17

Retina, 3 4 bytes

S\`.

Versão antiga, não funciona porque o Retina imprime um avanço de linha à direita.

.
 

(A segunda linha contém um espaço).

TheLethalCoder
fonte
2
O retio TIO é bastante fácil de usar. Aqui está a sua resposta
Digital Trauma
2
Infelizmente, o Retina imprime um avanço de linha à direita por padrão. Você precisará anexar \`para evitar isso. S\`.Porém, é mais curto de usar , que substitui cada caractere por um avanço de linha (porque divide a entrada em torno de cada caractere).
Martin Ender
@MartinEnder Ahhh não tinha certeza se isso era coisa de Retina ou TIO. Obrigado pela ajuda em salvar um byte lá!
TheLethalCoder
13

Brainfuck, 16 bytes

Imprime novas linhas.

,[>++++++++++.,]
Mika Lammi
fonte
11

C #, 28 24 bytes

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

Versão antiga usando o stringconstrutor para 28 bytes:

s=>new string(' ',s.Length);
TheLethalCoder
fonte
3
Queria fazer exatamente o mesmo
LiefdeWen
1
@StefanDelport Tem que ser rápido com C # quando estou perto :) Há Linq se aproxima para fazer o mesmo, mas todos eles são muito mais tempo ...
TheLethalCoder
9

Retina , 5 bytes

\`.
¶

Experimente online! Altera tudo para novas linhas. o\` suprime a nova linha extra de Retina faria normalmente saída.

Neil
fonte
9

Mathematica, 21 bytes

StringReplace[_->" "]
alefalpha
fonte
1
Se a entrada de lista de caracteres foi permitida, pode ser #/._->" "&. Infelizmente, a entrada é uma cadeia e Personagens [] faz com que seja um byte mais do que a sua solução :(
CalculatorFeline
1
Isso não precisa de um #e um &? Por exemploStringReplace[#,_->" "]&
Ian Miller
3
@IanMiller Não em Mathematica 10.4 ou 11. reference.wolfram.com/language/ref/StringReplace.html
alephalpha
2
Ah ok. Eu só tenho 10.3. Talvez o tempo para atualizar ...
Ian Miller
8

JavaScript ES6, 22 bytes

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

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

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

Tom
fonte
3
Huh, eu pensei "oh caramba, teria que ser s=>s.replace(/[^]/g," "), um byte mais longo que a outra solução". Não me ocorreu que novas linhas sejam permitidas na saída: P
ETHproductions
8

C, 31 bytes

f(char*c){puts(""),*c++&&f(c);}
sigvaldm
fonte
1
Como isso difere da sua outra resposta C ? Claramente este é mais curto, mas você deveria simplesmente editar o outro? Deveria ser apenas uma resposta com duas soluções?
Tas
4
@Tas Primeiro de tudo, acho que, em certo sentido, acho que isso não é tão bom quanto o outro, apesar de ser mais curto, porque na verdade não é compilado como está. É apenas uma função, então você precisa escrever uma rotina principal. No entanto, é mais curto e outros parecem publicar apenas funções. Claramente, são duas soluções muito diferentes. Um não é o refinamento do outro, então, para mim, faz sentido que sejam duas respostas diferentes. No entanto, sou novo nesta comunidade. É consenso que um usuário publica apenas uma resposta? Se sim, farei isso na próxima vez.
Sigvaldm 26/05
A vírgula deve ser realmente uma vírgula e não um ponto e vírgula?
Oskar Skog
1
@OskarSkog bem, neste caso, não importa muito, porque não há LHS
cat
1
@OskarSkog Sim, deve ser uma vírgula. Como o @cat diz, isso realmente não importa nesse caso, mas eu escolhi vírgula para variação :) O operador vírgula avalia duas expressões (por exemplo, i++, j++em um loop for) e retorna a mais à direita. Um detalhe importante é que a recursão deve parar de alguma forma. &&não avalia rhs se lhs for falso. *c++avalia false quando aponta para a terminação nula da string.
Sigvaldm
7

Excel VBA, 17 15 bytes

Função de janela imediata VBE anônima que leva a entrada da célula [A1]e gera espaços de comprimento da entrada para a janela imediata VBE

?Spc([Len(A1)])
Taylor Scott
fonte
7

05AB1E , 3 bytes

vð?

Experimente online!

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

Outras soluções de 3 bytes (Agradecemos a Magic Octopus Urn e Kevin Cruijssen pela maioria)

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)
Riley
fonte
1
Outra solução: gð×, o resto eu vim com eram acima de 3 como:õ‚.B¤
Magia Octopus Urna
2
Outra divertida:Sð:
Magic Octopus Urn
1
Mais divertido:ðs∍
Magic Octopus Urn
Alguns outros 3-byters alternativos: võJ/ v¶J; €ðJ/ €¶J. E como uma sequência de caracteres como E / S é permitida por padrão quando são solicitadas E / S de cadeias, são possíveis algumas versões de 2 bytes: €ð/ €¶/ εð/ ε¶e ð:/ ¶:. Embora esse seja um desafio bastante antigo e todas as outras respostas usem cadeias reais, eu poderia entender se você a mantinha como E / S de cadeia.
Kevin Cruijssen 15/11
6

Oitava, 14 bytes

@(a)["" 0*a+32]
alefalpha
fonte
6

CJam , 4 bytes

q,S*

Experimente online!

Explicação

q     e# Read input
 ,    e# Length
  S*  e# Repeat space that many times
Gato de negócios
fonte
6

C, 45 bytes

Usando main. Compile com o gcc, ignore os avisos.

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

Uso:

$./a.out "Hello, World!"
sigvaldm
fonte
1
Nenhuma razão para que você não pode colocar char**vem main(c,v)?
CalculatorFeline
@CalculatorFeline Pelo menos a compilação do GCC 6.3.1 simplesmente com gcc main.cnão parece permitir a mistura da definição de função ANSI com a definição de função K&R, portanto main(c,char**v), não será compilada. Eu tenho que fazer main(int c,char**v)ou main(c,v)char**v;dos quais o último é 3 bytes mais curto. Por acaso você não conheceria nenhuma bandeira ou algo que permita misturar esses estilos?
Sigvaldm 26/05
3
Não, você não pode misturá-los. Não há bandeira que permita isso. O estilo K&R é obsoleto há muito tempo, usado apenas para fins de golfe e ofuscação de código.
Cody Grey
E acho que remover char**vcompletamente também não é compilado.
CalculadoraFeline
@CalculatorFeline Se você omitir char**completamente, o compilador o interpretará como int. Se não me engano, você recebe um erro ao tentar desreferenciar inte, mesmo que não o fizesse, o programa não faria o que você esperava, pois um intconsome vários se charvocê nunca obtém um NULLvalor.
Sigvaldm
5

JavaScript (ES6), 23 bytes

s=>" ".repeat(s.length)
Justin Mariner
fonte
5

Excel, 18 bytes

=REPT(" ",LEN(A1))

Muito chato e um byte mais longo que a resposta do VBA .

Engenheiro Toast
fonte
5

> <> , 7 bytes

i0(?;ao

O programa é um loop

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
AGourd
fonte
5

Hexagonia , 12 11 bytes

-1 byte graças a Martin Ender

,<.;.M@.>~8

Experimente online!

Aqui está o hexágono expandido:

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

Enquanto houver entrada, este código é executado:

,        # 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.

Quando o EOF é alcançado:

,    # Get input
 <   # Turn left (NE)
  8  # Effectively a no-op
   @ # End program
Riley
fonte
Você pode imprimir um avanço de linha em três bytes com M8;(o que fornece 778 = 10 (mod 256)). Isso deve permitir que você mova o local ~onde ;está agora, salvando um byte.
Martin Ender
5

Perl 5 , 7 bytes

-1 byte graças a @Xcali

6 bytes de código + -psinalizador.

y// /c

Experimente online!

Bem direto: substitui cada personagem por um espaço.

dada
fonte
1
y// /cé um byte mais curto.
Xcali #
5

Python 2, 25 bytes

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

-2 bytes graças a Loovjo
-2 bytes no código inválido graças a totallyhuman: p
-3 bytes

HyperNeutrino
fonte
1
Você pode remover os parênteses após execuma vez que é uma palavra-chave em Python 2
Loovjo
1
@Loovjo Oh certo, Python 2. Obrigado!
HyperNeutrino
Eu sei que isso é velho e outras coisas, mas exec'print;'*len(input())funciona.
totallyhuman
1
@totallyhuman oh verdade, obrigado: P
HyperNeutrino 20/17/17
1
@ TheMatt provavelmente não está nas especificações do problema, mas é um dos métodos de entrada aceitáveis ​​padrão. Tente procurar na meta, eu não quero ir olhando para ele agora
HyperNeutrino
4

PHP, 36 bytes

<?=str_repeat('
',strlen($argv[1]));

Experimente online!

Gera novas linhas porque os espaços são muito comuns

Skidsdev
fonte
$argnem vez de $argv[1]salvar 4 bytes. Corra com a -Fopção
Jörg Hülsermann 15/06
4

Cubix , 6 bytes

Wahoo um byter 6!

wi?@oS

Cubificado

  w
i ? @ o
  S
  • i recebe entrada
  • ? topo da pilha de teste
    • se o redirecionamento negativo (EOI) para a wmudança de faixa, o qual é @interrompido
    • se 0 (nulo) parar, isso não deve ser atingido
    • se Sowempurrar espaço positivo para a pilha, produza e mude a faixa parai

Experimente online!

MickyT
fonte
1
Doce, não é muito frequentemente um programa Cubix é este pequeno :-)
ETHproductions
4

C, 32 bytes

Experimente caracteres de modificação on-line em espaços

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

C, 37 bytes

Experimente on - line preenchendo o final da cadeia com o comprimento

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