Karakterleri yağmur yağdır


31

Esinlenen bu sohbet mini meydan.

Giriş olarak bir dize verildiğinde (yalnızca ASCII yazdırılabilir karakterleri), dizgiyi "yağmur" harfleri aşağıya gelecek şekilde yazdırın. Her harf aşağıya doğru rasgele bir satır sayısı ( 0her biri sıfır olmayan bir olasılık olan dizginin uzunluğu ile uzunluğu arasında rastgele ) ve sütun başına yalnızca bir karakter olmalıdır. Tüm olası çıkışlar tekrar sıfır olmayan bir oluşma olasılığına sahip olmalıdır.

Bu belki biraz kafa karıştırıcı, bu yüzden burada bir örnek (o CMC'den alınmış):

Hello World

          d
H
       o
  llo

         l
      W
 e
        r

Nasıl Not Hbir boşluk aşağı, dsıfır aşağı olduğunu ve llotüm sıraya olur. En ruzağında, en altında 9, ama yine de üstten uzaktaki dize uzunluğundan daha az. Bu sadece bir örnek, giriş için onlarca başka olasılık var Hello World.

Diğer örnekler olabilir:

test

t
 e
  s
   t


PP&CG

  & G
 P

P  C

  • Giriş ve çıkış herhangi bir uygun yöntemle verilebilir .
  • Girişin boş olmadığı garantilidir (yani, ""giriş olarak asla almayacaksınız ).
  • STDOUT'a yazdırabilir veya işlev sonucu olarak geri döndürebilirsiniz.
  • Tam bir program veya bir işlev kabul edilebilir.
  • Karakterler uygun bir şekilde hizalandığı sürece herhangi bir fazladan beyaz boşluk kabul edilebilir (örneğin, bir dikdörtgen gibi kaydırmaktan çekinmeyin).
  • Standart boşluklar yasaktır.
  • Bu olduğundan, tüm normal golf kuralları geçerlidir ve en kısa kod (bayt cinsinden) kazanır.

2
Başlığı okuduğumda bunun animasyon içereceğini düşündüm. Bunun animasyonlu bir versiyonuna sahip miyiz?
Shaggy

@Shaggy Gördüğüm ya da bulamadığım.
AdmBorkBork

"Herhangi bir miktardaki beyaz boşluk kabul edilebilir" - buna lider bir boşluk alanı da dahil mi?
Jonathan Allan

Bir tane Matrix koduna dayandığımızı biliyorum, ancak bu 2 anahtar kelimeyle bulmanızda iyi şanslar! Fikrimi Sandbox yapmamın sakıncası var mı?
Shaggy

Uygulamanız gereken maksimum girdi boyutu yanıtı nedir? Birçok insanın arka uçta "sözde rasgele" kullanan rasgele işlevler kullandığını ve bazı girdi kelimelerinin bu jeneratörlerde kullanılan tohumun boyutundan daha büyük olduğunu görüyorum ve başarısız olacaklardır. sıfır olmayan oluşum olasılığı. " belirttiğiniz kısıtlama
Ferrybig

Yanıtlar:


5

R , 104 bayt

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

Çevrimiçi deneyin!

Dize olarak giriş; stdout'a yazar.


scan(,'')Bir grup aramayı kullanarak ve iç içe geçirerek bir bayt kaydedebilirsiniz, ancak dürüst olmak gerekirse, işlev yaklaşımını büyük ölçüde tercih ederim, diğeri asgari kazanç için iğrenç. Yine de bazı fikirlere yol açabilir. Çevrimiçi deneyin!
CriminallyVulgar

Bence (-1 bayt) sample(l,,T)yeterli sample(l,l,T).
Robin Ryder

4

JavaScript (ES6), 72 bayt

Girdiyi karakter listesi olarak alır. Bir karakter matrisi döndürür.

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

Çevrimiçi deneyin!


Üçlü ifadeyi ihmal etmeyerek bir bayt kurtarabilirsin.
orthoplex

2
@orthoplex Bu işe yaramaz çünkü (0|'A') === (0|undefined)kalan harflerin son sırada görünmesi artık garanti edilemez. (Yani, temel olarak, |!a[y+1]tamamen kaldırıldı gibi .)
Arnauld

Google söylüyor Math.random()döner [0, 1 bir sayı), bu yüzden olamazdı Math.random()<.5haline Math.random()>0?
nedla2004

@ nedla2004 Teoride, evet. Uygulamada, PRNG'nin uygulanmasının / uygulamalarının tam olarak olamayacağını düşünüyorum ( yeterince bile olsa 0 'a yakın olsak bile tüm yapılandırmaların gerçekleşme şansı var). Bir dili uygulaması ile tanımladığımız için şahsen bunun geçersiz olduğunu düşünüyorum. 0 0
Arnauld,

