Làm cho nó mưa nhân vật


31

Lấy cảm hứng từ này mini-thách thức chat.

Đưa ra một chuỗi làm đầu vào (chỉ các ký tự có thể in ASCII), xuất chuỗi đó với các chữ cái "mưa" xuống. Mỗi chữ cái phải là một số dòng ngẫu nhiên đi xuống (ngẫu nhiên giữa 0và độ dài của chuỗi, mỗi dòng có xác suất khác không) và chỉ có một ký tự trên mỗi cột. Tất cả các đầu ra có thể một lần nữa phải có xác suất xảy ra khác không.

Điều đó có thể hơi khó hiểu, vì vậy đây là một ví dụ (lấy từ CMC đó):

Hello World

          d
H
       o
  llo

         l
      W
 e
        r

Lưu ý cách Hmột khoảng trống xuống, dkhông xuống và llotất cả xảy ra để xếp hàng. Cái rxa nhất xuống, tại 9, nhưng vẫn nhỏ hơn độ dài chuỗi cách xa đỉnh. Đây chỉ là một ví dụ, có hàng tá khả năng khác cho đầu vào Hello World.

Các ví dụ khác có thể là:

test

t
 e
  s
   t


PP&CG

  & G
 P

P  C

  • Đầu vào và đầu ra có thể được đưa ra bởi bất kỳ phương pháp thuận tiện .
  • Đầu vào được đảm bảo không trống (nghĩa là bạn sẽ không bao giờ nhận ""làm đầu vào).
  • Bạn có thể in nó sang STDOUT hoặc trả lại dưới dạng kết quả chức năng.
  • Một chương trình đầy đủ hoặc một chức năng được chấp nhận.
  • Bất kỳ số lượng khoảng trắng bên ngoài nào cũng được chấp nhận, miễn là các ký tự xếp hàng một cách thích hợp (ví dụ: hãy thoải mái để đệm như một hình chữ nhật).
  • Sơ hở tiêu chuẩn bị cấm.
  • Đây là vì vậy tất cả các quy tắc chơi gôn thông thường đều được áp dụng và mã ngắn nhất (tính bằng byte) sẽ thắng.

2
Nghĩ rằng điều này sẽ liên quan đến hoạt hình khi tôi đọc tiêu đề. Chúng ta đã có một phiên bản hoạt hình của điều này?
Xù xì

@Shaggy Không phải là tôi đã thấy hoặc có thể tìm thấy.
admBorkBork

"Bất kỳ số lượng khoảng trắng ngoại lai nào đều được chấp nhận" - có bao gồm một dòng khoảng trắng hàng đầu không?
Jonathan Allan

Tôi biết chúng tôi đã có một cái dựa trên mã Matrix, nhưng chúc may mắn tìm thấy nó với 2 từ khóa đó! Bạn có phiền nếu tôi Sandbox ý tưởng?
Shaggy

Các câu trả lời kích thước đầu vào tối đa cần phải thực hiện là gì? Tôi thấy nhiều người sử dụng các hàm ngẫu nhiên sử dụng "giả ngẫu nhiên" trong phần phụ trợ và một số từ đầu vào lớn hơn kích thước của hạt giống được sử dụng trong các trình tạo đó và họ sẽ thất bại "Tất cả các đầu ra có thể lại phải có một xác suất xảy ra khác không. " ràng buộc mà bạn đã chỉ định
Ferrybig

Câu trả lời:


5

R , 104 byte

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

Hãy thử trực tuyến!

Nhập dưới dạng chuỗi; viết lên thiết bị xuất chuẩn.


Bạn có thể tiết kiệm một byte bằng cách sử dụng scan(,'')và lồng một loạt các cuộc gọi nhưng thực sự tôi rất thích cách tiếp cận chức năng, cái này khác là ghê gớm để đạt được tối thiểu. Có thể châm ngòi cho một số ý tưởng, mặc dù. Hãy thử trực tuyến!
CriminallyVulgar

Tôi nghĩ là sample(l,,T)đủ thay vì sample(l,l,T)(-1 byte).
Robin Ryder

4

JavaScript (ES6), 72 byte

Đưa đầu vào dưới dạng danh sách các ký tự. Trả về một ma trận các ký tự.

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

Hãy thử trực tuyến!


Tôi nghĩ rằng bạn có thể lưu một byte bằng cách không phủ định biểu thức ternary.
orthoplex

2
@orthoplex Điều đó sẽ không hoạt động vì (0|'A') === (0|undefined)và các chữ cái còn lại sẽ không được đảm bảo nữa xuất hiện ở hàng cuối cùng. (Vì vậy, về cơ bản, nó giống như |!a[y+1]đã bị loại bỏ hoàn toàn.)
Arnauld

Google nói rằng Math.random()trả về một số trong [0, 1), vì vậy không thể Math.random()<.5trở thành Math.random()>0?
nedla2004

