Cetak teks yang tidak terlihat


38

Diberikan string sebagai input, output sejumlah karakter spasi putih (0x0A dan 0x20) sama dengan panjang string.

Sebagai contoh, mengingat string Hello, World!kode Anda akan perlu untuk menghasilkan persis 13 karakter spasi dan tidak ada yang lain. Ini bisa berupa campuran spasi dan baris baru.

Kode Anda seharusnya tidak menghasilkan baris atau spasi tambahan tambahan.

Testcases:

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

Mencetak:

Ini adalah sehingga byte paling sedikit menang!


1
Saya tidak mengerti maksud Anda dengan “0x0A” itu. Di mana seharusnya itu menjadi output? Haruskah itu disimpan, jadi "a␠b␊c" menjadi "␠␠␠␊␠"?
manatwork

1
@manatwork 0x0Adan 0x20masing-masing adalah nilai heksadesimal untuk karakter Newline dan Space
Skidsdev

1
"Output sejumlah karakter spasi putih (0x0A dan 0x20)" - Di mana dalam output seharusnya karakter baris baru itu?
manatwork

3
These can be any mix of spaces and newlinesOutput Anda dapat berupa campuran spasi dan baris baru, Anda bisa menampilkan spasi jika Anda mau, seperti orang lain, atau Anda bisa menampilkan baris baru. Terserah Anda
Skidsdev

1
Oke. Terima kasih.
manatwork

Jawaban:


137

Ruang putih , 311 150 77 68 65 46 41 38 byte

-3 byte terima kasih kepada Kevin Cruijssen
-27 byte terima kasih kepada Ephphatha


  
   	 	 
 
  
 	
	 			
	  
	
  
 


Cobalah online!

Format yang terlihat

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

Penjelasan (s = spasi, t = tab, n = baris baru)

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
Dengan asumsi ini benar-benar berfungsi, ini pasti memenangkan suara saya untuk jawaban paling kreatif
Skidsdev

24
Tunggu dimana jawabannya? Apakah itu juga tidak terlihat?
Erik the Outgolfer

16
APA BLACK MAGIC INI. Kode Anda bahkan tidak ada! -1
Christopher

28
@Christopher lebih menyukai WHITEspace MAGIC
Rod

12
Saya tahu seseorang akan menjawab pertanyaan ini dengan program ruang kosong
Draco18s

59

Japt , 1 byte

ç

Cobalah online!


22
Apakah japt serius memiliki builtin untuk ini? Sial ...
Skidsdev

22
@ Mayube juga memiliki builtin untuk mengganti semua karakter dalam string dengan yang lain, dan penggantian default adalah spasi;)
Tom

4
Sangat bagus! Bagi mereka yang menjalankan program, Anda dapat menambahkan -Qbendera ke input untuk menempatkan tanda kutip di sekitar output. TIO
Oliver

38

Haskell , 7 byte

(>>" ")

Cobalah online! Penggunaan: (>>" ") "Hello, world!".

Diberikan dua daftar (dan string adalah daftar karakter di Haskell) >>operator akan mengulang daftar kedua sebanyak kali daftar pertama memiliki elemen. Menetapkan " "sebagai argumen kedua berarti kami menggabungkan ruang sebanyak string input panjang.


Alternatif (jumlah byte yang sama):

(' '<$)

Cobalah online! Penggunaan: (' '<$) "Hello, world!".

Dengan sejumlah nilai dan daftar, <$operator mengganti setiap nilai dalam daftar dengan nilai yang diberikan. Dengan demikian 5 <$ "abc"menghasilkan [5,5,5], dan ' ' <$ "abc"di " ".

Fungsi ini dapat ditulis sebagai (<$)' ', jika Anda ingin menemukan lebih banyak makhluk laut dalam kode saya.


18
Ini seperti ikan kecil tak berujung yang menggemaskan
Taylor Scott



17

Retina, 3 4 byte

