ทำให้ตัวละครฝนตก


31

แรงบันดาลใจจากการแชทขนาดเล็กที่ท้าทาย

รับสตริงเป็นอินพุต (อักขระที่พิมพ์ได้ ASCII เท่านั้น) ส่งออกสตริงด้วยตัวอักษร "raining" down ตัวอักษรแต่ละตัวจะต้องเป็นจำนวนสุ่มของบรรทัดลง (สุ่มระหว่าง0และความยาวของสตริงแต่ละคนมีความน่าจะเป็นไม่เป็นศูนย์) และตัวละครเดียวต่อคอลัมน์ เอาต์พุตที่เป็นไปได้ทั้งหมดต้องมีความน่าจะเป็นที่ไม่เป็นศูนย์อีกครั้งที่จะเกิดขึ้น

อาจจะสับสนเล็กน้อยดังนั้นนี่เป็นตัวอย่าง (นำมาจาก CMC นั้น):

Hello World

          d
H
       o
  llo

         l
      W
 e
        r

โปรดสังเกตว่าการHเว้นช่องว่างหนึ่งช่องเป็นเท่าไรdและlloทั้งหมดเกิดขึ้นในแนวนอน ที่rอยู่ไกลที่สุดลงไปที่9แต่ก็ยังน้อยกว่าความยาวของสตริงที่อยู่ห่างจากด้านบน นี่เป็นเพียงตัวอย่างหนึ่งที่มีหลายสิบของความเป็นไปได้อื่น ๆ Hello Worldสำหรับการป้อนข้อมูล

ตัวอย่างอื่น ๆ อาจเป็น:

test

t
 e
  s
   t


PP&CG

  & G
 P

P  C

  • เข้าและส่งออกจะได้รับโดยวิธีการที่สะดวกใด
  • อินพุตมีการรับประกันว่าไม่ว่างเปล่า (เช่นคุณจะไม่ได้รับ""เป็นอินพุต)
  • คุณสามารถพิมพ์ไปที่ STDOUT หรือส่งคืนเป็นผลลัพธ์ของฟังก์ชัน
  • ยอมรับได้ทั้งโปรแกรมหรือฟังก์ชั่น
  • ช่องว่างภายนอกใดก็ได้ที่เป็นที่ยอมรับได้ตราบใดที่ตัวอักษรเรียงกันอย่างเหมาะสม (เช่นให้อิสระในการวางเป็นสี่เหลี่ยม)
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • นี่คือเพื่อให้ใช้กฎการเล่นกอล์ฟตามปกติทั้งหมดและรหัสที่สั้นที่สุด (เป็นไบต์) ชนะ

2
คิดว่านี่จะเกี่ยวข้องกับแอนิเมชั่นเมื่อฉันอ่านชื่อ เราเคยมีเวอร์ชั่นที่เป็นภาพเคลื่อนไหวของเรื่องนี้หรือไม่?
ขนปุย

@Shaggy ไม่ใช่ว่าฉันได้เห็นหรือสามารถหาได้
AdmBorkBork

"ยอมรับพื้นที่ช่องว่างภายนอกจำนวนเท่าใดก็ได้" - นั่นรวมถึงช่องว่างชั้นนำหรือไม่?
Jonathan Allan

ฉันรู้ว่าเรามีหนึ่งรหัสตามเมทริกซ์ แต่โชคดีในการค้นหาด้วยคำหลักทั้งสอง! คุณรังเกียจไหมถ้าฉันคิดในใจแซนด์บ็อกซ์?
ปุย

คำตอบขนาดอินพุตสูงสุดจำเป็นต้องใช้คืออะไร ฉันเห็นคนจำนวนมากใช้ฟังก์ชั่นแบบสุ่มที่ใช้ "หลอกแบบสุ่ม" ในแบ็คกราวด์และคำอินพุตบางคำมีขนาดใหญ่กว่าขนาดของเมล็ดที่ใช้ในเครื่องกำเนิดไฟฟ้าเหล่านั้นและพวกเขาจะล้มเหลว "ผลลัพธ์ที่เป็นไปได้ทั้งหมดต้องมี ความน่าจะเป็นที่ไม่เป็นศูนย์ที่เกิดขึ้น " ข้อ จำกัด ที่คุณระบุ
Ferrybig

