Eratosthenes随机播放


9

挑战

编写一个接受一行输入的函数或程序,对其字符执行非常特定且奇怪的随机播放,然后输出结果。

可以使用以下算法描述所需的改组:

  1. 使用基于1的索引标记输入中的每个字符。
  2. 将字符编号1写入输出。
  3. 从字符编号2开始,将每个其他字符依次写入输出中,字符2本身除外。换句话说,将字符4、6、8、10等写为输出。
  4. 从尚未写入输出的下一个字符编号n开始,将第n个字符写入输出中,不包括字符n本身,并排除您可能已经写入输出中的任何其他字符(通过数字标签)。
  5. 只要继续向输出添加新字符,就重复步骤4。
  6. 依次写入其余字符以输出。

  1. 标记字符。
  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
  奥古多亚克的美容院

2.写入第一个字符以输出:

 1   2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
  O   LDDOCYAK'SBEAUTYCORNER
O

3.写入其他所有以2开头的字符,不包括2。

 1   2 3 4   5 6   7 8   9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 
 ö   LD     d ö   Ç     ý    ķ '   小号  éù   Ť ý     Ç   ö ř   Ñ Ë   ř
O OA'EUYCRE

4.下一个尚未写入的字符是字符号3;以3开头的每个第三个字符,但不包括3本身以及已经写入的任何字符,都应写入。

 1   2 3 4   5 6   7 8   9  10 11 12 13 14  15  16 17 18 19 20  21  22 23 24 25 26  27
  ö  LD    dö  Ç ý  ķ'  小号 éù  ŤýÇ  öř  ÑË ř 
OOA 'EUYCREYB R             

5.使用下一个字符(字符5)重复步骤4。

4.下一个尚未写入的字符是字符号5;每5个字符以5开头,但不包括5本身以及已写入的任何字符。(这仅相当于字符25)。

 1   2 3 4   5 6   7 8  9  10 11 12 13 14  15  16 17 18 19 20  21  22 23 24  25  26  27
  O   LD     d ö   Ç ý    ķ '   小号éù   Ť ý Ç   ö ř Ñ Ë ř 
OOA 'EUYCREYB R N               

5.下一个字符是7;但是14、21已经被写入,因此,如果我们重复步骤4,将不再输出任何字符。因此,我们完成了5。

6.依次写出其余字符。

 1   2 3 4   5 6   7 8  9  10 11 12 13 14  15  16 17 18 19 20  21  22 23 24  25  26  27
  ö   LD   d ö   Ç ý   ķ '   小号é ù   Ť ý Ç   ö ř Ñ Ë ř 
OOA 'EUYCREYB RN LDDCKSATO                  

规则

输入和输出可以通过标准输入/标准输出,字符串或字符数组进行。

如果读入作为标准输入,您可以在方便时假设有尾随换行符,或者整个输入都包含该行。换行符不参与改组。

同样,在您方便的时候,您的输出可能带有尾随换行符,也可能没有。

不允许出现标准漏洞。

这是一场代码高尔夫比赛。以字节为单位的最小代码获胜。

测试用例

123456789ABCDEF -> 1468ACE9F2357BD

OLD DOC YAK'S BEAUTY CORNER -> O O A' EUYCREYB RNLDDCKSATO

Blue boxes use a 2600hz tone to convince telephone switches that use in-band signalling that the caller is actually a telephone operator.
->
Bebxsuea20h oet ovnetlpoesice htuei-adsgaln httecle satal  eehn prtre 0ncce ha nng aiuapootnt ihyon atallu o s 6z oi ehwstsnbilt lr clee.

现在,我明白了为什么这是如此奇怪……这是一个主要的筛子……
busukxuan

1
我对您的代码块中的4个感到非常困惑。划掉4仍然是常规的4 ...
Mama Fun Roll'1

@MamaFunRoll是的,但是所有内容都间隔相当大,以显示数字标签。利用这一点,我扩展了三振线。现在4个看起来实际上划掉了……更好吗?
H Walters

1
是的,这在一定程度上是旧的PPCG模因:P不过,谢谢您,感谢您的澄清!
妈妈趣味卷

Answers:


4

果冻,10 字节

JÆfṂ$ÞÆPÞị

在线试用

怎么样?

JÆfṂ$ÞÆPÞị - Main link: theString
J          - range(length), the 1-based indexes of theString
     Þ     - sort these by
    $      -     last two links as a monad
 Æf        -         prime factorization array (e.g. 20 -> [2,2,5])
   Ṃ       -         minimum
        Þ  - sort these by
      ÆP   - isPrime, i.e. move all the primes to the right
         ị - index into theString

5

Mathematica,61个字节

#[[SortBy[Range@Length@#,FactorInteger[#][[1,1]]PrimeQ@#&]]]&

未命名函数,将字符列表作为输入并返回字符列表。

FactorInteger[#][[1,1]]产生最小的质因子#(,1如果#等于,则返回1)。因此FactorInteger[#][[1,1]]PrimeQ@#产生一个奇怪的表达式:[ #的最小素数因子] Falseif #不是素数,而# Trueif #是素数(这些是数字和布尔值的未经评估的乘积)。

Range@Length@#产生一个数字列表,直到输入的长度。然后SortBy通过上述有趣的功能对这些数字进行排序。Mathematica实际上在许多方面都对类型敏感,但是以其他方式愉快地将它们混合在一起:[number] False形式的表达式在按[number]形式的表达式之前按字母顺序排序True,而领带则通过对数字进行数字排序来打断关系。这恰好产生了我们想要的排列,并相应地#[[...]]排列了输入的字符。


2

C,164字节

这将输入作为第一个命令参数,并打印回stdout。在处理每个字符时,我们将其清除,以允许最终通过。

#define p putchar
main(c,s,i,j,t)char**s,*t;{c=strlen(t=s[1]);p(*t);for(;j++<c;)if(t[j])for(i=2*j+1;i<=c;i+=j+1)!t[i]?:p(t[i]),t[i]=0;for(j=0;j++<c;)!*++t?:p(*t);}
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.