สร้างแผนที่ลูกตก


16

บทนำ

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

งาน

รับจำนวนเต็มบวกnส่งออกแผนที่ลูกตกของชั้นn ระหว่างเลเยอร์มี 4 บรรทัดใหม่ ความกว้างของเลเยอร์ประกอบด้วยอักขระขีดล่าง 25 ตัวโดยมีความยาวหนึ่งรูที่ 5 นั่นหมายความว่าความกว้างทั้งหมดเท่ากับ 30 ซึ่งจะถูกเปลี่ยนแบบสุ่มหลังจากแต่ละเลเยอร์ ตัวอย่างของเลเยอร์ที่ถูกต้องคือ:

_______________     __________

รูอาจอยู่ที่ขอบราวกับว่าเลเยอร์เป็นรูปทรงกระบอก:

  _________________________   

โปรดทราบว่ามีช่องว่างนำหน้า 2 ช่องและช่องว่างท้าย 3 ช่อง ทำให้เป็นรูเดียวที่มีความกว้าง 5

กรณีทดสอบ

สำหรับn = 4 นี่เป็นเอาต์พุตที่ถูกต้อง:

_______________     __________





______     ___________________





_______________________     __





  _________________________

หมายเหตุ: หลุมจะต้องกระจายอย่างสม่ำเสมอ อนุญาตให้ขึ้นบรรทัดใหม่และ / หรือขึ้นบรรทัดใหม่

นี่คือดังนั้นการส่งที่มีจำนวนไบต์น้อยที่สุดจะชนะ!


1
@ DonMuesli ฮ่าฮ่าที่สามารถเกิดขึ้นได้กับทุกคน: p
Adnan

คำตอบ:


7

Pyth, 19 ไบต์

VQ.>+*\_25*d5O30*b4

ลองที่นี่!

คำอธิบาย

VQ.> + * \ _ 25 * d5O30 * b4 # Q = อินพุต

VQ # ทำซ้ำ Q ครั้ง
     * \ _ 25 # 25 ขีดล่าง
          * d5 # 5 ช่องว่าง
    + # เชื่อมต่อขีดล่างและช่องว่าง
  .> O25 # หมุนสตริงนี้ 0-29 ครั้ง
                * b4 # พิมพ์บรรทัดใหม่แยกกัน

4

ทับทิม, 74 71 59

ขอบคุณ Alex A. ที่เตือนฉันว่าโดยทั่วไปแล้วเป็นหนึ่งบรรทัดหมายความว่าฉันสามารถใช้แลมบ์ stabby

f=->n{n.times{puts (('_'*25+' '*5)*2)[rand(30),30]+"\n"*5}}

putsเพิ่มบรรทัดใหม่ในตอนท้าย (ในขณะที่รูบี้printไม่ได้) ดังนั้นจึงได้รับการอัปเดตเป็น5บรรทัดใหม่
หมึกมูลค่า

ทั้งหมดลูกเห็บtimesฟังก์ชั่นสำหรับการบันทึกฉัน 3 ไบต์มากกว่าforห่วง: D
ราคาหมึก

1
57 bytes: ->n{n.times{puts (('_'*25+' '*5)*2)[rand(30),30]+"\n"*5}} ลองที่นี่
Alex A.

คุณไม่จำเป็นต้องกำหนดแลมบ์ดาให้เป็นส่วนหนึ่งของการส่งเนื่องจากเราไม่ต้องการฟังก์ชั่นในการตั้งชื่อ
Alex A.

1
คุณสามารถทำได้(->n{n.times{puts (('_'*25+' '*5)*2)[rand(30),30]+"\n"*5}})[input]หรือเพียงระบุว่าคุณต้องกำหนดมันเพื่อที่จะเรียกมัน นี่เป็นเรื่องธรรมดาในเว็บไซต์
Alex A.

3

จูเลีย 72 ไบต์

n->join([join(circshift(["_"^25*" "^5...],rand(1:30)))"\n"^5 for i=1:n])

นี่คือฟังก์ชั่นที่ไม่ระบุชื่อที่ยอมรับจำนวนเต็มและส่งกลับสตริง หากต้องการเรียกใช้กำหนดค่าให้กับตัวแปร

