Drukuj niewidoczny tekst

38

Biorąc pod uwagę ciąg wejściowy, wypisz liczbę białych znaków (0x0A i 0x20) równych długości łańcucha.

Na przykład, biorąc pod uwagę ciąg, Hello, World!kod będzie musiał wypisać dokładnie 13 znaków spacji i nic więcej. Mogą to być dowolne kombinacje spacji i znaków nowej linii.

Twój kod nie powinien wyświetlać żadnych dodatkowych znaków nowej linii ani spacji.

Przypadki testowe:

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

Punktacja:

To jest więc wygrywa najmniej bajtów!

Skidsdev
źródło
1
Nie rozumiem, co masz na myśli z tym „0x0A”. Gdzie to powinno być wydane? Czy należy to zachować, aby „a␠b␊c” stało się „␠␠␠␊␠”?
manatwork
1
@manatwork 0x0Ai 0x20są wartościami szesnastkowymi odpowiednio dla znaków nowej linii i spacji
Skidsdev
1
„Wypisz kilka znaków spacji (0x0A i 0x20)” - Gdzie na wyjściu powinny znajdować się te znaki nowej linii?
manatwork
3
These can be any mix of spaces and newlinesTwój wynik może być dowolną kombinacją spacji i znaków nowej linii, możesz po prostu wypisywać spacje, jeśli chcesz, jak wszyscy inni, lub możesz po prostu generować znaki nowej linii. To zależy od Ciebie
Skidsdev,
1
Rozumiem. Dzięki.
manatwork

Odpowiedzi:

137

Biała spacja , 311 150 77 68 65 46 41 38 bajtów

-3 bajty dzięki Kevin Cruijssen
-27 bajtów dzięki Ephphatha


  
   	 	 
 
  
 	
	 			
	  
	
  
 


Wypróbuj online!

Widoczny format

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

Objaśnienie (s = spacja, t = tab, n = nowa linia)

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)
Pręt
źródło
25
Zakładając, że to faktycznie działa, to zdecydowanie wygrywa mój głos na najbardziej kreatywną odpowiedź
Skidsdev
24
Poczekaj, gdzie jest odpowiedź? Czy to też jest niewidoczne?
Erik the Outgolfer,
16
CO TO JEST CZARNA MAGIA. Twojego kodu nawet tam nie ma! -1
Christopher
28
@Christopher bardziej jak WHITEspace MAGIC
Rod
12
Wiedziałem, że ktoś odpowie na to pytanie za pomocą programu spacji
Draco18s,
59

Japt , 1 bajt

ç

Wypróbuj online!

Tomek
źródło
22
Czy Japt poważnie ma do tego wbudowaną funkcję? Cholera ...
Skidsdev
22
@Mayube ma wbudowaną funkcję zamiany wszystkich znaków w ciągu na inną, a domyślną zamianą jest spacja;)
Tom
4
Bardzo dobrze! Dla osób uruchamiających program możesz dodać -Qflagę do wejścia, aby wstawić cudzysłowy wokół wyjścia. TIO
Oliver
38

Haskell , 7 bajtów

(>>" ")

Wypróbuj online! Zastosowanie: (>>" ") "Hello, world!".

Biorąc pod uwagę dwie listy (i ciągi znaków są listami znaków w języku Haskell) >>operator powtórzy drugą listę tyle razy, ile pierwsza lista zawiera elementy. Ustawienie " "jako drugiego argumentu oznacza, że ​​łączymy tyle spacji, ile ciąg wejściowy jest długi.


Alternatywa (ta sama liczba bajtów):

(' '<$)

Wypróbuj online! Zastosowanie: (' '<$) "Hello, world!".

Biorąc pod uwagę pewną wartość i listę, <$operator zastępuje każdą wartość na liście podaną wartością. W ten sposób 5 <$ "abc"powoduje [5,5,5], i ' ' <$ "abc"w " ".

Funkcja może być napisana w sposób równoważny (<$)' ', na wypadek, gdybyś chciał znaleźć więcej morskich stworzeń w moim kodzie.