คำตอบ:


5

R , 104 ไบต์

function(s){m=matrix(" ",l<-nchar(s),l)
m[cbind(1:l,sample(l,l,T))]=el(strsplit(s,""))
write(m,1,l,,"")}

ลองออนไลน์!

อินพุตเป็นสตริง เขียนไปยัง stdout


คุณสามารถบันทึก byte โดยการใช้scan(,'')และวางสายโทรศัพท์ แต่โดยสุจริตฉันชอบฟังก์ชั่นการใช้งานอย่างมากอีกอันหนึ่งน่าเกลียดสำหรับการได้รับน้อยที่สุด อาจจุดประกายความคิดบางอย่าง ลองออนไลน์!
CriminallyVulgar

ฉันคิดว่าsample(l,,T)พอเพียงแทนsample(l,l,T)(-1 ไบต์)
Robin Ryder

4

JavaScript (ES6), 72 ไบต์

รับอินพุตเป็นรายการของอักขระ ส่งคืนเมทริกซ์ของอักขระ

a=>a.map((_,y)=>a.map((c,x)=>Math.random()<.5|!a[y+1]?(a[x]=' ',c):' '))

ลองออนไลน์!


ฉันคิดว่าคุณสามารถบันทึกหนึ่งไบต์โดยไม่ลบล้างการแสดงออกที่สาม
orthoplex

2
@orthoplex นั่นไม่ได้ผลเพราะ(0|'A') === (0|undefined)จดหมายที่เหลือจะไม่ได้รับการรับประกันอีกต่อไปที่จะปรากฏในแถวสุดท้าย (โดยพื้นฐานแล้วมันเหมือนกับ|!a[y+1]ถูกลบออกไปโดยสิ้นเชิง)
Arnauld

Google บอกว่าMath.random()คืนค่าตัวเลขใน [0, 1) แล้วMath.random()<.5กลายเป็นไม่ได้Math.random()>0เหรอ?
nedla2004

0 0

คุณใช้ JavaScript เพื่อแพลตฟอร์มใด เนื่องจากความท้าทายมีข้อกำหนดเฉพาะและไม่ได้ระบุอินพุตสูงสุดนี่เป็นเรื่องสำคัญเนื่องจากแพลตฟอร์มส่วนใหญ่ใช้การmath.random()ใช้งานที่มีสถานะภายในจึงไม่สามารถสร้างผลลัพธ์ที่ไม่ซ้ำกันได้
Ferrybig

4

Pyth - 9 ไบต์

แสดงรายการบรรทัด

.tm+*;OlQ

 .t                       Transpose, padding with spaces
  m      (Q implicit)     Map over input
   +    (d implicit)      Concatenate to loop var
    *                     String repeat
     ;                    This refers to the var replaced by loop var, which is d=" "
     O                    Random number less than
      lQ                  Length of input

ลองมันออนไลน์


4

J , 30 19 ไบต์