S\`.

Versi lama, tidak berfungsi karena Retina mencetak umpan garis tambahan.

.
 

(Baris kedua berisi spasi).


2
Retina TIO cukup mudah digunakan. Inilah jawaban Anda
Trauma Digital

2
Sayangnya, Retina mencetak linefeed trailing secara default. Anda harus menambahkan \`untuk menghindari itu. Maka lebih pendek untuk digunakan S\`., yang menggantikan setiap karakter dengan linefeed (karena membagi input di sekitar masing-masing karakter).
Martin Ender

@ MartinEnder Ahhh tidak yakin apakah itu Retina atau TIO. Terima kasih atas bantuan untuk menghemat byte di sana!
TheLethalCoder



11

C #, 28 24 byte

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

Versi lama menggunakan stringkonstruktor untuk 28 byte:

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

3
Ingin melakukan hal yang persis sama
LiefdeWen

1
@StefanDelport Harus cepat dengan C # ketika saya ada :) Ada pendekatan Linq untuk melakukan hal yang sama tetapi mereka semua BANYAK lagi ...
TheLethalCoder


9

Mathematica, 21 byte

StringReplace[_->" "]

1
Jika input charlist diizinkan, ini bisa jadi #/._->" "&. Sayangnya, inputnya berupa string dan Karakter [] membuatnya lebih lama satu byte dari solusi Anda :(
CalculatorFeline

1
Bukankah ini membutuhkan #dan ada &di dalamnya? MisalnyaStringReplace[#,_->" "]&
Ian Miller

3
@IanMiller Tidak dalam Mathematica 10.4 atau 11. reference.wolfram.com/language/ref/StringReplace.html
alephalpha

2
Ah baiklah. Saya hanya punya 10.3. Mungkin saatnya untuk meningkatkan ...
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
Huh, saya pikir "oh sial, itu harus s=>s.replace(/[^]/g," "), satu byte lebih lama dari solusi lain". Tidak terpikir oleh saya bahwa baris baru diperbolehkan dalam output: P
ETHproduksi

8

C, 31 byte

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

1
Apa bedanya dengan jawaban C Anda yang lain ? Jelas ini lebih pendek, tetapi haruskah Anda hanya mengedit yang lain? Haruskah itu hanya satu jawaban dengan dua solusi?
Tas

4
@Tas Pertama-tama, saya kira dalam beberapa hal saya merasa ini tidak sebagus yang lain meskipun lebih pendek, karena sebenarnya tidak mengkompilasi apa adanya. Ini hanya fungsi jadi Anda perlu menulis beberapa rutinitas utama di sekitarnya. Namun, ini lebih pendek dan yang lainnya sepertinya memposting fungsi yang adil. Jelas itu dua solusi yang sangat berbeda. Yang satu bukan penyempurnaan dari yang lain, jadi bagi saya masuk akal bahwa itu harus dua jawaban yang berbeda. Namun, saya baru di komunitas ini. Apakah konsensus bahwa satu pengguna hanya memposting satu jawaban? Jika demikian saya akan melakukannya lain kali.
sigvaldm

Haruskah koma benar-benar menjadi koma dan bukan titik koma?
Oskar Skog

1
@OskarSkog baik, dalam hal ini tidak masalah banyak karena tidak ada lhs
cat

1
@OskarSkog Ya, itu harus berupa koma. Seperti kata @cat, itu tidak terlalu penting dalam kasus ini, tetapi saya memilih koma untuk variasi :) Operator koma mengevaluasi dua ekspresi (misalnya i++, j++dalam for loop) dan mengembalikan yang paling kanan. Detail penting adalah bahwa rekursi harus berhenti entah bagaimana. &&tidak mengevaluasi itu rhs jika itu lhs salah. *c++mengevaluasi false ketika menunjuk ke null-termination dari string.
sigvaldm


7

Excel VBA, 17 15 Bytes

Fungsi jendela langsung VBE anonim yang mengambil input dari sel [A1]dan menghasilkan spasi panjang input ke jendela langsung VBE

?Spc([Len(A1)])

7

05AB1E , 3 byte

vð?

Cobalah online!

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

Solusi 3 byte lainnya (Terima kasih Magic Octopus Urn dan Kevin Cruijssen untuk sebagian besar dari ini)

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
Solusi lain:, gð×sisanya yang saya hasilkan berada di atas 3 seperti:õ‚.B¤
Magic Octopus Mm

2
Satu lagi yang menyenangkan:Sð:
Magic Octopus Mm

1
Lebih menyenangkan:ðs∍
Magic Octopus Mm

Beberapa alternatif 3-byters: võJ/ v¶J; €ðJ/ €¶J. Dan karena urutan karakter sebagai I / O diizinkan secara default ketika string I / O diminta, beberapa versi 2-byte dimungkinkan: €ð/ €¶/ εð/ ε¶dan ð:/ ¶:. Meskipun karena ini adalah tantangan yang cukup lama dan semua jawaban lainnya menggunakan string yang sebenarnya, saya bisa mengerti jika Anda menyimpannya sebagai string I / O.
Kevin Cruijssen



6

C, 45 byte

Menggunakan utama Kompilasi dengan gcc, abaikan peringatan.

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

Pemakaian:

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

1
Ada alasan mengapa Anda tidak dapat menempatkan char**vdi main(c,v)?
CalculatorFeline

@ CalculatorFeline Setidaknya GCC 6.3.1 mengkompilasi hanya dengan gcc main.ctampaknya tidak memungkinkan pencampuran definisi fungsi ANSI dengan definisi fungsi K&R, jadi main(c,char**v)tidak akan dikompilasi. Saya harus melakukan main(int c,char**v)atau main(c,v)char**v;yang terakhir adalah 3 byte lebih pendek. Anda tidak akan kebetulan tahu ada bendera atau sesuatu yang memungkinkan pencampuran gaya ini?
sigvaldm

3
Tidak, Anda tidak dapat mencampurnya. Tidak ada bendera yang memungkinkan itu. Gaya K&R sudah lama usang, hanya digunakan untuk tujuan kode golf dan kebingungan.
Cody Gray

Dan saya kira menghapus char**vsepenuhnya tidak mengkompilasi juga.
CalculatorFeline

@ CalculatorFeline Jika Anda menghilangkan char**sepenuhnya kompiler akan menafsirkannya sebagai int. Jika saya tidak salah, Anda mendapatkan kesalahan saat mencoba dereferensi intdan bahkan jika Anda tidak program tidak akan melakukan apa yang Anda harapkan karena intmengkonsumsi beberapa chars dan karena itu Anda tidak pernah mendapatkan NULLnilai.
sigvaldm



5

> <> , 7 byte

i0(?;ao

Program ini adalah 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


5

Hexagony , 12 11 byte

-1 byte terima kasih kepada Martin Ender

,<.;.M@.>~8

Cobalah online!

Inilah hex yang diperluas:

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

Meskipun ada input, kode ini berjalan:

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

Ketika EOF tercapai:

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

Anda dapat mencetak linefeed dalam tiga byte dengan M8;(yang menghasilkan 778 = 10 (mod 256)). Itu seharusnya memungkinkan Anda untuk pindah ke ~tempat ;sekarang, menghemat satu byte.
Martin Ender


5

Python 2, 25 byte

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

-2 bytes terima kasih kepada Loovjo
-2 bytes dalam kode yang tidak valid terima kasih kepada totallyhuman: p
-3 bytes


1
Anda dapat menghapus parens setelah execkarena itu kata kunci dalam Python 2
Loovjo

1
@Loovjo Oh benar, Python 2. Terima kasih!
HyperNeutrino

Saya tahu ini sudah tua dan masih exec'print;'*len(input())berfungsi.
totallyhuman

1
@ benar-benar tidak manusiawi oh benar, terima kasih: P
HyperNeutrino

1
@ TheMatt itu mungkin tidak dalam spesifikasi masalah tapi itu salah satu metode input standar yang dapat diterima. Coba cari di meta, saya tidak ingin mencarinya sekarang
HyperNeutrino


4

Cubix , 6 byte

Wahoo byter 6!

wi?@oS

Kubus

  w
i ? @ o
  S
  • i mendapat masukan
  • ? uji atas tumpukan
    • jika negatif (EOI) dialihkan ke wlajur perubahan yang melompat ke@ berhenti
    • jika 0 (nol) berhenti ini tidak boleh dipukul
    • jika Sowruang dorong positif ke tumpukan, keluaran dan ubah jalur kei

Cobalah online!


1
Manis, tidak terlalu sering program Cubix singkat ini :-)
ETHproduksi

4

C, 32 byte

Coba Online memodifikasi karakter menjadi spasi

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

C, 37 byte

Coba Online. Padding-end-of-string dengan panjangnya

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.