Laikoni
źródło
18
To jak urocza mała rybka bez drobiu
Taylor Scott
21

pieprzenie mózgu , 18 bajtów

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

Wypróbuj online!

Drukuje jeden nowy wiersz dla każdego bajtu wejścia. Zamiast tego drukowanie spacji dodałoby 4 bajty.

Nitrodon
źródło
4
Dla potomnych: Mika Lammi opublikowała sprytną 16-bajtową odpowiedź, która została pochowana. ,[>++++++++++.,]
Lynn
18

Python, 19 bajtów

lambda s:' '*len(s)
Gábor Fekete
źródło
17

Siatkówka, 3 4 bajty

S\`.

Stara wersja nie działa, ponieważ Retina drukuje wiersz końcowy.

.
 

(Drugi wiersz zawiera spację).

TheLethalCoder
źródło
2
Siatkówka TIO jest dość łatwa w użyciu. Oto twoja odpowiedź
Digital Trauma
2
Niestety, Retina domyślnie drukuje końcowe podawanie linii. Musisz to zrobić, \`aby tego uniknąć. Potem jest jednak krótszy w użyciu S\`., który zastępuje każdy znak linią (ponieważ dzieli dane wejściowe wokół każdego znaku).
Martin Ender
@MartinEnder Ahhh nie był pewien, czy chodziło o siatkówkę czy TIO. Dziękujemy za pomoc w zapisaniu bajtu!
TheLethalCoder
13

Brainfuck, 16 bajtów

Drukuje nowe linie.

,[>++++++++++.,]
Mika Lammi
źródło
11

C #, 28 24 bajtów

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

Stara wersja używająca stringkonstruktora dla 28 bajtów:

s=>new string(' ',s.Length);
TheLethalCoder
źródło
3
Chciałem zrobić dokładnie to samo
LiefdeWen
1
@StefanDelport Muszę być szybki z C #, kiedy jestem w pobliżu :) Są podejścia Linq, aby zrobić to samo, ale wszystkie są o wiele dłuższe ...
TheLethalCoder
9

Siatkówka , 5 bajtów

\`.
¶

Wypróbuj online! Zmienia wszystko w nowe linie. \`Tłumi dodatkowe przełamane Retina normalnie wyjściowego.

Neil
źródło
9

Mathematica, 21 bajtów

StringReplace[_->" "]
alephalpha
źródło
1
Jeśli dozwolone jest wprowadzanie listy znaków, może to być #/._->" "&. Niestety, wejście jest ciągiem znaków, a Znaki [] sprawiają, że jest on o jeden bajt dłuższy niż rozwiązanie :(
CalculatorFeline
1
Czy to nie wymaga #a &? EgStringReplace[#,_->" "]&
Ian Miller
3
@IanMiller Not in Mathematica 10.4 lub 11. reference.wolfram.com/language/ref/StringReplace.html
alephalpha
2
Ach ok. Mam tylko 10,3. Może czas na aktualizację ...
Ian Miller
8

JavaScript ES6, 22 bajty

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

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

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

Tomek
źródło
3
Huh, pomyślałem „o kurcze, to musiałby być s=>s.replace(/[^]/g," ")bajt dłuższy niż inne rozwiązanie”. Nie
przyszło
8

C, 31 bajtów

f(char*c){puts(""),*c++&&f(c);}
sigvaldm
źródło
1
Czym różni się to od twojej innej odpowiedzi C ? Oczywiście ten jest krótszy, ale czy powinieneś po prostu edytować drugi? Czy powinna to być tylko jedna odpowiedź z dwoma rozwiązaniami?
Tas
4
@Tas Po pierwsze, myślę, że w pewnym sensie wydaje mi się, że to nie jest tak dobre, jak inne, chociaż jest krótsze, ponieważ tak naprawdę nie kompiluje się w obecnej postaci. To tylko funkcja, więc musisz napisać wokół niej główną procedurę. Jednakże, jest krótszy i inni wydaje się zakładać funkcji odległości. Oczywiście są to dwa bardzo różne rozwiązania. Jedno nie jest udoskonaleniem drugiego, więc dla mnie ma sens, że powinny to być dwie różne odpowiedzi. Jestem jednak nowy w tej społeczności. Czy istnieje konsensus, że jeden użytkownik publikuje tylko jedną odpowiedź? Jeśli tak, zrobię to następnym razem.
sigvaldm
Czy przecinek powinien być przecinkiem, a nie średnikiem?
Oskar Skog
1
@OskarSkog dobrze, w tym przypadku nie ma to większego znaczenia, ponieważ nie ma lhs
kot
1
@OskarSkog Tak, powinien to być przecinek. Jak mówi @cat, w tym przypadku tak naprawdę nie ma to znaczenia, ale dla odmiany wybrałem przecinek :) Operator przecinka ocenia dwa wyrażenia (np. i++, j++W pętli for) i zwraca skrajnie prawe . Ważnym szczegółem jest to, że rekursja musi się jakoś zatrzymać. &&nie ocenia swojego rhs, jeśli lhs jest fałszywe. *c++ocenia false, gdy wskazuje na zerowe zakończenie łańcucha.
sigvaldm
7

Excel VBA, 17 15 bajtów

Anonimowa funkcja natychmiastowego okna VBE, która pobiera dane wejściowe z komórki [A1]i wysyła przestrzenie długości danych wejściowych do bezpośredniego okna VBE

?Spc([Len(A1)])
Taylor Scott
źródło
7

05AB1E , 3 bajty

vð?

Wypróbuj online!

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

Inne 3 bajtowe rozwiązania (dzięki Magic Octopus Urn i Kevin Cruijssen za większość z nich)

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
źródło
1
Inne rozwiązanie: gð×reszta, którą wymyśliłem, była powyżej 3, jak:õ‚.B¤
Magic Octopus Urn
2
Kolejna fajna:Sð:
Magic Octopus Urn
1
Więcej zabawy:ðs∍
Magic Octopus Urn
Niektóre bardziej alternatywne 3-bajtowe: võJ/ v¶J; €ðJ/ €¶J. A ponieważ sekwencja znaków jako We / Wy jest domyślnie dozwolona, ​​gdy pojawi się zapytanie o We / Wy, możliwe są niektóre wersje 2-bajtowe: €ð/ €¶/ εð/ ε¶i ð:/ ¶:. Chociaż ponieważ jest to dość stare wyzwanie, a wszystkie inne odpowiedzi używają rzeczywistych ciągów, zrozumiałbym, gdybyś zachował to jako ciąg I / O.
Kevin Cruijssen
6

Oktawa, 14 bajtów

@(a)["" 0*a+32]
alephalpha
źródło
6

CJam , 4 bajty

q,S*

Wypróbuj online!

Wyjaśnienie

q     e# Read input
 ,    e# Length
  S*  e# Repeat space that many times
Business Cat
źródło
6

C, 45 bajtów

Za pomocą głównego. Kompiluj z gcc, ignoruj ​​ostrzeżenia.

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

Stosowanie:

$./a.out "Hello, World!"
sigvaldm
źródło
1
Jakikolwiek powód, dlaczego nie można umieścić char**vw main(c,v)?
CalculatorFeline
@CalculatorFeline Przynajmniej kompilacja GCC 6.3.1 po prostu gcc main.cnie wydaje się pozwalać na mieszanie definicji funkcji ANSI z definicją funkcji K&R, więc main(c,char**v)nie będzie się kompilować. Muszę to zrobić main(int c,char**v)lub main(c,v)char**v;ten drugi jest o 3 bajty krótszy. Nie znałbyś przypadkowo żadnej flagi lub czegoś, co pozwalałoby mieszać te style?
sigvaldm
3
Nie, nie możesz ich mieszać. Nie ma na to flagi. Styl K&R jest od dawna przestarzały, używany tylko do gry w golfa i zaciemniania kodu.
Cody Gray
Zgaduję, że char**vcałkowite usunięcie też się nie kompiluje.
CalculatorFeline
@CalculatorFeline Jeśli char**całkowicie pominiesz, kompilator zinterpretuje go jako int. Jeśli się nie mylę, pojawia się błąd przy próbie dereferencji inti nawet jeśli tego nie zrobiłeś, program nie zrobiłby tego, czego się spodziewałeś, ponieważ intzużywa kilka sekund chari dlatego nigdy nie dostajesz NULLwartości.
sigvaldm
5

JavaScript (ES6), 23 bajty

s=>" ".repeat(s.length)
Justin Mariner
źródło
5

Excel, 18 bajtów

=REPT(" ",LEN(A1))

Dość nudne i jeden bajt dłuższy niż odpowiedź VBA .

Inżynier Toast
źródło
5

> <> , 7 bajtów

i0(?;ao

Program jest pętlą

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
źródło
5

Sześciokąt , 12 11 bajtów

-1 bajt dzięki Martin Ender

,<.;.M@.>~8

Wypróbuj online!

Oto rozwinięty hex:

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

Chociaż jest wprowadzany, ten kod działa:

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

Po osiągnięciu EOF:

,    # Get input
 <   # Turn left (NE)
  8  # Effectively a no-op
   @ # End program
Riley
źródło
Możesz wydrukować wiersz w trzech bajtach za pomocą M8;(co daje 778 = 10 (mod 256)). To powinno pozwolić ci przenieść tam, ~gdzie ;jest teraz, oszczędzając bajt.
Martin Ender
5

Perl 5 , 7 bajtów

-1 bajt dzięki @Xcali

6 bajtów kodu + -pflaga.

y// /c

Wypróbuj online!

Całkiem prosto: zastępuje każdą postać spacją.

Dada
źródło
1
y// /cjest o jeden bajt krótszy.
Xcali
5

Python 2, 25 bajtów

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

-2 bajty dzięki Loovjo
-2 bajty w niepoprawnym kodzie dzięki totalnie ludzkiemu: p
-3 bajtów

HyperNeutrino
źródło
1
Możesz usunąć parens, execponieważ jest to słowo kluczowe w Pythonie 2
Loovjo,
1
@Loovjo O racja, Python 2. Dzięki!
HyperNeutrino
Wiem, że to stare i takie tam, ale exec'print;'*len(input())działa.
całkowicie ludzki,
1
@ totalniehuman oh prawda, dzięki: P
HyperNeutrino
1
@ TheMatt prawdopodobnie nie ma go w specyfikacji problemu, ale jest to jedna z domyślnych akceptowalnych metod wprowadzania. Spróbuj spojrzeć na metę, nie chcę teraz jej
szukać
4

PHP, 36 bajtów

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

Wypróbuj online!

Generuje znaki nowej linii, ponieważ spacje są zbyt popularne

Skidsdev
źródło
$argnzamiast $argv[1]zapisywać 4 bajty. Uruchom z -Fopcją
Jörg Hülsermann
4

Cubix , 6 bajtów

Wahoo 6 bajtów!

wi?@oS

Cubified

  w
i ? @ o
  S
  • i dostaje wkład
  • ? przetestuj stos
    • jeśli ujemne (EOI) przekierowuje na wzmianę linii, która przechodzi do @zatrzymania
    • jeśli zatrzyma się 0 (null), nie należy tego uderzać
    • jeśli dodatnio Sowwypchniesz spację na stos, wyjdź i zmień linię nai

Wypróbuj online!

MickyT
źródło
1
To nie jest zbyt często program Cubix jest taki krótki :-)
ETHproductions
4

C, 32 bajty

Spróbuj modyfikować znaki online w spacje

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

C, 37 bajtów

Spróbuj online Wypełnienie lewej strony końca sznurka jego długością

f(char*t){printf("%*c",strlen(t),0);}
Khaled.K
źródło