Stampa testo invisibile


38

Data una stringa come input, emette un numero di caratteri di spazi bianchi (0x0A e 0x20) pari alla lunghezza della stringa.

Ad esempio, data la stringa Hello, World!il codice dovrebbe generare esattamente 13 caratteri di spazi bianchi e nient'altro. Questi possono essere qualsiasi mix di spazi e newline.

Il codice non dovrebbe generare ulteriori righe o righe finali.

Casi test:

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

punteggio:

Si tratta di quindi vince il minor numero di byte!


1
Non capisco cosa intendi con quello "0x0A". Dove dovrebbe essere prodotto? Dovrebbe essere mantenuto, quindi "a␠b␊c" diventa "␠␠␠␊␠"?
arte

1
@manatwork 0x0Ae 0x20sono i valori esadecimali rispettivamente per i personaggi Newline e Space
Skidsdev

1
"Stampa un numero di caratteri di spazi bianchi (0x0A e 0x20)" - Dove dovrebbero trovarsi nell'output quei caratteri di nuova riga?
arte

3
These can be any mix of spaces and newlinesIl tuo output può essere un qualsiasi mix di spazi e newline, puoi semplicemente output spazi se vuoi, come tutti gli altri, oppure puoi semplicemente output newline. Dipende da te
Skidsdev

1
Fatto. Grazie.
arte

Risposte:


137

Spazio bianco , 311 150 77 68 65 46 41 38 byte

-3 byte grazie a Kevin Cruijssen
-27 byte grazie a Ephphatha


  
   	 	 
 
  
 	
	 			
	  
	
  
 


Provalo online!

Un formato visibile

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

Spiegazione (s = spazio, t = tab, n = nuova riga)

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
Supponendo che funzioni davvero, questo vince sicuramente il mio voto per la risposta più creativa
Skidsdev

24
Aspetta dov'è la risposta? È anche invisibile?
Erik the Outgolfer,

16
CHE COSA È LA MAGIA NERA. Il tuo codice non è nemmeno lì! -1
Christopher,

28
@Christopher più come WHITEspace MAGIC
Rod

12
Sapevo che qualcuno avrebbe risposto a questa domanda con un programma sugli spazi bianchi
Draco18s

59

Japt , 1 byte

ç

Provalo online!


22
Japt ha seriamente incorporato per questo? Accidenti ...
Skidsdev,

22
@Mayube ha un builtin per sostituire tutti i caratteri di una stringa con un altro e la sostituzione predefinita è uno spazio;)
Tom

4
Molto bella! Per coloro che eseguono il programma, è possibile aggiungere il -Qflag nell'input per inserire virgolette attorno all'output. TIO
Oliver,

38

Haskell , 7 byte

(>>" ")

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

Dati due elenchi (e le stringhe sono elenchi di caratteri in Haskell) l' >>operatore ripeterà il secondo elenco tutte le volte che il primo elenco contiene elementi. L'impostazione " "come secondo argomento significa che concateniamo tanti spazi quanti la stringa di input è lunga.


Alternativa (stesso conteggio byte):

(' '<$)

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

Dato un valore e un elenco, l' <$operatore sostituisce ogni valore nell'elenco con il valore dato. Quindi 5 <$ "abc"risulta in [5,5,5]e ' ' <$ "abc"in " ".

La funzione può essere equivalentemente scritta come (<$)' ', nel caso in cui volessi trovare altre creature marine nel mio codice.


18
È come un adorabile piccolo pesce senza pinne
Taylor Scott,



17

Retina, 3 4 byte