@ nedla2004 Về lý thuyết, vâng. Trong thực tế, tôi nghĩ rằng rất có thể việc triển khai PRNG không thể trả về chính xác (hãy để gần đủ 0 để tất cả các cấu hình thực sự có cơ hội xảy ra). Bởi vì chúng tôi xác định một ngôn ngữ bằng cách triển khai ngôn ngữ, cá nhân tôi nghĩ rằng nó không hợp lệ. 0 0
Arnauld

Bạn đã tạo javascript để làm nền tảng gì? Do thử thách có yêu cầu duy nhất và không chỉ định đầu vào tối đa, nên điều này thực sự quan trọng, vì hầu hết các nền tảng đang sử dụng một math.random()triển khai có trạng thái bên trong và do đó không thể tạo đầu ra duy nhất.
Ferrybig

4

Pyth - 9 byte

Danh sách đầu ra của dòng.

.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

Hãy thử trực tuyến .


4

J , 30 19 byte

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

Hãy thử trực tuyến!


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

@GalenIvanov Tôi thích ý tưởng này nhưng vì thỏa thuận dyad không có sự lặp lại, nên phạm vi đầu ra sẽ không bao gồm đầy đủ các khả năng. ví dụ, sẽ không thể có 2 chữ cái được thả ngẫu nhiên xuống cùng một độ cao.
Giô-na

@Conor, Bạn có thể làm 0|:]{.~"+_2-#?@##trong 17 byte mà không thay đổi hành vi trả lời của bạn.
Giô-na

1
@Jonah Vâng, đúng rồi. Tôi nhận ra điều đó và có một giải pháp 17 byte khác.
Galen Ivanov

4

Japt , 8 byte

-1 byte từ @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

Hãy thử trực tuyến!



lol @Shaggy Tôi đã có cùng một câu trả lời trước đây, tôi chỉ thêm một lời giải thích. Dù sao cũng cảm ơn c:
Luis felipe De jesus Munoz

3

APL (Dyalog Unicode) , 16 byte SBCS

Chức năng tiền tố ẩn danh

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

 độ dài của chuỗi

1+ thêm vào đó

≢⍴ "chiều dài" bản sao đó

∘? số nguyên ngẫu nhiên trong phạm vi 1 số đó, và sau đó

∘- phủ nhận, và sau đó

⊢↑¨⍨ lấy nhiều yếu tố từ mỗi nhân vật, đệm bên trái bằng khoảng trắng

∘↑ trộn danh sách các chuỗi thành ma trận, đệm với khoảng trắng ở bên phải

 hoán vị

Hãy thử trực tuyến!


2

Japt , 8 byte

yÈùUÊö Ä

Thử nó

yÈùUÊö Ä     :Implicit input of string U
y            :Transpose
 È           :Pass each column through the following function and transpose back
  ù          :  Left pad with spaces to length
   UÊ        :    Length of U
     ö       :    Random number in the range [0,UÊ)
       Ä     :    Plus 1

2

Thạch , 10 byte

³LŻX⁶x;)z⁶

Hãy thử trực tuyến!

      )    | 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

Chúng ta có thể xuất ra một dòng không gian hàng đầu, vì vậy 9 byte (mặc dù tôi cảm thấy như có thể có 8 ...)
Jonathan Allan

@Jonathan ALLan sẽ không tương đương với phạm vi 0..(length - 1)? Câu hỏi chỉ định từ 0 đến độ dài chuỗi. Hay tôi đang thiếu một cái gì đó?
Nick Kennedy

Ồ vâng, tôi đã quên mất tính toàn diện - khi tôi hỏi ba ngày trước về khoảng trắng hàng đầu Tôi khá chắc chắn rằng tôi có số 9, và tôi nghĩ đó không phải là những gì tôi đã đề xuất ở trên ... hmm
Jonathan Allan


2

PHP , 88 byte

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

Hãy thử trực tuyến!

Hoặc 94 byte sử dụng hàm số nguyên ngẫu nhiên mật mã của PHP .

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

Hãy thử trực tuyến!

Đầu vào từ STDIN, đầu ra đến STDOUT. Chạy như:

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

 e      r d

H      o   

         l 


    o 

-1 byte (chuỗi trống thay vì khoảng trắng) và +1 byte (lỗi bên cạnh quy tắc) chỉ đến @ ASCII!


tự hỏi nếu điều này được cho phép, vì bạn không bao gồm <?phpviệc ?>đóng cửa. cũng có vẻ như nó ổn nếu $olà chuỗi trống
ASCII

@ Chỉ ASCII, bạn đúng, chuỗi trống cũng sẽ hoạt động (với một chút phàn nàn). Tôi không chắc rằng phán quyết về việc sử dụng các thẻ đóng và mở lại, tôi sẽ cập nhật nó để tiếp tục phát triển. Cám ơn!
640KB

