พิมพ์ข้อความที่มองไม่เห็น


38

รับสตริงเป็นอินพุตเอาต์พุตจำนวนอักขระช่องว่าง (0x0A และ 0x20) เท่ากับความยาวของสตริง

ตัวอย่างเช่นการกำหนดสตริงที่Hello, World!รหัสของคุณจะต้องส่งออก 13 ตัวอักษรช่องว่างและสิ่งอื่นใด สิ่งเหล่านี้อาจเป็นการผสมผสานระหว่างช่องว่างกับการขึ้นบรรทัดใหม่

รหัสของคุณไม่ควรส่งออกบรรทัดใหม่หรือช่องว่างที่ต่อท้ายเพิ่มเติม

Testcases:

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

เกณฑ์การให้คะแนน:

นี่คือดังนั้นไบต์ที่น้อยที่สุดจึงชนะ!


1
ฉันไม่เข้าใจความหมายของคำว่า“ 0x0A” ควรส่งออกที่ไหน ควรที่จะถูกเก็บไว้ดังนั้น“ a␠b␊c” กลายเป็น“ ␠␠␠␊␠”?
จัดการ

1
@ manatwork 0x0Aและ0x20เป็นค่าเลขฐานสิบหกสำหรับอักขระ Newline และ Space ตามลำดับ
Skidsdev

1
“ ส่งออกจำนวนอักขระช่องว่าง (0x0A และ 0x20)” - อักขระบรรทัดใหม่เหล่านั้นควรอยู่ที่ไหนในผลลัพธ์
จัดการ

3
These can be any mix of spaces and newlinesเอาต์พุตของคุณอาจเป็นการผสมผสานระหว่างช่องว่างกับการขึ้นบรรทัดใหม่คุณสามารถส่งออกช่องว่างได้หากคุณต้องการเช่นคนอื่น ๆ หรือคุณสามารถออกบรรทัดใหม่ได้ มันขึ้นอยู่กับคุณ
Skidsdev

1
เข้าใจแล้ว ขอบคุณ
จัดการ

คำตอบ:


137

ช่องว่าง , 311 150 77 68 65 46 41 38 ไบต์

-3 ไบต์ขอบคุณ Kevin Cruijssen
-27 ไบต์ขอบคุณ Ephphatha


  
   	 	 
 
  
 	
	 			
	  
	
  
 


ลองออนไลน์!

รูปแบบที่มองเห็นได้

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

คำอธิบาย (s = space, t = tab, n = บรรทัดใหม่)

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
สมมติว่าวิธีนี้ใช้งานได้จริงนี่จะชนะคะแนนโหวตของฉันสำหรับคำตอบที่สร้างสรรค์มากที่สุด
Skidsdev

24
รอคำตอบอยู่ที่ไหน มันมองไม่เห็นด้วยเหรอ?
Erik the Outgolfer

16
BLACK MAGIC คืออะไร รหัสของคุณไม่ได้อยู่ที่นั่น! -1
คริสโตเฟอร์

28
@ คริสโตเฟอร์มากขึ้นเช่น WHITEspace MAGIC
Rod

12
ฉันรู้ว่าบางคนจะตอบคำถามนี้ด้วยโปรแกรมช่องว่าง
Draco18s

59

22
Japtive มี builtin สำหรับสิ่งนี้อย่างจริงจังหรือไม่? ประณาม ...
Skidsdev

22
@ Mayube ดีมันมี builtin เพื่อแทนที่ตัวละครทั้งหมดในสตริงด้วยอีกและการแทนที่ค่าเริ่มต้นคือช่องว่าง;)
Tom

4
ดีมาก! สำหรับผู้ที่รันโปรแกรมคุณสามารถเพิ่มการ-Qตั้งค่าสถานะลงในอินพุตเพื่อใส่เครื่องหมายคำพูดรอบเอาต์พุต TIO
Oliver

38

Haskellขนาด 7 ไบต์

