Sheffle tho vawols ureund!


42

给定的输入串,输出该字符串与所有元音aeiou在随机彼此之间交换。

例如,在字符串中this is a test,有4个元音:[i, i, a, e]。这些元音的有效改组可能会[a, i, e, i]产生输出thas is e tist

关于改组

如果我们认为相等的元音是不同的,则所有改组的可能性均相等。对于上面的示例,这24种混洗是可能的:

[i 1,i 2,a,e] [i 1,i 2,e,a] [i 1,a,i 2,e] [i 1,a,e,i 2 ]
[i 1,e,i 2,a] [i 1,e,a,i 2 ] [i 2,i 1,a,e] [i 2,i 1,e,a]
[i 2,a,i 1,e] [i 2,a,e,i 1 ] [i 2,e,i 1,a] [i 2,e,a,i 1 ]
[a,i 1,i 2,e] [a,i 1,e,i 2 ] [a,i 2,i 1,e] [a,i 2,e,i 1 ]
[a,e,i 1,i 2 ] [a,e,i 2,i 1 ] [e,i 1,i 2,a] [e,i 1,a,i 2 ]
[e,i 2,i 1,a] [e,i 2,a,i 1 ] [e,a,i 1,i 2 ] [e,a,i 2,i 1 ]

每个人的可能性均应相同。

除非找到所有元音都位于正确位置的字符串,否则您不能尝试对整个字符串进行随机混洗。简而言之,如果输入为常数,则代码的运行时间应为常数。

输入和输出

  • 您可以假定输入中的所有字母均为小写或大写。您可能还支持混合大小写,但这不会给您带来任何好处。

  • 输入将始终由可打印的ASCII字符组成。输入中的所有字符都应在输出中,只有元音必须在周围乱洗,其他都不能。

  • 输入可以为空。无法保证输入将包含至少一个元音或至少一个非元音。

  • 您可以将来自的输入STDIN作为函数参数或类似的参数。

  • 您可以将输出打印到STDOUT,从函数返回它或类似的东西。

测试用例

第一行是给定的输入。第二行是可能的输出之一。

<empty string>
<empty string>

a
a

cwm
cwm

the quick brown fox jumps over the lazy dog.
tho qeuck brewn fax jumps ovir the lozy dog.

abcdefghijklmnopqrstuvwxyz
abcdefghujklmnipqrstovwxyz

programming puzzles & code golf
pregromming pezzlos & coda gulf

fatalize
fitaleza

martin ender
mirten ander

计分

这是,可能会使您不胜枚举


17
您是y
英裔

6
@KevinCruijssen我不是母语人士,我也考虑y作为元音,但是我说的最后一个挑战y是元音,我被问到为什么选择了它!
致命

7
@KevinCruijssen,字母不是元音:声音是。
彼得·泰勒

6
+1表示CWM。保持登山和/或威尔士健在;)
Beta Decay

2
@KevinCruijssen没有一个共同W¯¯约VO W¯¯未通常被认为那么ELS。
corsiKa

Answers:


13

果冻,15 字节

f€“¡ẎṢɱ»ðœpżFẊ¥

在线尝试!

这个怎么运作

f€“¡ẎṢɱ»ðœpżFẊ¥  Main link. Argument: s (string)

  “¡ẎṢɱ»         Yield "aeuoi"; concatenate "a" with the dictionary word "euoi".
f€               Filter each character in s by presence in "aeuoi".
                 This yields A, an array of singleton and empty strings.
        ð        Begin a new, dyadic chain. Left argument: A. Right argument: s
         œp      Partition s at truthy values (singleton strings of vowels) in A.
            FẊ¥  Flatten and shuffle A. This yields a permutation of the vowels.
           ż     Zip the partition of consonants with the shuffled vowels.

与其他答案相比,为什么这看起来很慢?
致命

果冻首先导入SymPy和NumPy。该程序和空程序的执行时间大致相同。
丹尼斯

15
在任何人问到之前,euoi都是古代巴克奇革命中热情洋溢的欢呼
丹尼斯

5
@Dennis出于好奇,为什么Jelly内置词典词?这些字典单词从哪里得到?
凯文·克鲁伊森

1
@KevinCruijssen当我设计Jelly时,已经有一些高尔夫语言使用shoco,简单地使用英文字典似乎是改善这个想法的好方法。我使用了/usr/share/dict/words计算机中的文件,并将其包含在Jelly解释器中。
丹尼斯

17

R,92 91