เราสร้างสตริงที่มีขีดล่าง 25 อันตามด้วยช่องว่าง 5 อันจากนั้นก็เครื่องหมายลงในอาร์เรย์ของอักขระ เราเปลี่ยนเป็นจำนวนครั้งแบบสุ่ม (ระหว่าง 1 ถึง 30) เข้าร่วมมันกลับเข้าไปในสตริงและตะปูบนบรรทัดใหม่ 5 บรรทัด กระบวนการนี้ทำซ้ำnครั้งโดยที่nคืออินพุต อาร์เรย์ที่เป็นผลลัพธ์จะเข้าร่วมและส่งคืน

ลองที่นี่


3

PowerShell 65 ไบต์

0..$args[0]|%{-join("_"*25+" "*5)[($r=Random 25)..($r-29)];,""*5}

เรียกห่วงสำหรับnซ้ำ รับตัวเลขสุ่มและทำเครื่องหมายขีดล่างมี 5 ช่องว่างในตอนท้าย จัดทำดัชนีลงในสตริงเป็นอาร์เรย์เพื่อดึงเริ่มต้นจากตำแหน่งสุ่ม การจัดทำดัชนีเชิงลบล้อมจากจุดสิ้นสุด เข้าร่วมที่สำรองอีกครั้งและผนวก 5 บรรทัดใหม่

แก้ไข: ฉันไม่รู้ว่าทำไมฉันจึงคิดว่าฉันต้องการพารามิเตอร์-Maximumเนื่องจากเป็นตำแหน่ง ขอบคุณTimmyD ที่ทำให้ฉันต้องโกนไบต์และลืมที่จะรับข้อมูลเพื่อที่จะผลักฉันกลับไปที่ 65


@ TimmyD ฉันจะแปลกใจถ้าใครยังมี 1.0 มีให้ดาวน์โหลดเท่านั้นและไม่ได้จัดส่งมาพร้อมกับระบบปฏิบัติการใด ๆ 2.0 ควรได้รับการพิจารณาเป็นบรรทัดฐาน
Matt

@ TimmyD ฉันเห็นด้วยกับจุดนั้นไม่ใช่ที่ที่เกี่ยวข้องกับPowerShell 1.0 หากใครก็ตามที่ใช้ไซต์นี้โดยใช้สิ่งนั้นจะทำให้ฉันประหลาดใจ ถ้าฉันใช้ฟีเจอร์ 3.0 หรือสูงกว่าฉันจะไฮไลต์ที่แน่นอน
Matt


2

SpecBAS - 93 ไบต์