Lưu ý rằng các quy tắc cho thử thách này cho biết "Tất cả các kết quả đầu ra có thể lại phải có xác suất xảy ra khác không", điều này là không thể đối với randhàm PHP , vì bạn có thể có một văn bản đầu vào yêu cầu ngẫu nhiên hơn kích thước của nội bộ seed rand sử dụng, vì vậy về mặt kỹ thuật, câu trả lời của bạn không thỏa mãn điều kiện này trong mọi tình huống
Ferrybig

@Ferrybig Tôi đồng ý rằng PHP / libc kế thừa randkhông hữu ích cho nhiều, tuy nhiên tất cả các phiên bản được hỗ trợ / sản xuất của PHP (7.1+) đều sử dụng Mersenne Twister RND ( mt_rand) trong một thế hệ số ngẫu nhiên. Có phải mối quan tâm của bạn là điều này không đủ ngẫu nhiên cho thử thách này?
640KB

mt_randcũng sử dụng một hệ thống số ngẫu nhiên giả trong nội bộ, và cũng có những hạn chế. Giả sử rằng PHP được biên dịch với các số 64 bit (và hạt giống, được sử dụng cho randhoặc mt_randchấp nhận phạm vi đầy đủ này) sẽ tạo ra các kết quả đầu ra duy nhất cho các từ có độ dài 13 ký tự hoặc ngắn hơn. Khá hạn chế nếu bạn hỏi tôi
Ferrybig

1

Than , 10 9 byte

↑Eθ◧ι⊕‽Lθ

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Chỉnh sửa: Đã lưu 1 byte nhờ chỉ @ ASCII. Giải trình:

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

Vì chỉ ASCII chỉ ra, bạn có thể di chuyển các chữ cái ngẫu nhiên lên thay vì xuống để có cùng hiệu ứng (ngoại trừ việc có thể có thêm khoảng trắng ở phía dưới thay vì trên cùng). In một mảng các ký tự lên trên tương đương với in một chuỗi thông thường, do đó, phần đệm sau đó chỉ bù đắp cho mỗi ký tự theo chiều dọc một lượng ngẫu nhiên.


Tự hỏi nếu in lên thay thế sẽ làm việc?
ASCII - chỉ

1

05AB1E (di sản) , 9 byte

εIgÝΩú}ζ»

Nhập dưới dạng chuỗi hoặc danh sách các ký tự (hoặc là tốt).

Hãy thử trực tuyến.

Thay thế 9 byte chậm hơn nhiều:

gDÝsãΩúζ»

Nhập dưới dạng danh sách các ký tự.

Hãy thử trực tuyến.

Cả hai đều sử dụng phiên bản kế thừa của 05AB1E, vì phiên bản mới yêu cầu rõ ràng €Strước ζ..

Giải trình:

ε       # 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)

Đã suy nghĩ theo dòng gD¸s∍ÝδΩnhưng nó dài hơn ... và ooo ... điều này thậm chí không hoạt động trong 05AB1E mới;).
Bạch tuộc ma thuật Urn


1

Julia, 69 byte

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

Điều này xác định một hàm fchấp nhận một Stringhoặc Vector{Char}và trả về a Matrix{Char}.

Ung dung:

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

Thí dụ:

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

Điều này chắc chắn có thể tốt hơn; kỹ năng chơi gôn của tôi khá gỉ.

Hãy thử trực tuyến!



1

PowerShell , 108 102 98 byte

-4 byte nhờ mazzy

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

Hãy thử trực tuyến!

Về cơ bản lặp lại 1..lengthchuỗi hai lần, một lần để có được vị trí dòng ngẫu nhiên cho mỗi ký tự và lần thứ hai để thực sự xây dựng mỗi dòng bằng cách sử dụng các chỉ số đó. Tìm hiểu làm thế nào để thực hiện nó trong một lần quét là nơi tiết kiệm byte lớn.



0

SmileBASIC 3, 62 byte

LINPUT T$L=LEN(T$)CLS
FOR I=0TO L-1LOCATE,RND(L+1)?T$[I];
NEXT


0

Python - 92 byte

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

Bạn phải bao gồmimport random
MilkyWay90

@ MilkyWay90 d'oh
Maltysen

1
Bạn có thể tiết kiệm 1 byte bằng cách sử dụng from random import*thay thế.
orthoplex

Tôi nghĩ rằng map(None,...không hoạt động trong Python 3, vì vậy bạn nên chỉ định Python 2 trong tiêu đề của bạn.
orthoplex

0

K (oK) , 20 byte

Dung dịch:

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

Hãy thử trực tuyến!

Giải trình:

+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 bytes

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]]))

Creates a list of random choices, then makes a list of columns with blank space everywhere except at the index specified by each random choice. The columns are transposed into rows and printed out with newlines between them.

Try it online!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.