无法发表评论,因此我添加了自己的答案,尽管与@AndreïKostyrka答案非常相似(信不信由你,但独立提出)。

s=strsplit(readline(),"")[[1]];v=s%in%c("a","e","i","o","u");s[v]=sample(s[v]);cat(s,sep="")

不打高尔夫球

s=strsplit(readline(),"")[[1]]    # Read input and store as a vector
v=s%in%c("a","e","i","o","u")     # Return TRUE/FALSE vector if vowel
s[v]=sample(s[v])                 # Replace vector if TRUE with a random permutation of vowels
cat(s,sep="")                     # Print concatenated vector

@Vlo节省了一个字节

s=strsplit(readline(),"")[[1]];s[v]=sample(s[v<-s%in%c("a","e","i","o","u")]);cat(s,sep="")

5
老实说,我不敢相信。开玩笑。保存一些字节的好技巧!
安德烈·科斯蒂卡(AndreïKostyrka)

坦白说,我不会偷你的想法来进一步探讨我的答案。
安德烈·科斯蒂卡

3
呵呵,得给他们甜蜜的赞誉,让我可以发表评论;)
Billywob '16

使用串联分配保存一个字节91个字节s=strsplit(readline(),"")[[1]];s[v]=sample(s[v<-s%in%c("a","e","i","o","u")]);cat(s,sep="")
Vlo

使用el()而不是保存另一个字节[[1]]
安德烈KOSTYRKA

11

R,99 98 89字节

x=el(strsplit(readline(),""))
z=grepl("[aeiou]",x)
x[z]=x[sample(which(z))]
cat(x,sep="")

似乎是第一个人类可读的解决方案!感谢Giuseppe节省了9个字节!

测试用例:

tho qaeck bruwn fux jemps over tho lozy dig.
progremmang pozzlos & cide gulf

似乎没有办法进行内部变量赋值(在内部,例如cat),并且有些人再次证明我错了……


2
letters[c(1,5,9,15,21)]长度增加了1个字节,OEIS A161536和A215721似乎也没有帮助。
安德烈·科斯蒂卡(AndreïKostyrka)

不会z=grepl("[aeiou]",x)更短吗?
朱塞佩

@Giuseppe您又做了一次!谢谢。
安德烈KOSTYRKA

10

CJam,23个字节

lee_{"aeiou"&},_mrerWf=

在线尝试!

说明

l            e# Read input, e.g. "foobar".
ee           e# Enumerate, e.g. [[0 'f] [1 'o] [2 'o] [3 'b] [4 'a] [5 'r]].
_            e# Duplicate.
{"aeiou"&},  e# Keep those which have a non-empty intersection with this string
             e# of vowels, i.e. those where the enumerated character is a vowel.
             e# E.g. [[1 'o] [2 'o] [4 'a]].
_            e# Duplicate.
mr           e# Shuffle the copy. E.g. [[2 'o] [4 'a] [1 'o]].
er           e# Transliteration. Replaces elements from the sorted copy with
             e# the corresponding element in the shuffled copy in the original list.
             e# [[0 'f] [2 'o] [4 'a] [3 'b] [1 'o] [5 'r]].
Wf=          e# Get the last element of each pair, e.g. "foabor".

5

05AB1E,17个字节

žMÃ.r`¹vžMyå_iy}?

说明

žMÃ                # get all vowels from input
   .r`             # randomize them and place on stack
      ¹v           # for each in input
        žMyå_i }   # if it is not a vowel
              y    # push it on stack
                ?  # print top of stack

在线尝试!


5

Python 3,109个字节

仅支持小写元音。

感谢@Alissa节省了一个额外的字节。

import re,random
def f(s):r='[aeiou]';a=re.findall(r,s);random.shuffle(a);return re.sub(r,lambda m:a.pop(),s)

伊迪恩!


如果它是一个接受字符串并用随机的元音返回该字符串的函数,它会更短吗?
艾丽莎

@Alissa谢谢,它节省了一个字节!:D
Beta Decay's

不知道它是否会更短,但是您可以a.pop(random.randrange(0,len(a)))改组
Alissa

4

TSQL,275个字节

打高尔夫球:

DECLARE @ VARCHAR(99)='the quick brown fox jumps over the lazy dog.'

;WITH c as(SELECT LEFT(@,0)x,0i UNION ALL SELECT LEFT(substring(@,i+1,1),1),i+1FROM c
WHERE i<LEN(@)),d as(SELECT *,rank()over(order by newid())a,row_number()over(order by 1/0)b
FROM c WHERE x IN('a','e','i','o','u'))SELECT @=STUFF(@,d.i,1,e.x)FROM d,d e
WHERE d.a=e.b PRINT @