1 a$="_"*25+" "*5: INPUT n: FOR i=1 TO n: r=1+INT(RND*30): ?a$(r TO)+a$( TO r-1)''''': NEXT i

ทำให้สตริงเป็น 25 ขีดล่าง + 5 ช่องว่างเลือกจุดเริ่มต้นแบบสุ่มและต่อท้ายสตริงที่ตำแหน่งนั้นและเริ่มต้นการเรียงสตริงให้เป็นจุดสิ้นสุด

อะพอสโทรฟีบังคับให้ขึ้นบรรทัดใหม่ดังนั้น 1 ที่ส่วนท้ายของสตริงและ 4 บรรทัดว่าง


2

MATL , 23 ไบต์

:"95l25X"5Z"h30YrYS10ct

ลองออนไลน์!

คำอธิบาย

:"           % take input n implicitly. Repeat loop n times
  95l25X"    %   row vector with number 95 ('_') repeated 25 times
  5Z"        %   row vector of 5 blank spaces
  h          %   concatenate vertically
  30Yr       %   random number uniformly distributed on [1,2,...,30]
  YS         %   circularly shift
  10c        %   newline character. Includes another newline when printed
  t          %   duplicate
             % implicitly end loop and display stack contents

2

ชวา 177 140 ไบต์

-1 ไบต์ไปยัง Blue ย้าย i ++

-2 ไบต์ถึงฉันปล่อยให้ช่องว่างที่ไม่มีความหมายในต้นฉบับ

-34 ไบต์ถึง Blue สำหรับการตระหนักว่าฉันไม่ต้องการถ่าน [] เลย

เพราะคุณรู้ชวา

n->{String s="";for(;n-->0;){int r=(int)(Math.random()*30);for(int i=0;i<30;){s+=i>r&i<r+6|r>24&i++<=r%25?" ":"_";}s+="\n\n\n\n";}return s;}

ungolfed เล็กน้อย:

Function<Integer, String> fallingBall = n -> {
    String s = "";
    for (;n-->0;) {
        int r = (int)(Math.random()*30);
        for (int i=0; i<30; i++) {
            s += i>r&i<r+6|r>24&i<=r%25?" ":"_";
        }
        s += "\n\n\n\n";
    }
    return s;
}

เนื่องจาก Java ไม่มี String 'หมุน' ฉันจึงต้องใช้วิธีอื่น ฉันสร้าง int 0-29 แบบสุ่มที่แสดงถึงดัชนีเริ่มต้นของหลุม (OBO เพราะ>สั้นกว่า>=) ตัวละครแต่ละตัวจะถูกตัดสินโดยตรรกะ

l[index] = (index>random && index<random+6) || (random>24 && index<=random%25) ? ' ' : '_';

สิ่งนี้จัดการกับลักษณะ "การห่อ" ของทั้งหมด


โดยการวาง i ++ สถานที่สุดท้ายที่ฉันถูกใช้คุณสามารถบันทึกไบต์
Blue

ฉลาด. แฮ็ก แต่ฉลาด อย่างชาญฉลาดยังเป็นฉันออกจากช่องว่างที่ไม่มีความหมายที่จุดเริ่มต้นของตัวอย่างของฉัน ( s = "") ทั้งสองได้รับการแก้ไขแล้ว
CAD97

นอกจากนี้คุณยังสามารถบันทึกเพิ่มเติมได้โดยกำจัดอาร์เรย์ถ่านเปลี่ยนตัวอักษรถ่านเป็นตัวอักษรสตริงและใช้ s + = ในภายในสำหรับวง ฉันเพิ่งทดสอบมัน
Blue

คำตอบที่ดี Btw
บลู

นั่นคือสิ่งที่ฉันได้รับจากการมุ่งเน้นไปที่วิธีการหนึ่ง -34 (!) ไบต์
CAD97

1

Python 3.5 - 109 113 bytes (+4 สำหรับการพิมพ์ 4 บรรทัดใหม่ระหว่างผลลัพธ์แต่ละรายการ):

def g(a,j='_'*25+' '*5):
 for l in range(a):import random;n=random.randrange(len(j)+1);print(j[-n:]+j[:-n]+'\r'*4)

แบบฟอร์ม Ungolfed:

# j is the starting string with the 25 underscores and then 5 spaces at the end
def g(a,j='_'*25+' '*5):
    import random #Import the random module
    for l in range(a): # Do the following as many times as provided by the user
        n=random.randrange(len(j)+1) Get a random number in the range 0-29
        print(j[-n:]+j[:-n]+'\r'*4) #Shift the string characters right "n" times and print out the results with 4 new lines in between

โดยพื้นฐานแล้วสิ่งที่เกิดขึ้นคือสตริง 'j' ซึ่งประกอบด้วย 25 ขีดล่างตามด้วยช่องว่าง 5 ช่องจะได้รับเป็นอาร์กิวเมนต์สำหรับฟังก์ชัน "g" จากนั้นโมดูลสุ่มจะถูกนำเข้าและหลายครั้งตามที่ผู้ใช้ระบุหมายเลขสุ่มจะถูกเลือกในช่วง0 => 29และสตริง "j" จะเลื่อนไปทางขวาหลายครั้ง ผลลัพธ์จะถูกพิมพ์ออกมาหลังการวนซ้ำแต่ละครั้งโดยมี 4 บรรทัดใหม่อยู่ระหว่างแต่ละผลลัพธ์


สิ่งนี้จะพิมพ์บรรทัดใหม่ด้วยหรือไม่
Adnan

@AanN ตอนนี้มันทำ :)
R. Kap

คุณจะต้องพิมพ์บรรทัดใหม่ 4 บรรทัด: p ดังนั้นการเปลี่ยน'\r'ไปใช้'\r'*4อาจจะใช้ได้ นอกจากนี้ผมคิดว่าคุณสามารถเปลี่ยนไปrange(a+1) range(a)
Adnan

@AandN ที่จริงแล้วการใช้range(a)พิมพ์a-1จำนวนบรรทัดดังนั้นrange(a+1)วิธีที่ดีที่สุดในการพิมพ์จำนวนบรรทัดที่ผู้ใช้ให้ นอกจากนี้มันยังพิมพ์บรรทัดใหม่ 4 บรรทัดระหว่างแต่ละผลลัพธ์
R. Kap

อืมมันแปลกเพราะฉันทดสอบกับg(5)มันและมันพิมพ์ 6 สตริงแทนห้าดังนั้นการเปลี่ยนa+1เป็นaอาจจะแก้ไขได้
Adnan

1

Python 119 103 ไบต์

import random
s='_'*20+' '*5
def f(n,a=random.randint(0,25)):[print(s[a:]+s[:a]+3*'\n')for _ in' '*n]

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