Buat karakter hujan

31

Terinspirasi oleh ini chatting mini-tantangan.

Diberikan string sebagai input (hanya karakter ASCII yang dapat dicetak), output string dengan huruf "hujan" ke bawah. Setiap huruf harus berupa jumlah acak baris ke bawah (acak antara 0dan panjang string, masing-masing memiliki probabilitas nol), dan hanya satu karakter per kolom. Semua output yang mungkin harus kembali memiliki probabilitas yang tidak nol terjadi.

Itu mungkin sedikit membingungkan, jadi inilah contohnya (diambil dari CMC itu):

Hello World

          d
H
       o
  llo

         l
      W
 e
        r

Perhatikan bagaimana Hsatu spasi di bawah, dnol di bawah, dan llosemuanya terjadi untuk berbaris. Ini radalah yang terjauh ke bawah, pada 9, tetapi masih kurang dari panjang tali dari atas. Ini hanya satu contoh, ada puluhan kemungkinan input lainnya Hello World.

Contoh lain dapat berupa:

test

t
 e
  s
   t


PP&CG

  & G
 P

P  C

  • Input dan output dapat diberikan dengan metode apa pun yang mudah .
  • Input dijamin non-kosong (yaitu, Anda tidak akan pernah menerima ""sebagai input).
  • Anda dapat mencetaknya ke STDOUT atau mengembalikannya sebagai hasil fungsi.
  • Program lengkap atau fungsi dapat diterima.
  • Berapapun ruang kosong ekstranus dapat diterima, asalkan karakternya berbaris dengan benar (mis., Merasa bebas untuk mengisi sebagai persegi panjang).
  • Celah standar dilarang.
  • Ini adalah sehingga semua aturan golf biasa berlaku, dan kode terpendek (dalam byte) menang.
AdmBorkBork
sumber
2
Kupikir ini akan melibatkan animasi ketika aku membaca judulnya. Sudahkah kita memiliki versi animasi ini?
Shaggy
@ Shaggy Bukannya aku pernah melihat atau bisa menemukan.
AdmBorkBork
"Apa pun jumlah ruang putih asing dapat diterima" - apakah itu termasuk garis ruang putih terkemuka?
Jonathan Allan
Saya tahu kami telah memilikinya berdasarkan kode Matrix, tetapi semoga berhasil menemukannya dengan 2 kata kunci itu! Apakah Anda keberatan jika saya menerbangkan ide itu?
Shaggy
Apa jawaban ukuran input maksimum yang perlu diterapkan? Saya melihat banyak orang menggunakan fungsi acak yang menggunakan "pseudo-acak" di latar belakang, dan kata-kata input tertentu lebih besar dari ukuran seed yang digunakan dalam generator tersebut, dan mereka akan gagal "Semua kemungkinan output harus lagi memiliki probabilitas tidak nol terjadi. " kendala yang telah Anda tentukan
Ferrybig

Jawaban:

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,,"")}

Cobalah online!

Input sebagai string; menulis ke stdout.

Giuseppe
sumber
Anda dapat menyimpan byte dengan menggunakan scan(,'')dan menumpuk banyak panggilan tapi jujur ​​saya lebih suka pendekatan fungsi, yang satu ini mengerikan untuk keuntungan minimal. Mungkin akan memunculkan beberapa ide. Cobalah online!
CriminallyVulgar
Saya pikir sample(l,,T)sudah cukup alih-alih sample(l,l,T)(-1 byte).
Robin Ryder
4

JavaScript (ES6), 72 byte

Mengambil input sebagai daftar karakter. Mengembalikan matriks karakter.

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

Cobalah online!

Arnauld
sumber
Saya pikir Anda bisa menghemat satu byte dengan tidak meniadakan ekspresi ternary.
orthoplex
2
@orthoplex Itu tidak akan berhasil karena (0|'A') === (0|undefined)dan surat-surat yang tersisa tidak akan dijamin lagi muncul di baris terakhir. (Jadi, pada dasarnya, ini seperti |!a[y+1]dihapus sama sekali.)
Arnauld
Google mengatakan bahwa Math.random()mengembalikan angka dalam [0, 1), jadi tidak bisa Math.random()<.5menjadi Math.random()>0?
nedla2004
@ nedla2004 Secara teori, ya. Dalam praktiknya, saya pikir sangat mungkin bahwa implementasi PRNG tidak mungkin mengembalikan tepat (apalagi cukup dekat 0 sehingga semua konfigurasi benar-benar memiliki kesempatan untuk terjadi). Karena kami mendefinisikan bahasa dengan penerapannya, saya pribadi pikir itu tidak valid. 0 0
Arnauld
Untuk platform apa Anda membuat javascript? Karena tantangan memiliki persyaratan keunikan, dan tidak menentukan input maksimal, ini sangat penting, karena sebagian besar platform menggunakan math.random()implementasi yang memiliki keadaan internal, dan dengan demikian tidak dapat menghasilkan output yang unik.
Ferrybig
4