取消高尔夫:

DECLARE @ VARCHAR(max)='the quick brown fox jumps over the lazy dog.'

;WITH c as
(
  SELECT LEFT(@,0)x,0i
  UNION ALL
  SELECT LEFT(substring(@,i+1,1),1),i+1
  FROM c
  WHERE i<LEN(@)
),d as
(
  SELECT 
    *,
    rank()over(order by newid())a,
    row_number()over(order by 1/0)b
  FROM c
  WHERE x IN('a','e','i','o','u')
)
SELECT @=STUFF(@,d.i,1,e.x)FROM d,d e
WHERE d.a=e.b
-- next row will be necessary in order to handle texts longer than 99 bytes
-- not included in the golfed version, also using varchar(max) instead of varchar(99)
OPTION(MAXRECURSION 0) 

PRINT @

小提琴


3

Perl,38个字节

包括+1的 -p

在STDIN上运行该句子

vawols.pl <<< "programming puzzles & code golf"

vawols.pl

#!/usr/bin/perl -p
@Q=/[aeiou]/g;s//splice@Q,rand@Q,1/eg

3

Java 7中,243个 241字节

import java.util.*;String c(char[]z){List l=new ArrayList();char i,c;for(i=0;i<z.length;i++)if("aeiou".indexOf(c=z[i])>=0){l.add(c);z[i]=0;}Collections.shuffle(l);String r="";for(i=0;i<z.length;i++)r+=z[i]<1?(char)l.remove(0):z[i];return r;}

是的,这大概可以解决很多问题,但是Java对此afaik没有任何方便的内置组件。此外,我还忘了Collections.shuffle.. 的代码golf数组变量。

非高尔夫球和测试用例:

在这里尝试。

import java.util.*;
class M{
  static String c(char[] z){
    List l = new ArrayList();
    char i,
         c;
    for(i = 0; i < z.length; i++){
      if("aeiou".indexOf(c = z[i]) >= 0){
        l.add(c);
        z[i] = 0;
      }
    }
    Collections.shuffle(l);
    String r = "";
    for(i = 0; i < z.length; i++){
      r += z[i] < 1
               ? (char)l.remove(0)
               : z[i];
    }
    return r;
  }

  public static void main(String[] a){
    System.out.println(c("".toCharArray()));
    System.out.println(c("a".toCharArray()));
    System.out.println(c("cwm".toCharArray()));
    System.out.println(c("the quick brown fox jumps over the lazy dog.".toCharArray()));
    System.out.println(c("abcdefghijklmnopqrstuvwxyz".toCharArray()));
    System.out.println(c("programming puzzles & code golf".toCharArray()));
    System.out.println(c("fatalize".toCharArray()));
    System.out.println(c("martin ender".toCharArray()));
  }
}

可能的输出:

a
cwm
tha queck brown fox jumps evor tho lezy dig.
ebcdifghujklmnopqrstavwxyz
prigrommeng puzzlos & cade golf
fatelazi
mertan inder

1
如何i在第二个循环中重用?
Frozn '16

我以为“为什么他不使用char []而不是List”,所以我开始了,但是由于缺乏Arrays.shuffle阻止我就在那里了
OlivierGrégoire16年

剃光了6个字符并做了一些小调整:import java.util.*;String c(char[]z){List l=new ArrayList();int i=0,j=z.length;for(;i<j;i++)if("aeiou".indexOf(z[i])>=0){l.add(z[i]);z[i]=0;}Collections.shuffle(l);String r="";for(i=0;i<j;i++)r+=z[i]<1?(char)l.remove(0):z[i];return r;}
durron597'9

3

Perl 6、65字节

{my \v=m:g/<[aeiou]>/;my @a=.comb;@a[v».from]=v.pick(*);@a.join}

匿名函数。假定为小写输入。

在线尝试


3

Ruby 45 + 1 = 46字节

+1个字节的-p标志

a=$_.scan(e=/[aeiou]/).shuffle
gsub(e){a.pop}

3

Brachylog,39个字节

@eI:1aToS,I:2f@~:LcS,Tc
.'~e@V;
e.~e@V,

在线尝试!