|:@,.]{.~"+_2-#?@##

ลองออนไลน์!


1
0|:]{.~"+_1-#?#for 15 bytes
Galen Ivanov

@ GalenIvanov ฉันรักความคิดนี้ แต่เนื่องจากข้อตกลง dyad ใช้โดยไม่มีการซ้ำซ้อนช่วงของเอาต์พุตจะไม่ครอบคลุมความเป็นไปได้ทั้งหมด เช่นเป็นไปไม่ได้ที่ตัวอักษร 2 ตัวจะลดระดับความสูงเดียวกัน
โยนาห์

@Conor คุณสามารถทำได้0|:]{.~"+_2-#?@##17 ไบต์โดยไม่เปลี่ยนพฤติกรรมของคำตอบ
โยนาห์

1
@Jonah ใช่ถูกต้อง ฉันรู้เรื่องนั้นและมีวิธีแก้ปัญหาอีก 17 ไบต์
Galen Ivanov

4

Japtet , 8 ไบต์

-1 ไบต์จาก @Shaggy

y_iUÊö ç

y_iUÊö ç        Full Program. Implicit input U
y_              transpose and map each row in U (Call it X)
  i             Insert at the beginning of X:
       ç        " " repeated ↓ many times
   UÊö          random integer in [0, length of U] 
                implicit transpose back and output

ลองออนไลน์!



lol @Shaggy ฉันได้รับคำตอบเดียวกันเมื่อไม่นานมานี้ฉันแค่เพิ่มคำอธิบาย ขอบคุณ c:
Luis felipe De jesus Munoz

3

APL (Dyalog Unicode) , 16 ไบต์SBCS

ฟังก์ชันนำหน้าเงียบโดยไม่ระบุชื่อ

⍉∘↑⊢↑¨⍨∘-∘?≢⍴1+≢

 ความยาวของสตริง

1+ หนึ่งเพิ่มไปที่

≢⍴ สำเนา "ความยาว" ของสิ่งนั้น

∘? จำนวนเต็มแบบสุ่มในช่วง 1 …เหล่านั้นแล้ว…

∘- ปฏิเสธแล้ว ...

⊢↑¨⍨ ใช้เวลามากกว่าองค์ประกอบหลายตัวจากแต่ละตัว padding ด้านซ้ายด้วยช่องว่าง

∘↑ รายการผสมของสตริงลงในเมทริกซ์, การเติมด้วยช่องว่างทางด้านขวา

 transpose

ลองออนไลน์!



2

เยลลี่ 10 ไบต์

³LŻX⁶x;)z⁶

ลองออนไลน์!

      )    | For each input character
³L         | Length of original input
  Ż        | 0..length
   X       | Random number from that list
    ⁶x     | That number of spaces
       ;   | Concatenate to the character
        z⁶ | Finally transpose with space as filler

เราสามารถส่งออกเป็นเส้นชั้นนำของพื้นที่ดังนั้น9 ไบต์ (แม้ว่าฉันรู้สึกเหมือนมีอาจจะเป็น 8 ... )
โจนาธานอัลลัน

@Janathan ทุกอย่างนั้นจะไม่เทียบเท่ากับช่วง0..(length - 1)? คำถามระบุระหว่าง 0 และความยาวสตริง หรือว่าฉันขาดอะไรไป?
Nick Kennedy

โอ้ใช่ฉันลืมเกี่ยวกับการรวม - เมื่อฉันถามสามวันที่ผ่านมาเกี่ยวกับช่องว่างชั้นนำฉันค่อนข้างแน่ใจว่าฉันมี 9 และฉันคิดว่ามันไม่ใช่สิ่งที่ฉันแนะนำข้างต้น ... อืม
Jonathan Allan


2

PHP , 88 ไบต์

for($o='';$i<$l=strlen($argn);$o[$i+$l*rand(0,$l)]=$argn[$i++]);echo chunk_split($o,$l);

ลองออนไลน์!

หรือ94 ไบต์โดยใช้ฟังก์ชันจำนวนเต็มแบบสุ่มของการเข้ารหัสของ PHP

for($o='';$i<$l=strlen($argn);$o[$i+$l*random_int(0,$l)]=$argn[$i++]);echo chunk_split($o,$l);

ลองออนไลน์!

ข้อมูลจากการส่งออกไปยังSTDIN STDOUTทำงานเป็น:

$ echo Hello World|php -nF rain.php
   l  W    
  l        

 e      r d

H      o   

         l 


    o 

-1 ไบต์ (สตริงว่างแทนที่จะเว้นวรรค) และ +1 ไบต์ (ข้อผิดพลาดที่ด้านข้างของกฎ) ขอบคุณไปที่ @ ASCII เท่านั้น!


สงสัยว่าสิ่งนี้ได้รับอนุญาตหรือไม่เนื่องจากคุณไม่ได้รวม<?phpการ?>ปิดดังกล่าว ดูเหมือนว่ามันจะไม่เป็นไรถ้า$oเป็นสตริงว่าง
ASCII- เท่านั้น