Pyth - 9 byte

Output daftar garis.

.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

Cobalah online .

Maltysen
sumber
4

J , 30 19 byte

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

Cobalah online!

Conor O'Brien
sumber
1
0|:]{.~"+_1-#?#untuk 15 byte
Galen Ivanov
@ GalenIvanov Saya suka ide ini, tetapi karena kesepakatan angka dua tanpa pengulangan, berbagai output tidak akan menjangkau berbagai kemungkinan. misalnya, tidak mungkin untuk 2 huruf jatuh secara acak ke ketinggian yang sama.
Jonah
@Coror, Anda dapat melakukannya 0|:]{.~"+_2-#?@##selama 17 byte tanpa mengubah perilaku jawaban Anda.
Jonah
1
@ Yunus Ya, benar. Saya menyadari itu dan memiliki solusi 17-byte.
Galen Ivanov
4

Japt , 8 byte

-1 byte dari @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

Cobalah online!

Luis felipe De jesus Munoz
sumber
1
8 byte
Shaggy
lol @ Shaggy Saya mendapat jawaban yang sama beberapa waktu lalu, saya baru saja menambahkan penjelasan. Bagaimanapun, terima kasih c:
Luis felipe De jesus Munoz
3

APL (Dyalog Unicode) , 16 byte SBCS

Fungsi awalan diam-diam anonim

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

 panjang tali

1+ satu ditambahkan ke itu

≢⍴ "panjang" salinan itu

∘? bilangan bulat acak di kisaran 1 ... itu, dan kemudian ...

∘- negasikan, lalu ...

⊢↑¨⍨ ambil dari banyak elemen dari masing-masing karakter, padding di sebelah kiri dengan spasi

∘↑ campur daftar string ke dalam matriks, padding dengan spasi di sebelah kanan

 mengubah urutan

Cobalah online!

Adm
sumber
2

Japt , 8 byte

yÈùUÊö Ä

Cobalah

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
Shaggy
sumber
2

Jelly , 10 byte

³LŻX⁶x;)z⁶

Cobalah online!

      )    | 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
Nick Kennedy
sumber
Kita dapat menampilkan garis spasi terdepan, jadi 9 byte (meskipun saya merasa mungkin ada 8 ...)
Jonathan Allan
@ JonathanAllan bukankah itu setara dengan rentang 0..(length - 1)? Pertanyaan menentukan antara 0 dan panjang string. Atau apakah saya melewatkan sesuatu?
Nick Kennedy
Oh ya, saya lupa tentang inklusifitas - ketika saya bertanya tiga hari lalu tentang memimpin spasi putih, saya cukup yakin saya punya angka 9, dan saya pikir itu bukan yang saya sarankan di atas ... hmm
Jonathan Allan
2

Ruby , 59 57 55 byte

->a{a.map{|c|s=[' ']*z=a.size;s[rand z]=c;s}.transpose}

Cobalah online!

Input 1D, menghasilkan array karakter 2D.

Kirill L.
sumber
2

PHP , 88 byte

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

Cobalah online!

Atau 94 byte menggunakan fungsi integer acak kriptografis PHP .

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

Cobalah online!

Masukan dari STDIN, keluaran ke STDOUT. Jalankan sebagai:

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

 e      r d

H      o   

         l 


    o 

-1 byte (string kosong sebagai ganti spasi) dan +1 byte (err di sisi aturan) thx ke @ ASCII-only!

640KB
sumber
bertanya-tanya apakah ini diperbolehkan, karena Anda tidak termasuk <?phpyang ?>ditutup. juga sepertinya tidak apa-apa jika $ostring kosong
ASCII-saja
@ Hanya ASCII, Anda benar, string kosong juga akan berfungsi (dengan sedikit lebih banyak mengeluh). Saya tidak yakin keputusan untuk menggunakan tag penutupan dan pembukaan kembali, saya akan memperbaruinya untuk tetap naik dan naik. Terima kasih!
640KB
Perhatikan bahwa aturan untuk tantangan ini mengatakan "Semua output yang mungkin harus memiliki probabilitas tidak nol lagi untuk terjadi", ini tidak mungkin dengan randfungsi PHP , karena Anda dapat memiliki teks input yang memerlukan lebih banyak acak daripada ukuran internal. menggunakan seed rand, jadi secara teknis jawaban Anda gagal memenuhi kondisi ini dalam semua situasi
Ferrybig
@ Ferrybig Saya setuju bahwa warisan PHP / libc randtidak berguna banyak, namun semua versi PHP yang didukung / produksi (7.1+) menggunakan Mersenne Twister RND ( mt_rand) secara internal untuk pembuatan angka acak. Apakah kekhawatiran Anda bahwa ini tidak cukup acak untuk tantangan ini?
640KB
mt_randjuga menggunakan sistem bilangan acak semu secara internal, dan juga memiliki keterbatasan. Dengan asumsi bahwa PHP dikompilasi dengan angka 64 bit (dan bahwa seed, digunakan untuk randatau mt_randmenerima rentang penuh ini) akan menghasilkan output unik untuk kata-kata hingga panjang 13 karakter atau lebih pendek. Cukup membatasi jika Anda bertanya kepada saya
Ferrybig
1