说明

  • 主要谓词:

    @eI        I is the list of chars of the input.
    :1aT       T is I where all vowels are replaced with free variables.
    oS,        S is T sorted (all free variables come first).
    I:2f       Find all vowels in I.
    @~         Shuffle them.
    :LcS,      This shuffle concatenated with L (whatever it may be) results in S.
                 This will unify the free variables in S with the shuffled vowels.
    Tc         Output is the concatenation of elements of T.
    
  • 谓词1:

    .          Input = Output…
    '~e@V      …provided that it is not a vowel.
    ;          Otherwise Output is a free variable.
    
  • 谓词2:

    e.         Output is an element of the input…
    ~e@V,      … and it is a vowel.
    

3

Javascript(ES6),78 76字节

s=>s.replace(r=/[aeiou]/g,_=>l.pop(),l=s.match(r).sort(_=>Math.random()-.5))

多亏了ps弹手,节省了2个字节

ps弹手提议的替代版本(同样为76字节)

s=>s.replace(r=/[aeiou]/g,[].pop.bind(s.match(r).sort(_=>Math.random()-.5)))

测试

let f =
s=>s.replace(r=/[aeiou]/g,_=>l.pop(),l=s.match(r).sort(_=>Math.random()-.5))

console.log(f("the quick brown fox jumps over the lazy dog."))


1
我发现不是一个改进(分数完全相同),而是一个有趣的丑陋化:l=...完全删除并使用bound函数[].pop.bind(s.match(r).sort(_=>Math.random()-.5)))作为replace(而不是箭头函数)的第二个参数。也许在这方面可以找到改进,但是我还没有发现。如果您使用具有绑定运算符的JS-超集语言::,我认为您可以做到(s.match(r).sort(_=>Math.random()-.5)))::pop
apsillers

3

MATL,15字节

tt11Y2m)tnZr7M(

在线尝试!

说明

tt      % Take input string implicitly. Duplicate twice
11Y2    % Predefined string: 'aeiou'
m       % Logical index that contains true for chars of the input that are vowels
)       % Get those chars from the input string. Gives a substring formed by the
        % vowels in their input order
tnZr    % Random permutation of that substring. This is done via random sampling
        % of that many elements without replacement
7M      % Push logical index of vowel positions again
(       % Assign the shuffled vowels into the input string. Display implicitly

3

Japt v2.0a0,14 13个字节

ō²f\v
NÌr\v@o

试试吧


说明

           :Implicit input of string U.
ö²         :Generate a random permutation of U.
  f\v      :Get all the vowels as an array.
\n         :Assign that array to U.
NÌ         :Get the last element in the array of inputs (i.e., the original value of U)
  r\v      :Replace each vowel.
     @o    :Pop the last element from the array assigned to U above.

2

Pyth,26个字节

J"[aeiou]"s.i:QJ3.Sf}TPtJQ

该程序接受带引号的字符串的输入并输出经过改组的字符串。

在线尝试

这个怎么运作

J"[aeiou]"s.i:QJ3.Sf}TPtJQ  Program. Input: Q
J"[aeiou]"                  J="[aeiou]"
             :QJ3           Split Q on matches of regex J, removing vowels
                      PtJ   J[1:-1], yielding "aeiou"
                   f}T   Q  Filter Q on presence in above, yielding vowels
                 .S         Randomly shuffle vowels
           .i               Interleave non-vowel and vowel parts
          s                 Concatenate and implicitly print

2

PHP,144个 129字节

使用小写输入

$r=Aaeiou;$v=str_shuffle(preg_replace("#[^$r]+#",'',$a=$argv[1]));for(;$i<strlen($a);)echo strpos($r,$a[$i++])?$v[$j++]:$a[$i-1];

说明:

$r="aeiou"; // set vowels

preg_replace("#[^$r]+#",'',$argv[1]) // find all vowels in input

$v=str_shuffle() // shuffle them

for(;$i<strlen($a);) // run through the text

strpos($r,$a[$i++])?$v[$j++]:$a[$i-1]; // if it's a vowel print the j-th shuffled vowel else print original text

2

其实是24个位元组

;"aeiou";╗@s@`╜íu`░╚@♀+Σ

在线尝试!

说明:

;"aeiou";╗@s@`╜íu`░╚@♀+Σ
;                         dupe input
 "aeiou";╗                push vowels, store a copy in reg0
          @s              split one copy of input on vowels
            @`╜íu`░       take characters from other copy of input where
              ╜íu           the character is a vowel (1-based index of character in vowel string is non-zero)
                   ╚      shuffle the vowels
                    @♀+   interleave and concatenate pairs of strings
                       Σ  concatenate the strings