Javascript'i hangi platform için yaptınız? Mücadelenin benzersiz bir gereksinimi olduğu ve maksimum bir girdi belirtmediği için, bu gerçekten önemlidir, çünkü çoğu platform math.random()dahili bir duruma sahip bir uygulama kullanıyor ve bu nedenle benzersiz bir çıktı üretemiyor.
Ferrybig

4

Pyth - 9 bayt

Satır listesini çıkarır.

.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

Çevrimiçi deneyin .


4

J , 30 19 bayt

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

Çevrimiçi deneyin!


1
0|:]{.~"+_1-#?#için 15 bayt
Galen Ivanov

@ GalenIvanov Bu fikri çok seviyorum, ancak dyad anlaşması tekrarlamadan gerçekleştiğinden, çıktı aralığı tüm olasılıkları kapsamaz. örneğin, 2 harfin rastgele aynı yüksekliğe bırakılması mümkün olmayacaktır.
Jonah

@Conor, 0|:]{.~"+_2-#?@##Cevabınızın davranışını değiştirmeden 17 bayt için yapabilirsiniz .
Jonah

1
@Jonah Evet, doğru. Bunu farkettim ve 17 baytlık bir çözüm daha aldım.
Galen Ivanov


3

APL (Dyalog Unicode) , 16 bayt SBCS

Anonim tacit önek işlevi

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

 dize uzunluğu

1+ buna bir tane eklendi

≢⍴ "uzunluk" kopyaları

∘? aralık 1'deki rasgele tamsayılar… bunlar ve sonra…

∘- olumsuzlayın ve sonra…

⊢↑¨⍨ Her karakterden bir çok eleman al, solda boşluk bırakarak boşluk bırak

∘↑ dizelerin listesini matriste karıştırın, sağdaki boşluklarla doldurun

 devrik

Çevrimiçi deneyin!


2

Japt , 8 bayt

yÈùUÊö Ä

Dene

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

Jöle , 10 bayt

³LŻX⁶x;)z⁶

Çevrimiçi deneyin!

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

Önde gelen bir boşluk satırı çıkarabiliriz, yani 9 bayt (8 olabilirmiş gibi hissetmeme rağmen ...)
Jonathan Allan

@JonathanAllan bu aralığa denk olmaz mıydı 0..(length - 1)? Soru, 0 ile dize uzunluğunu belirtir. Yoksa bir şey mi kaçırıyorum?
Nick Kennedy,

Ben oldukça emin bir 9 vardı ediyorum boşluk lider yaklaşık üç gün önce sorulduğunda ve bunu hmm ... yukarıda önerilen şey değildi düşünüyorum - Oh evet, kapsayıcı-lık unuttu
Jonathan Allan


2

PHP , 88 bayt

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

Çevrimiçi deneyin!

Veya PHP'nin şifreli rasgele tamsayılar işlevini kullanarak 94 bayt .

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

Çevrimiçi deneyin!

Girişinden STDINçıkışa STDOUT. Olarak çalıştırmak:

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

 e      r d

H      o   

         l 


    o 

-1 bayt (boşluk yerine boş dize) ve +1 bayt (kuralların yanında err) thx - @ ASCII-only!


Eğer içermez çünkü bu takdirde harikası izin <?phpolduğunu ?>kapanır. Ayrıca $oboş dize olup olmadığını iyi gibi görünüyor
ASCII-sadece

@ Sadece ASCII, haklısın, boş dize de işe yarayacak (biraz daha şikayet ile). Kapatma ve yeniden açma etiketlerini kullanma kararını tam olarak bilmiyorum, sürekli olarak yükselmeme rağmen güncelleyeceğim. Teşekkürler!
640KB