(>>" ")

ลองออนไลน์! การใช้งาน: (>>" ") "Hello, world!".

รับสองรายการ (และสตริงเป็นรายการของตัวละครใน Haskell) >>ผู้ประกอบการจะทำซ้ำรายการที่สองหลาย ๆ ครั้งตามที่รายการแรกมีองค์ประกอบ การตั้งค่า" "เป็นอาร์กิวเมนต์ที่สองหมายถึงการที่เราเชื่อมช่องว่างให้มากที่สุดเท่าที่สตริงป้อนเข้ามีความยาว


ทางเลือก (นับไบต์เดียวกัน):

(' '<$)

ลองออนไลน์! การใช้งาน: (' '<$) "Hello, world!".

เมื่อกำหนดค่าและรายการบางรายการตัว<$ดำเนินการจะแทนที่แต่ละค่าในรายการด้วยค่าที่กำหนด ดังนั้นจึง5 <$ "abc"ส่งผลให้ใน[5,5,5]และใน' ' <$ "abc"" "

ฟังก์ชั่นสามารถเขียนเทียบเท่าได้ (<$)' 'ในกรณีที่คุณต้องการค้นหาสิ่งมีชีวิตทางทะเลเพิ่มเติมในรหัสของฉัน


18
มันเหมือนปลาไม่มีครีบตัวน้อยที่น่ารัก
Taylor Scott

21

brainfuck , 18 ไบต์

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

ลองออนไลน์!

พิมพ์หนึ่งบรรทัดใหม่สำหรับแต่ละไบต์ของอินพุต การพิมพ์ช่องว่างแทนที่จะเพิ่ม 4 ไบต์


4
สำหรับคนรุ่นหลัง: Mika Lammi โพสต์คำตอบที่ฉลาดขนาด 16 ไบต์ที่ฝังไว้ ,[>++++++++++.,]
Lynn


17

เรติน่า3 3ไบต์

