下雨了


31

灵感来自这个聊天迷你挑战。

给定一个字符串作为输入(仅ASCII可打印字符),输出带有“ raining”字母的字符串。每个字母必须是向下随机排列的行(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

“可接受任何数量的外部空白”-是否包括空白的前线?
乔纳森·艾伦

我知道我们有一个基于Matrix代码的应用程序,但是很幸运能通过这两个关键字找到它!你介意我把这个想法沙盒化吗?
毛茸茸的

答案需要实现的最大输入大小是多少?我看到许多人使用在后台使用“伪随机”的随机函数,并且某些输入字的大小大于这些生成器中使用的种子的大小,并且它们将失败“所有可能的输出必须再次具有非零的发生概率。” 您指定的约束条件
Ferrybig

Answers:


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

在线尝试!

输入为字符串;写入标准输出。


您可以通过使用scan(,'')和嵌套一堆调用来节省一个字节,但是老实说,我非常喜欢函数方法,而另一种方法对于获得最小的收益来说是可怕的。可能会激发一些想法。在线尝试!
刑事

我认为sample(l,,T)足以代替sample(l,l,T)(-1字节)。
罗宾·赖德

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

@ nedla2004从理论上讲,是的。实际上,我认为PRNG的实现很有可能无法完全返回(更不用说足够接近0了,这样所有配置实际上都有机会出现)。因为我们通过实现定义语言,所以我个人认为它是无效的。0 0
Arnauld

您在什么平台上使用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

J30 19字节

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

在线尝试!


1
0|:]{.~"+_1-#?#15个字节
盖伦诺夫

@GalenIvanov我喜欢这个主意,但是由于二元交易没有重复,因此输出范围不会涵盖所有可能性。例如,两个字母不可能随机下降到相同的高度。
约拿

@Conor,您可以做0|:]{.~"+_2-#?@##17个字节而无需更改答案的行为。
约拿(Jonah)

1
@约拿是的,对。我意识到了这一点,并有了另一个17字节的解决方案。
Galen Ivanov

4

Japt,8字节

@Shaggy的-1个字节

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

在线尝试!



大声笑@Shaggy我前一段时间也得到了相同的答案,我只是添加了一个解释。无论如何,谢谢c:
路易斯·

3

APL(Dyalog Unicode),16 字节SBCS

匿名默认前缀功能

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

 字符串长度

1+ 一个添加到那个

≢⍴ 那个的“长度”副本

∘? 范围为1…那些的随机整数,然后…

∘- 取反,然后…

⊢↑¨⍨ 从每个字符中获取多个元素,并在左侧填充空格

∘↑ 将字符串列表混合到矩阵中,右侧填充空格

 转置

在线尝试!


2

Japt,8字节

yÈùUÊö Ä

试试吧

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

果冻,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个...)
Jonathan Allan

@JonathanAllan不会等于范围0..(length - 1)吗?该问题指定0到字符串长度之间。还是我错过了什么?
尼克·肯尼迪

哦,是的,我忘了包容性-三天前我问到领先的空白时,我很确定自己有9,并且我认为那不是我上面建议的...嗯
乔纳森·艾伦


2

PHP,88字节

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

在线尝试!

或使用PHP的加密随机整数函数获取94个字节

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的

@@@@@@@@@@@@@@@@@@@@@@@挺C 我不确定使用关闭标签和重新打开标签的规则,尽管会不断更新,但我会对其进行更新。谢谢!
640KB

请注意,此挑战的规则为“所有可能的输出必须再次具有非零的发生概率”,这对于PHP rand函数是不可能的,因为您输入的文本可能需要比内部文本大得多的随机性使用兰特种子,因此从技术上讲,您的回答在任何情况下都无法满足此条件
Ferrybig

@Ferrybig我同意旧版PHP / libc rand并没有多大用处,但是所有受支持/生产版本的PHP(7.1+ mt_rand)在内部使用Mersenne Twister RND()来生成随机数。您是否担心此挑战不够随机?
640KB

mt_rand在内部也使用伪随机数系统,也有局限性。假设PHP使用64位数字进行编译(并且该种子用于randmt_rand接受此完整范围)将为长度不超过13个字符的单词生成唯一的输出。如果您问我
非常

1

木炭10 9字节

↑Eθ◧ι⊕‽Lθ

在线尝试!链接是详细版本的代码。编辑:由于仅@ASCII,节省了1个字节。说明:

  θ         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∍ÝδΩ但是时间更长……而且……这在新的05AB1E中甚至不起作用;)。
魔术章鱼缸

1

C(gcc),131字节

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;}

在线尝试!


建议R[j=i%l]?32:s[j]));而不是R[j]?32:s[j]))j=i%l;
ceilingcat

1

朱莉娅,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}

取消高尔夫:

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字节感谢mazzy

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

在线尝试!

基本上1..length,字符串重复两次,一次是为每个字符获取随机行位置,第二次是使用这些索引实际构建每行。一口搞清楚如何做到这一点是节省大量字节的地方。



0

SmileBASIC 3,62个字节

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


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
您可以from random import*改用节省1个字节。
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]]))

创建一个随机选择的列表,然后创建一个列的列表,这些列的每个地方都有空白,除了每个随机选择指定的索引处。列被转换为行,并在它们之间以换行符打印出来。

在线尝试!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.