@ ASCII เท่านั้นคุณพูดถูกสตริงที่ว่างเปล่าจะใช้งานได้ (ด้วยบ่นอีกเล็กน้อย) ฉันไม่แน่ใจว่าคำวินิจฉัยเกี่ยวกับการใช้แท็กปิดและเปิดแท็กใหม่ฉันจะอัปเดตแม้ว่าจะอยู่ต่อไปเรื่อย ๆ ขอบคุณ!
640KB

โปรดทราบว่ากฎสำหรับความท้าทายนี้บอกว่า "ผลลัพธ์ที่เป็นไปได้ทั้งหมดจะต้องมีความน่าจะเป็นที่ไม่เกิดขึ้นอีกครั้ง" ซึ่งเป็นไปไม่ได้กับrandฟังก์ชั่นPHP เนื่องจากคุณสามารถใส่ข้อความที่ต้องการสุ่มมากกว่าขนาดภายใน seed rand ใช้ดังนั้นคำตอบของคุณล้มเหลวในการตอบสนองเงื่อนไขนี้ในทุกสถานการณ์
Ferrybig

@Ferrybig ฉันยอมรับว่ามรดก PHP / libc randนั้นไม่ได้มีประโยชน์อะไรมากมาย แต่รุ่นที่รองรับ / การผลิตทั้งหมดของ PHP (7.1+) ใช้ Mersenne Twister RND ( mt_rand) ภายในเพื่อสร้างหมายเลขสุ่ม คุณเป็นกังวลหรือไม่ว่านี่ไม่ได้สุ่มอย่างเพียงพอสำหรับความท้าทายนี้
640KB

mt_randยังใช้ระบบตัวเลขสุ่มหลอกภายในและยังมีข้อ จำกัด สมมติว่า PHP ถูกคอมไพล์ด้วยตัวเลข 64 บิต (และเมล็ดที่ใช้สำหรับrandหรือmt_randยอมรับช่วงเต็มรูปแบบนี้) จะสร้างผลลัพธ์ที่ไม่ซ้ำกันสำหรับคำที่ยาวไม่เกิน 13 ตัวอักษร
ค่อนข้าง

1

ถ่าน , 10 9 ไบต์

↑Eθ◧ι⊕‽Lθ

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด แก้ไข: บันทึก 1 ไบต์ต้องขอบคุณ @ ASCII-only คำอธิบาย:

  θ         Input string
 E          Map over characters
        θ   Input string
       L    Length
      ‽     Random value
     ⊕      Incremented
    ι       Current character
   ◧        Padded to length
↑           Print rotated

ตามที่มีเฉพาะ ASCII เท่านั้นคุณสามารถเลื่อนตัวอักษรแบบสุ่มขึ้นมาแทนลงเพื่อให้ได้เอฟเฟกต์เดียวกัน (ยกเว้นว่าอาจมีช่องว่างสีขาวพิเศษที่ด้านล่างมากกว่าด้านบน) การพิมพ์อาเรย์ของตัวละครขึ้นไปนั้นเทียบเท่ากับการพิมพ์สตริงตามปกติดังนั้นการแพ็ดดิ้งก็แค่ออฟเซ็ตอักขระแต่ละตัวในแนวตั้งด้วยจำนวนสุ่ม


สงสัยว่าการพิมพ์ขึ้นแทนที่จะทำงานได้หรือไม่
ASCII เท่านั้นเท่านั้น

1

05AB1E (ดั้งเดิม) 9 ไบต์

εIgÝΩú}ζ»

อินพุตเป็นสตริงหรือรายการอักขระ (ใช้ได้ทั้งคู่)

ลองออนไลน์

ทางเลือกที่ช้าลงมาก 9 ไบต์:

gDÝsãΩúζ»

อินพุตเป็นรายการของอักขระ

ลองออนไลน์

ทั้งสองใช้รุ่นเก่าของ 05AB1E เนื่องจากเวอร์ชันใหม่ต้องมีความชัดเจน€Sก่อนζ..

คำอธิบาย:

ε       # Map each character in the (implicit) input to:
 Ig     #  Take the length of the input
   Ý    #  Create a list in the range [0, input-length]
    Ω   #  Pop and push a random integer from this list
     ú  #  Pad the current character with that many leading spaces
      # After the map: zip/transpose; swapping rows/columns (with space as default filler)
  »     # Then join all strings by newlines (and it output implicitly as result)