Bu zorluğun kurallarının "Mümkün olan tüm çıktıların tekrar sıfır olasılığına sahip olması gerekmediğini" söylediğine dikkat edin, bu, PHP'nin randboyutunda olandan daha rasgele gerektiren bir giriş metnine sahip olabileceğiniz için mümkün değildir. seed rand kullanır, bu yüzden teknik olarak cevabınız her durumda bu durumu yerine getirmekte başarısız oluyor
Ferrybig

@Ferrybig Eski PHP / libc'nin randpek işe yaramayacağını kabul ediyorum , ancak PHP'nin (7.1+) tüm desteklenen / üretim sürümleri mt_randiçsel olarak rasgele sayı üretimi için Mersenne Twister RND ( ) kullanıyor . Endişeniz, bu zorluk için bunun yeterince rastgele olmaması mı?
640KB

mt_randayrıca dahili olarak sahte rasgele sayı sistemi kullanır ve sınırlamaları da vardır. PHP'nin 64 bit sayılarla derlendiğini (ve bu tam aralık için kullanılan randya da mt_randkabul edilen tohumun ) 13 karakter uzunluğuna ya da daha kısa kelimeler için benzersiz çıktılar üreteceğini varsayarsak . Bana sorarsan çok kısıtlayıcı
Ferrybig

1

Kömür , 10 9 bayt

↑Eθ◧ι⊕‽Lθ

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Düzenleme: sadece @ ASCII-sayesinde 1 bayt kaydedildi. Açıklama:

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

Yalnızca ASCII'nin işaret ettiği gibi, aynı etki için harfleri aşağıya değil, rasgele yukarı taşıyabilirsiniz (yalnızca üstte değil altta fazladan beyaz boşluk olması dışında). Bir karakter dizisini yukarı doğru yazdırmak, normal olarak bir dize yazdırmaya eşdeğerdir, bu nedenle dolgu maddesi her karakteri rastgele bir miktarda dikey olarak kaydırır.


basmak yerine işe yarar mı acaba?
ASCII-sadece

1

05AB1E (eski) , 9 bayt

εIgÝΩú}ζ»

Bir dize veya karakter listesi olarak girin (her ikisi de iyidir).

Çevrimiçi deneyin.

Çok daha yavaş 9 bayt alternatif:

gDÝsãΩúζ»

Bir karakter listesi olarak giriş yapın.

Çevrimiçi deneyin.

Her ikisi de 05AB1E'nin eski sürümünü kullanıyor, çünkü yeni sürüm daha €Sönce açık bir ifade gerektiriyor ζ.

Açıklama:

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

Çizgileri boyunca düşünüyordum gD¸s∍ÝδΩama daha uzun ... ve ooo ... bu yeni 05AB1E'de bile çalışmıyor;).
Magic Octopus Urn


1

Julia, 69 bayt

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

Bu, fa'yı kabul eden Stringveya Vector{Char}a döndüren bir fonksiyonu tanımlar 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

Örnek:

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

Bu kesinlikle daha iyi olabilirdi; golf becerilerim oldukça paslı.

Çevrimiçi deneyin!



1

PowerShell , 108 102 98 bayt

Mazzy sayesinde -4 bayt

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

Çevrimiçi deneyin!

Temel olarak 1..length, her karakter için rasgele satır konumları elde etmek için dizgeyi iki kez yineler ve bu satırları kullanarak her satırı gerçekten oluşturmak için ikinci kez. Bir taramada nasıl yapılacağını bulmak, büyük bayt tasarruflarının olduğu yerdir.



0

SmileBASIC 3, 62 bayt

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


0

Python - 92 bayt

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

import random
Dahil

@ MilkyWay90 d'oh
Maltysen

1
Bunun from random import*yerine 1 byte tasarruf edebilirsiniz .
orthoplex

map(None,...Python 3'te çalışmadığını düşünüyorum , bu yüzden başlığında Python 2'yi belirtmelisin.
orthoplex

0

K (oK) , 20 bayt

Çözüm:

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

Çevrimiçi deneyin!

Açıklama:

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

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

Rastgele seçeneklerin bir listesini oluşturur, ardından her rastgele seçim tarafından belirtilen endeks dışında her yerde boş alan içeren bir sütun listesi yapar. Sütunlar satırlara çevrilir ve aralarında yeni satırlarla yazdırılır.

Çevrimiçi deneyin!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.