Sheffle tho vawols ureund!


42

全ての母音の文字列が入力文字列、出力所与aeio及びu互いの間でランダムに交換されています。

たとえば、文字列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文字で構成されます。入力にあるすべての文字は出力にあり、母音のみをシャッフルする必要があります。

  • 入力は空にすることができます。入力に少なくとも1つの母音または少なくとも1つの非母音が含まれるという保証はありません。

  • からの入力をSTDIN、関数パラメーターなどとして取得できます。

  • 出力をSTDOUTに印刷して、関数から返すか、類似のものを返すことができます。

テストケース

最初の行は、指定された入力です。2行目は、可能な出力の1つです。

<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

得点

これはsa tho shirtist enswer en bytes wonsです。


17
あなたは英語/アメリカの人々であり、y母音としてのあなたの欠如。;)
ケビンCruijssen

6
@KevinCruijssen私は母国語ではありませんyが、母音でもあると思いますが、最後に言っyた母音は母音でした。
16

7
@KevinCruijssen、文字は母音ではありません。音はそうです。
ピーターテイラー

6
cwmの場合は+1。登山および/またはウェールズを生き続ける;)
ベータ崩壊

2
@KevinCruijssen Doが共同を持っていないwは VO程度ワット一般的にそうとはみなされませんELS。
corsiKa

回答:


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.

他の回答と比較して、これがかなり遅いように見えるのはなぜですか?
16

Jellyは何よりも先にSymPyとNumPyをインポートします。このプログラムと空のプログラムの実行時間はほぼ同じです。
デニス

15

5
@Dennis好奇心から、なぜJellyは辞書に載っているのですか?これらの辞書の単語はどこから取得しますか?
ケビンCruijssen

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のおかげで1バイト節約

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

5
正直、信じられません。冗談だ。いくつかのバイトを節約する素敵なトリック!
アンドレイKostyrka

正直に言うと、私はあなたのアイデアを盗んで私の答えをさらにゴルフしているわけではない。
アンドレイKostyrka

3
Hehe、彼らに甘い賛成票をもらわないといけないので、コメントしてください;)
ビリーウォブ

イン・ラインの割り当て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="")

人が読むことができる最初のソリューションのようです!9バイトを節約してくれたGiuseppeに感謝します!

テストケース:

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も役に立たないようです。
アンドレイ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

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ありがとう、1バイト節約しました!:D
ベータ崩壊

短くなるかどうかa.pop(random.randrange(0,len(a)))はわかりませんが、シャッフルする代わりに
アリッサ

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にはこの便利な組み込み機能はありません。また、Collections.shuffle..

未ゴルフ&テストケース:

ここで試してみてください。

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
i2番目のループで再利用してはどうですか?
Frozn

「なぜリストの代わりにchar []を使わなかったのか」と思ったので、始めましたが、そこに足りなかったArrays.shuffleので…
オリビエグレゴワール

いくつかの微調整を加えた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;}
シェービング


3

Ruby 45 + 1 = 46バイト

-pフラグ用の+1バイト

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

apsillersのおかげで2バイト節約

apsillersが提案する代替バージョン(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
改善(正確に同じスコア)ではなく、私が見つけた楽しいuい:l=...完全にドロップし、バインドされた関数[].pop.bind(s.match(r).sort(_=>Math.random()-.5)))replace(矢印関数の代わりに)2番目の引数として使用します。その道のりで改善が見られるかもしれませんが、私はまだ見つけていません。あなたがバインド演算子を持つ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 ''

文字列を引数として受け取り、結果を標準出力に出力します。

例えば

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{$_}})

56バイトのゴルフのための@ Ben Owenへの大きな道具

入力を受け取り$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代わりに母音の-array を出力することで、多くのバイトを節約できます。何かのように:$a=[char[]]$n|?{$_-match'[aeiou]'}|sort{random}
ベン・オーウェン

@BenOwenホーリーダン、はい。56バイトのゴルフをありがとう。私の人生では、構築するより良い方法を見つけることができませんでした$a
AdmBorkBork


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


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.