S\`.

เวอร์ชันเก่าไม่ทำงานเนื่องจาก Retina พิมพ์ฟีดบรรทัดต่อท้าย

.
 

(บรรทัดที่สองมีช่องว่าง)


2
เรติน่า TIO นั้นค่อนข้างใช้งานง่าย นี่คือคำตอบของคุณ
Digital Trauma

2
น่าเสียดายที่ Retina พิมพ์บรรทัดป้อนบรรทัดตามค่าเริ่มต้น คุณจะต้องเสริม\`เพื่อหลีกเลี่ยงปัญหานั้น จากนั้นจะสั้นกว่าที่จะใช้S\`.ซึ่งแทนที่ตัวละครแต่ละตัวด้วย linefeed (เพราะแยกอินพุตรอบตัวละครแต่ละตัว)
Martin Ender

@MartinEnder Ahhh ไม่แน่ใจว่านั่นเป็นสิ่งที่ Retina หรือ TIO ขอบคุณสำหรับความช่วยเหลือในการบันทึกไบต์ที่นั่น!
TheLethalCoder



11

C #, 28 24 ไบต์

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

เวอร์ชั่นเก่าโดยใช้stringConstructor ขนาด 28 ไบต์:

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

3
ต้องการทำสิ่งเดียวกัน
LiefdeWen

1
@StefanDelport ต้องรวดเร็วด้วย C # เมื่อฉันอยู่ใกล้ ๆ :) มี Linq วิธีการทำเช่นเดียวกัน แต่พวกเขาทั้งหมดอีกต่อไป ...
TheLethalCoder


9

Mathematica ขนาด 21 ไบต์

StringReplace[_->" "]

1
หากอนุญาตให้ป้อนข้อมูล charlist อาจเป็น#/._->" "&ได้ น่าเศร้าอินพุตเป็นสตริงและอักขระ [] ทำให้หนึ่งไบต์ยาวเกินกว่าโซลูชันของคุณ :(
CalculatorFeline

1
สิ่งนี้ไม่จำเป็นต้องมี#และ&อยู่ในนั้นใช่ไหม เช่นStringReplace[#,_->" "]&
เอียนมิลเลอร์

3
@IanMiller ไม่อยู่ใน Mathematica 10.4 หรือ 11 reference.wolfram.com/language/ref/StringReplace.html
alephalpha

2
อาโอเค. ฉันมีแค่ 10.3 บางทีเวลาที่จะปรับ ...
เอียนมิลเลอร์

8

JavaScript ES6, 22 ไบต์

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

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

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


3
อืมฉันคิดว่า "โอ้ยยมันคงต้องs=>s.replace(/[^]/g," ")เป็นไบต์นานกว่าวิธีแก้ปัญหาอื่น" ฉันไม่ได้ขึ้นบรรทัดใหม่ที่ได้รับอนุญาตในผลลัพธ์: P
ETHproductions

8

C, 31 ไบต์

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

1
สิ่งนี้แตกต่างจากคำตอบ C อื่น ๆ ของคุณอย่างไร เห็นได้ชัดว่าอันนี้สั้นกว่า แต่คุณควรจะแก้ไขอีกอันไหม มันควรจะเป็นคำตอบเดียวกับสองโซลูชั่นหรือไม่?
Tas

4
@ ก่อนอื่นฉันคิดว่าในแง่หนึ่งฉันรู้สึกว่ามันไม่ดีเท่าที่อื่น ๆ แม้ว่ามันจะสั้นกว่าเพราะมันไม่ได้รวบรวมตามที่เป็นจริง มันเป็นแค่ฟังก์ชั่นดังนั้นคุณต้องเขียนรูทีนหลักรอบ ๆ มัน แต่ก็เป็นที่สั้นและอื่น ๆ ดูเหมือนว่าจะโพสต์เพียงฟังก์ชั่น เห็นได้ชัดว่ามันเป็นสองโซลูชั่นที่แตกต่างกันมาก หนึ่งไม่ได้ปรับแต่งของอื่น ๆ ดังนั้นสำหรับฉันมันทำให้รู้สึกว่ามันควรจะเป็นสองคำตอบที่แตกต่างกัน อย่างไรก็ตามฉันยังใหม่กับชุมชนนี้ ฉันทามติที่ผู้ใช้รายหนึ่งโพสต์คำตอบเดียวหรือไม่ ถ้าเป็นเช่นนั้นฉันจะทำในครั้งต่อไป
sigvaldm

เครื่องหมายจุลภาคควรเป็นเครื่องหมายจุลภาคไม่ใช่เครื่องหมายอัฒภาคหรือไม่
Oskar Skog

1
@OskarSkog ดีในกรณีนี้มันไม่สำคัญมากเพราะไม่มี lhs
cat

1
@OskarSkog ใช่มันควรเป็นเครื่องหมายจุลภาค ดังที่ @cat บอกว่ามันไม่สำคัญเลยในกรณีนี้ แต่ฉันเลือกเครื่องหมายจุลภาคสำหรับการเปลี่ยนแปลง :) เครื่องหมายจุลภาคตัวดำเนินการประเมินสองนิพจน์ (เช่นi++, j++ในการวนรอบ) และส่งกลับค่าขวาสุด รายละเอียดที่สำคัญคือการเรียกซ้ำต้องหยุดอย่างใด &&ไม่ได้ประเมินว่าเป็น rhs ถ้าเป็น lhs จริง *c++หาค่า false เมื่อชี้ไปที่การยกเลิกค่า null ของสตริง
sigvaldm


7

Excel VBA, 17 15 ไบต์

Funtion หน้าต่าง VBE แบบไม่ระบุชื่อทันทีที่รับอินพุตจากเซลล์[A1]และส่งช่องว่างของความยาวของอินพุตไปยังหน้าต่างทันที VBE

?Spc([Len(A1)])

7

05AB1E , 3 ไบต์

vð?

ลองออนไลน์!

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

โซลูชัน 3 ไบต์อื่น ๆ (ขอบคุณMagic Octopus UrnและKevin Cruijssenสำหรับสิ่งเหล่านี้)

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
วิธีแก้ปัญหาอื่น ๆ : gð×ที่เหลือที่ฉันพบมีมากกว่า 3 อัน:õ‚.B¤
Magic Octopus Urn

2
อีกหนึ่งความสนุก:Sð:
Magic Octopus Urn

1
สนุกมากขึ้น:ðs∍
Magic Octopus Urn

ทางเลือกเพิ่มเติม 3 ไบต์: võJ/ v¶J; €ðJ/ €¶J. และตั้งแต่ลำดับของตัวอักษรเป็น I / O ที่ได้รับอนุญาตโดยค่าเริ่มต้นเมื่อสตริง I / O ถามบางรุ่น 2 ไบต์เป็นไปได้: €ð/ €¶/ εð/ ε¶และ/ð: ¶:แม้ว่านี่จะเป็นความท้าทายที่ค่อนข้างเก่าและคำตอบอื่น ๆ ทั้งหมดใช้สตริงที่แท้จริง แต่ฉันก็เข้าใจได้ว่าคุณเก็บไว้ในรูปของสตริง I / O
Kevin Cruijssen



6

C, 45 bytes

Using main. Compile with gcc, ignore warnings.

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

Usage:

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

1
Any reason why you can't put char**v in main(c,v)?
CalculatorFeline

@CalculatorFeline At least GCC 6.3.1 compiling simply with gcc main.c doesn't seem to allow mixing ANSI function definition with K&R function definition, so main(c,char**v) won't compile. I either have to do main(int c,char**v) or main(c,v)char**v; of which the latter is 3 bytes shorter. You wouldn't by chance know any flag or something which allows mixing these styles?
sigvaldm

3
No, you can't mix 'em. There's no flag that allows that. K&R style is long obsolete, used only for code golfing and obfuscation purposes.
Cody Gray

And I'm guessing removing char**v entirely doesn't compile either.
CalculatorFeline

@CalculatorFeline If you omit char** entirely the compiler will interpret it as int. If I'm not mistaken you get an error trying to dereference an int and even if you didn't the program wouldn't do what you expected it to do since an int consumes several chars and therefore you never get a NULL value.
sigvaldm



5

><>, 7 bytes

i0(?;ao

The program is a 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 bytes

-1 byte thanks to Martin Ender

,<.;.M@.>~8

Try it online!

Here is the expanded hex:

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

While there is input, this code runs:

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

When EOF is reached:

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

You can print a linefeed in three bytes with M8; (which gives 778 = 10 (mod 256)). That should allow you to move the ~ where the ; is right now, saving a byte.
Martin Ender


5

Python 2, 25 bytes

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

-2 bytes thanks to Loovjo
-2 bytes in the invalid code thanks to totallyhuman :p
-3 bytes


1
You can remove the parens after exec since it's a keyword in Python 2
Loovjo

1
@Loovjo Oh right, Python 2. Thanks!
HyperNeutrino

I know this is old and stuff but exec'print;'*len(input()) works.
totallyhuman

1
@totallyhuman oh true, thanks :P
HyperNeutrino

1
@TheMatt it's probably not in the problem specs but it's one of the default acceptable input methods. Try looking on meta, I don't want to go looking for it right now
HyperNeutrino


4

Cubix, 6 bytes

Wahoo a 6 byter!

wi?@oS

Cubified

  w
i ? @ o
  S
  • i gets input
  • ? test top of stack
    • if negative (EOI) redirect onto w lane change which umps to the @ halt
    • if 0 (null) halt this shouldn't be hit
    • if positive Sow push space to the stack, output and change lane onto i

Try it online!


1
Sweet, it's not too often a Cubix program is this short :-)
ETHproductions


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.