S\`.

Vecchia versione, non funziona perché Retina stampa un feed riga finale.

.
 

(La seconda riga contiene uno spazio).


2
La retina TIO è abbastanza facile da usare. Ecco la tua risposta
Digital Trauma,

2
Sfortunatamente, Retina stampa un avanzamento riga di default. Dovrai anteporre \`per evitarlo. Quindi è più breve da usare S\`., tuttavia, che sostituisce ogni carattere con un avanzamento di riga (perché divide l'input attorno a ciascun carattere).
Martin Ender,

@MartinEnder Ahhh non era sicuro che fosse una cosa Retina o TIO. Grazie per l'aiuto nel salvare un byte lì!
TheLethalCoder



11

C #, 28 24 byte

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

Vecchia versione che utilizza il stringcostruttore per 28 byte:

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

3
Volevo

1
@StefanDelport Devo essere veloce con C # quando sono in giro :) Ci sono approcci Linq per fare lo stesso ma sono tutti
MOLTO


9

Mathematica, 21 byte

StringReplace[_->" "]

1
Se fosse consentito l'input di charlist, questo potrebbe essere #/._->" "&. Purtroppo, l'input è una stringa e Characters [] lo rende un byte più lungo della tua soluzione :(
CalculatorFeline

1
Questo non ha bisogno di a #e a &in esso? Ad esempioStringReplace[#,_->" "]&
Ian Miller

3
@IanMiller Non in Mathematica 10.4 o 11. reference.wolfram.com/language/ref/StringReplace.html
alephalpha

2
Ah ok. Ho solo 10.3. Forse è tempo di aggiornare ...
Ian Miller

8

JavaScript ES6, 22 byte

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

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

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


3
Eh, ho pensato "oh maledizione, dovrebbe essere s=>s.replace(/[^]/g," "), un byte più lungo dell'altra soluzione". Non mi è
venuto

8

C, 31 byte

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

1
In che modo differisce dall'altra tua risposta C ? Chiaramente questo è più corto, ma avresti dovuto semplicemente modificare l'altro? Dovrebbe essere solo una risposta con due soluzioni?
Tas,

4
@Tas Prima di tutto, immagino in un certo senso che non sia buono come l'altro anche se è più corto, perché in realtà non si compila così com'è. È solo una funzione, quindi è necessario scrivere una routine principale attorno ad essa. Tuttavia, è più breve e altri sembrano pubblicare solo funzioni. Chiaramente sono due soluzioni molto diverse. L'una non è la raffinatezza dell'altra, quindi per me ha senso che dovrebbero essere due risposte diverse. Tuttavia, sono nuovo di questa community. Il consenso è che un utente pubblica solo una risposta? Se è così lo farò la prossima volta.
sigvaldm,

La virgola dovrebbe davvero essere una virgola e non un punto e virgola?
Oskar Skog,

1
@OskarSkog bene, in questo caso non ha molta importanza perché non c'è lhs
cat

1
@OskarSkog Sì, dovrebbe essere una virgola. Come dice @cat, in questo caso non importa, ma ho scelto la virgola per la variazione :) L'operatore virgola valuta due espressioni (ad esempio i++, j++in un ciclo for) e restituisce quella più a destra. Un dettaglio importante è che la ricorsione deve fermarsi in qualche modo. &&non valuta rhs se è lhs falso. *c++valuta false quando punta alla terminazione null della stringa.
sigvaldm,


7

Excel VBA, 17 15 byte

Funzione di finestra immediata VBE anonima che prende l'input dalla cella [A1]e genera spazi di lunghezza dell'input nella finestra immediata di VBE

?Spc([Len(A1)])

7

05AB1E , 3 byte

vð?

Provalo online!

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

Altre soluzioni a 3 byte (grazie a Magic Octopus Urn e Kevin Cruijssen per la maggior parte di questi)

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
Altra soluzione gð×:, il resto che mi è venuto in mente era superiore a 3 come:õ‚.B¤
Magic Octopus Urn

2
Un altro divertente:Sð:
Magic Octopus Urn,

1
Più divertente:ðs∍
Magic Octopus Urn il

Alcuni altri 3 byte alternativi: võJ/ v¶J; €ðJ/ €¶J. E poiché una sequenza di caratteri come I / O è consentita per impostazione predefinita quando viene richiesto l'I / O di stringhe, sono possibili alcune versioni a 2 byte: €ð/ €¶/ εð/ ε¶e ð:/ ¶:. Anche se questa è una sfida piuttosto vecchia e tutte le altre risposte usano stringhe effettive, potrei capire se la mantenessi come I / O di stringa.
Kevin Cruijssen,



6

C, 45 byte

Utilizzando principale. Compila con gcc, ignora gli avvisi.

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

Uso:

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

1
Qual è il motivo per cui non si può mettere char**vin main(c,v)?
CalculatorFeline

@CalculatorFeline Almeno la compilazione di GCC 6.3.1 semplicemente con gcc main.cnon sembra consentire il missaggio della definizione della funzione ANSI con la definizione della funzione K&R, quindi main(c,char**v)non verrà compilata. Devo fare main(int c,char**v)o main(c,v)char**v;di cui quest'ultimo è più corto di 3 byte. Non sapresti per caso qualche bandiera o qualcosa che permetta di mescolare questi stili?
sigvaldm,

3
No, non puoi mescolarli. Non c'è bandiera che lo permetta. Lo stile K&R è da lungo tempo obsoleto, utilizzato solo a fini di golf e offuscamento del codice.
Cody Gray,

E immagino che la rimozione del char**vtutto non si compili neanche.
CalculatorFeline

@CalculatorFeline Se si omette del char**tutto il compilatore lo interpreterà come int. Se non sbaglio si ottiene un errore nel tentativo di dereferenziare un inte anche se non lo facessi il programma non farebbe quello che ti aspettavi che facesse dal momento che intconsuma diversi se charquindi non ottieni mai un NULLvalore.
sigvaldm,



5

> <> , 7 byte

i0(?;ao

Il programma è un ciclo

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

Esagonia , 12 11 byte

-1 byte grazie a Martin Ender

,<.;.M@.>~8

Provalo online!

Ecco l'esagono espanso:

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

Mentre c'è input, questo codice viene eseguito:

,        # 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 viene raggiunto l'EOF:

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

È possibile stampare un avanzamento riga in tre byte con M8;(che fornisce 778 = 10 (mod 256)). Ciò dovrebbe consentire di spostare il punto in ~cui si ;trova ora, salvando un byte.
Martin Ender,


5

Python 2, 25 byte

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

-2 byte grazie a Loovjo
-2 byte nel codice non valido grazie a totalhuman: p
-3 byte


1
Puoi rimuovere le parentesi dopo execche è una parola chiave in Python 2
Loovjo

1
@Loovjo Oh giusto, Python 2. Grazie!
HyperNeutrino,

So che questo è vecchio e roba ma exec'print;'*len(input())funziona.
totalmente umano il

1
@totallyhuman oh true, grazie: P
HyperNeutrino,

1
@TheMatt probabilmente non è nelle specifiche del problema ma è uno dei metodi di input accettabili predefiniti. Prova a cercare meta, non voglio andare a cercarlo adesso
HyperNeutrino,


4

Cubix , 6 byte

Wahoo a 6 byter!

wi?@oS

Cubified

  w
i ? @ o
  S
  • i ottiene input
  • ? test in cima allo stack
    • se il reindirizzamento negativo (EOI) sul wcambio di corsia si @arresta
    • se 0 (null) ferma questo non dovrebbe essere colpito
    • se lo Sowspazio positivo spinge verso lo stack, emette e cambia corsiai

Provalo online!


1
Dolce, non è troppo spesso un programma Cubix è così breve :-)
ETHproductions

4

C, 32 byte

Prova a modificare online i caratteri in spazi

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

C, 37 byte

Prova Online Riempimento a sinistra della fine della stringa con la sua lunghezza

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.