2

Bash,75个字节

paste -d '' <(tr aeoiu \\n<<<$1) <(grep -o \[aeiou]<<<$1|shuf)|paste -sd ''

将字符串作为参数并将结果输出到stdout。

例如

for x in "" "a" "cwm" \
         "the quick brown fox jumps over the lazy dog." \
         "abcdefghijklmnopqrstuvwxyz" \
         "programming puzzles & code golf" \
         "fatalize" "martin ender"; do
  echo "$x";. sheffle.sh "$x"; echo
done

版画

<blank line>
<blank line>

a
a

cwm
cwm

the quick brown fox jumps over the lazy dog.
tho quuck brown fix jamps ever the lozy dog.

abcdefghijklmnopqrstuvwxyz
ibcdefghajklmnopqrstuvwxyz

programming puzzles & code golf
progremmong pazzlus & cedo gilf

fatalize
fetilaza

martin ender
mertan endir

2

巴什89

假定所有输入均为小写。

a=`tee z|grep -o [aeiou]`
[ -n "$a" ]&&tr `tr -d \ <<<$a` `shuf -e $a|tr -d '
'`<z||cat z

2

PowerShell v3 +,155 99字节

param([char[]]$n)$a=$n|?{$_-match'[aeiou]'}|sort{random};-join($n|%{if($_-in$a){$a[$i++]}else{$_}})

@ 本·欧文Ben Owen)的56字节高尔夫大道具

接受input $n,并期望所有小写字母立即将其转换为char-array。

我们将其Where-Object传递到子句中以拉出-match元音的那些元素,并将Sort-Object{Get-Random}作为排序机制传递给它们。Get-Random不带限定符的调用将返回介于0[int32]::MaxValue- 之间的整数,即为运行中的每个元素分配随机权重。我们将随机的元音存储到中$a

最后,我们遍历$n。对于每个元素,|%{...}如果当前字符在某处-in $a,我们将输出中的下一个元素$a,以$i供以后递增。否则,我们输出当前字符。这些全部封装在括号中,并-join一起编入字符串。该字符串留在管道上,并且在程序结束时隐式输出。

测试用例

PS C:\Tools\Scripts\golfing> 'a','cwm','the quick brown fox jumps over the lazy dog.','abcdefghijklmnopqrstuvwxyz','programming puzzles & code golf','fatalize','martin ender'|%{.\vawols.ps1 $_}
a
cwm
thu qaeck brown fix jomps ovor thu lezy deg.
abcdofghejklmnupqrstivwxyz
prugrammong pizzles & code golf
fitaleza
mertin endar

您可以在此处通过遍历$n字符并在每个元音上进行匹配以输出char-元音数组来节省大量字节。像这样的东西:$a=[char[]]$n|?{$_-match'[aeiou]'}|sort{random}
Ben Owen

@BenOwen神圣的党,是的。感谢您的56字节高尔夫。为了我的一生,我无法找到一种更好的建构方法$a
AdmBorkBork

2

Python 3,106个字节

仅小写。

import re,random
def f(s):s=re.split('([aeiou])',s);v=s[1::2];random.shuffle(v);s[1::2]=v;return''.join(s)

1

PHP> = 5.3139个 136字节(并且没有错误抛出)

array_map(function($a,$b){echo$a.$b;},preg_split("/[aeiou]/",$s=$argv[1]),str_split(str_shuffle(implode(preg_split("/[^aeiou]/",$s)))));

1

K(oK),29个字节

解:

{x[a:&x in"aeiou"]:x@(-#a)?a}

在线尝试!

例子:

"pregrommeng pizzlas & codo gulf"
{x[a:&x in"aeiou"]:x@(-#a)?a}"programming puzzles & code golf"
"pregremmong puzzlos & coda gilf"
{x[a:&x in"aeiou"]:x@(-#a)?a}"programming puzzles & code golf"
"pregrommeng pazzlos & cidu golf"

说明:

查找元音的位置,并替换为以随机顺序绘制的元音。

{x[a:&x in"aeiou"]:x@(-#a)?a} / the solution
{                           } / anonymous function with input x
 x[              ]            / index into x at these indices
      x in"aeiou"             / is character a vowel
     &                        / indices where true
   a:                         / assign to add
                  :           / assign
                          ?a  / draw randomly from a
                     (   )    / do this together
                       #a     / count length of a
                      -       / negate (draws from list, no duplication)
                   x@         / apply these indices to input


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.