g          # Get the length of the (implicit) input-list
 D         # Duplicate this length
  Ý        # Create a list in the range [0, input-length]
   sã      # Take the cartesian product of this list that many times
     Ω     # Pop and push a random list from this list of lists of integers
      ú    # Pad the characters in the (implicit) input-list with that many spaces
       ζ   # Zip/transpose; swapping rows/columns (with space as default filler)
        »  # Then join all strings by newlines (and it output implicitly as result)

กำลังคิดอยู่ตลอดเวลาgD¸s∍ÝδΩแต่มันก็นานกว่า ... และ ooo ... มันไม่ได้ทำงานใน 05AB1E ใหม่;)
Magic Octopus Urn


1

Julia, 69 ไบต์

f(s)=(n=length(s);z=fill(' ',n,n);for i=1:n z[rand(1:n),i]=s[i]end;z)

นี้กำหนดฟังก์ชั่นfที่ยอมรับStringหรือและผลตอบแทนVector{Char}Matrix{Char}

Ungolfed:

function f(s)
    n = length(s)
    z = fill(' ', n, n)  # an n×n matrix of spaces
    for i = 1:n
        # set a random entry in the ith column to the ith character in s
        z[rand(1:n),i] = s[i] 
    end
    z
end

ตัวอย่าง:

julia> f("test")
4×4 Array{Char,2}:
 't'  ' '  ' '  ' '
 ' '  ' '  ' '  ' '
 ' '  'e'  ' '  't'
 ' '  ' '  's'  ' '

สิ่งนี้จะดีขึ้นอย่างแน่นอน ทักษะการเล่นกอล์ฟของฉันค่อนข้างสนิม

ลองออนไลน์!



1

PowerShell , 108 102 98 ไบต์

-4 ไบต์ขอบคุณที่ทำให้เฉื่อยชา

$a=1..($z=($y=$args|% t*y).count)|%{random $z}
1..$z|%{-join($y|%{" $_"[$a[$i++%$z]-eq+$r]});$r++}

ลองออนไลน์!

โดยทั่วไปจะวนซ้ำ1..lengthของสตริงสองครั้งหนึ่งครั้งเพื่อรับตำแหน่งบรรทัดสุ่มสำหรับอักขระแต่ละตัวและครั้งที่สองเพื่อสร้างแต่ละบรรทัดโดยใช้ดัชนีเหล่านั้น การหาวิธีการทำในการกวาดครั้งเดียวคือการประหยัดไบต์ขนาดใหญ่





0

Python - 92 ไบต์

import random
lambda s:map(None,*[(random.randrange(len(s))*' '+c).ljust(len(s))for c in s])

คุณต้องรวมimport random
MilkyWay90

@ MilkyWay90 d'oh
Maltysen

1
คุณสามารถบันทึก 1 ไบต์โดยใช้from random import*แทน
orthoplex

ฉันคิดว่าmap(None,...ใช้งานไม่ได้ใน Python 3 ดังนั้นคุณควรระบุ Python 2 ในชื่อของคุณ
orthoplex

0

K (oK) , 20 ไบต์

วิธีการแก้:

+c$(-1-c?c:#x)$++x:

ลองออนไลน์!

คำอธิบาย:

+c$(-1-c?c:#x)$++x: / the solution
                 x: / store input as x
                +   / flip (enlist)
               +    / flip again (break into chars)
              $     / pad (each) character
   (         )      / do this together
           #x       / length of x
         c:         / save as c
      -c?           / choose (?) c times from c
    -1              / subtract from -1
 c$                 / pad to length of x
+                   / flip


0

Python 3, 208 ไบต์

import random as r;x=input();R=range(len(x));c=[r.choice(R) for i in R];y=[' '*c[i]+x[i]+' '*(len(x)-c[i]) for i in R];R=range(len(y));print('\n'.join([''.join(r) for r in [[y[i][j] for i in R] for j in R]]))

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

ลองออนไลน์!

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