Arang , 10 9 byte

↑Eθ◧ι⊕‽Lθ

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Sunting: Disimpan 1 byte berkat hanya @ ASCII. Penjelasan:

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

Seperti yang ditunjukkan oleh ASCII saja, Anda dapat memindahkan huruf secara acak ke atas alih-alih ke bawah untuk efek yang sama (kecuali bahwa mungkin ada ruang putih ekstra di bagian bawah daripada bagian atas). Mencetak array karakter ke atas sama dengan mencetak string secara normal, jadi padding kemudian mengimbangi setiap karakter secara vertikal dengan jumlah acak.

Neil
sumber
bertanya-tanya apakah mencetak malah akan berhasil?
ASCII
1

05AB1E (warisan) , 9 byte

εIgÝΩú}ζ»

Masukan sebagai string atau daftar karakter (baik-baik saja).

Cobalah online.

Alternatif 9-byte yang lebih lambat:

gDÝsãΩúζ»

Masukan sebagai daftar karakter.

Cobalah online.

Keduanya menggunakan versi lawas 05AB1E, karena versi baru memerlukan eksplisit €Ssebelumζ ..

Penjelasan:

ε       # 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)
Kevin Cruijssen
sumber
Sedang berpikir seperti gD¸s∍ÝδΩitu tetapi lebih lama ... dan ooo ... ini bahkan tidak berhasil di 05AB1E baru;).
Guci Gurita Ajaib
1

C (gcc) , 131 byte

f(char*s){int l=strlen(s),R[l],i=l,j;for(srand(time(0));i--;)R[i]=rand()%l;for(;++i<l*l;printf("\n%c"+!!j,i/l^R[j]?32:s[j]))j=i%l;}

Cobalah online!

gastropner
sumber
Sarankan R[j=i%l]?32:s[j]));alih-alihR[j]?32:s[j]))j=i%l;
ceilingcat
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)

Ini mendefinisikan fungsi fyang menerima a Stringdan Vector{Char}dan mengembalikan aMatrix{Char} .

Tidak Disatukan:

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

Contoh:

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

Ini pasti bisa lebih baik; keterampilan golf saya cukup berkarat.

Cobalah online!

Alex A.
sumber
1

Perl 5 -F , 50 49 byte

-1 oleh @DomHastings

map$;[rand@F][$i++]=$_,@F;say map$_||' ',@$_ for@

Cobalah online!

Xcali
sumber
Bagus, sebenarnya bekerja! : P Anda dapat menyimpan beberapa byte map$_||$",@$_juga!
Dom Hastings
1

PowerShell , 108 102 98 byte

-4 byte berkat mazzy

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

Cobalah online!

Pada dasarnya iterasi 1..lengthstring dua kali, sekali untuk mendapatkan lokasi garis acak untuk setiap karakter, dan kedua kalinya untuk benar-benar membangun setiap baris menggunakan indeks tersebut. Mencari tahu bagaimana melakukannya dalam satu sapuan adalah tempat penghematan byte besar.

Veskah
sumber
1
Cobalah online! ?
mazzy
0

SmileBASIC 3, 62 byte

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

Merah , 84 byte

func[s][foreach n random collect[repeat n length? s[keep n]][print pad/left s/:n n]]

Cobalah online!

Galen Ivanov
sumber
0

Python - 92 byte

import random
lambda s:map(None,*[(random.randrange(len(s))*' '+c).ljust(len(s))for c in s])
Maltysen
sumber
Anda harus menyertakanimport random
MilkyWay90
@ MilkyWay90 d'oh
Maltysen
1
Anda dapat menyimpan 1 byte from random import*sebagai gantinya.
orthoplex
Saya pikir map(None,...tidak bekerja di Python 3, jadi Anda harus menentukan Python 2 di judul Anda.
orthoplex
0

K (oK) , 20 byte

Larutan:

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

Cobalah online!

Penjelasan:

+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
streetster
sumber
0

Python 3 , 140 131 byte

from random import*
def f(s):
	e=range(len(s))
	p=[choice(e)for t in s]
	for r in e:print(''.join((r-p[i]and' 'or s[i]for i in e)))

Cobalah online!

movatica
sumber
0

Python 3, 208 byte

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

Membuat daftar pilihan acak, lalu membuat daftar kolom dengan ruang kosong di mana-mana kecuali pada indeks yang ditentukan oleh setiap pilihan acak. Kolom ditransformasikan ke dalam baris dan dicetak dengan baris baru di antara mereka.

Cobalah online!

CyborgOctopus
sumber