Sualtı tomurcukları ureund!


42

Tüm ünlülerin ile dize bir giriş dizesi, çıktı önüne alındığında a, e, i, ove uaralarında rastgele takas.

Örneğin, dizede this is a test, 4 ünlüler vardır: [i, i, a, e]. [a, i, e, i]Dolayısıyla , bu ünlülerin geçerli bir karıştırması , çıktıyı verebilir thas is e tist.

Karıştırma hakkında

Eşit sesli harflerin farklı olduğunu düşünürsek , tüm karıştırmalar eşit derecede muhtemel olacaktır . Yukarıdaki örnekte, bu 24 karıştırma mümkündür:

[ 1 , 1 , 2 , a, e] [ 1 , 1 , 2 , e, a] [ 1 , a, 2 , e] [ 1 , a, e, 2 ]
[i 1 , e, i 2 , a] [i 1 , e, a, i 2 ] [i 2 , ı 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 , ı 1 , a] [e, i 2 , a, i 1 ] [e, a, i 1 , i 2 ] [e, a, i 2 , i 1 ]

Her biri mümkün olduğunca eşit olmalıdır.

Tüm ünlülerin doğru yerde olduğu yeri bulana kadar dizenin tamamında rastgele karıştırma deneyemezsiniz. Kısacası, giriş sabitse, kodunuzun çalışma süresi sabit olacaktır.

Girdiler ve çıktılar

  • Girişteki tüm harflerin küçük veya büyük olacağını varsayabilirsiniz. Karışık kasayı da destekleyebilirsiniz, ancak bu size herhangi bir bonus kazandırmaz.

  • Giriş her zaman yazdırılabilir ASCII karakterlerinden oluşacaktır. Girişteki tüm karakterler çıktıda olmalıdır, sadece ünlüler karıştırılmalıdır, başka bir şey olmamalıdır.

  • Giriş boş olabilir. Girişin en az bir ünlü veya en az bir ünlü olmayan harf içereceğinin garantisi yoktur.

  • Girişi STDIN, bir işlev parametresi olarak veya benzer herhangi bir şeyden alabilirsiniz.

  • Çıktıyı STDOUTbir işlevden veya benzeri bir şey için geri yazdırabilirsiniz .

Test durumları

İlk satır verilen girdidir. İkinci satır olası çıkışlardan biridir.

<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

puanlama

Bu , sa tho shirtist enswer tr bayt Wons .


17
Siz İngilizler / Amerikan halkı ve yünlü
olmamanız

6
@KevinCruijssen Ben anadili değilim ve ayrıca yünlü olmayı da düşünürdüm , ama söylediğim son meydan okuma bir sesliydi , yneden bunu seçtiğimi sordum!
16'da 7

7
@KevinCruijssen, harfler ünlü değil: sesler.
Peter Taylor

6
Cwm için +1. Dağcılık ve / veya Gal'i canlı tutma;)
Beta Decay

2
@KevinCruijssen Do bir işbirliği yok w vo yaklaşık w yaygın böylece kabul edilmez els.
corsiKa

Yanıtlar:


13

Jöle , 15 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır

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.

Bu neden diğer cevaplara göre oldukça yavaş görünüyor?
16'da

Jelly, SymPy ve NumPy'yi her şeyden önce ithal eder. Bu program ve boş program kabaca aynı yürütme süresine sahiptir.
Dennis,


5
@Dennis Meraktan başka, Jelly neden sözlük kelimeleri oluşturmuş? Bu sözlük kelimeleri nereden alıyor?
Kevin Cruijssen

1
@KevinCruijssen Jelly'i tasarladığımda, shoco kullanan birkaç golf dili vardı ve basitçe İngilizce bir sözlük kullanmak bu fikri geliştirmek için iyi bir yol gibi görünüyordu. Dosyayı /usr/share/dict/wordsbilgisayarımdan kullandım ve Jelly yorumlayıcısına dahil ettim.
Dennis,

17

R, 92 91

Henüz yorum yapamam, bu yüzden @ Andreï Kostyrka yanıtına çok benzese de kendi cevabımı ekliyorum (ister inan ister inanma ama bağımsız olarak buldum).

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

Ungolfed

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 sayesinde bir bayt kaydedildi

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

5
Açıkçası inanamıyorum. Şaka yapıyorum. Bazı baytları kurtarmak için güzel bir numara!
Andreï Kostyrka 31:16

Dürüst olmak gerekirse, cevabımı daha da güzelleştirmek için fikirlerinizi çalmıyorum.
Andreï Kostyrka

3
Hehe, onlara tatlı tatlı oylar almalıyım ki yorumlayabileyim;)
Billywob

Satır içi atama 91 bayt ile bir bayt kaydedins=strsplit(readline(),"")[[1]];s[v]=sample(s[v<-s%in%c("a","e","i","o","u")]);cat(s,sep="")
Vlo

Kullanarak başka byte tasarruf el()yerine [[1]].
Andreï Kostyrka

11

R, 99 98 89 bayt

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

İnsan tarafından okunabilen ilk çözüm gibi görünüyor! Giuseppe'ye 9 byte kaydettiğin için teşekkürler !

Test durumları:

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

İçsel bir değişken ataması yapmanın bir yolu yok gibi görünüyor (içinde, gibi cat) ve yine bazı insanlar yanlış olduğumu kanıtlayacaklar ...


2
letters[c(1,5,9,15,21)]1 bayt daha uzundur ve OEIS A161536 ve A215721'in de yardımı yoktur veya çok azdır.
Andreï Kostyrka

Daha z=grepl("[aeiou]",x)kısa olmaz mıydı ?
Giuseppe

@Giuseppe Yine yaptın! Teşekkürler.
Andreï Kostyrka

10

CJam, 23 bayt

lee_{"aeiou"&},_mrerWf=

Çevrimiçi deneyin!

açıklama

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 bayt

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

açıklama

ž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

Çevrimiçi deneyin!


5

Python 3, 109 bayt

Sadece küçük harf ünlüleri destekler.

Fazladan bir byte kaydettiğiniz için @Alissa'ya teşekkür ederiz.

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)

Ideone!


string alarak ve karıştırılmış sesli harflerle o stringi döndüren bir fonksiyon ise daha kısa olmaz mıydı?
Alissa,

@Alissa Teşekkürler, bir bayt kurtardı! : D
Beta Decay,

daha kısa olup olmayacağından emin değilim, ama a.pop(random.randrange(0,len(a)))karıştırmak yerine bir
Alissa

4

TSQL, 275 bayt

golfed:

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 @

Ungolfed:

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 @

Keman


3

Perl, 38 bayt

İçin +1 içerir -p

STDIN'de cümle ile çalıştır

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 bayt

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

Evet, bu muhtemelen biraz golf olabilir, ancak Java bu afaik için herhangi bir kullanışlı yerleşiklere sahip değildir Collections.shuffle.

Ungolfed ve test durumları:

Burada dene.

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

Mümkün çıktı:

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

1
iİkinci döngüde tekrar kullanmaya ne dersiniz ?
Frozn

Düşündüm ki "neden bir liste yerine [] ile oraya gitmedi", bu yüzden başladım, ama Arrays.shuffletam orada durmamıştım ...
Olivier Grégoire

Bazı küçük ince 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;}
ayarlarla


3

Ruby 45 + 1 = 46 bayt

-pBayrak için +1 bayt

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

3

Brachylog , 39 bayt

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

Çevrimiçi deneyin!

açıklama

  • Ana tahmin:

    @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.
    
  • Tahmin 1:

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

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

3

Javascript (ES6), 78 76 bayt

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

Apsillers sayesinde 2 bayt kurtardı

Apsisçiler tarafından önerilen alternatif versiyon (76 bayt)

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

Ölçek

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
Bir gelişme değil (tam olarak aynı puan), ama bulduğum eğlenceli bir oyun: l=...tamamıyla bırak ve sınırlama işlevini (ok işlevi yerine) [].pop.bind(s.match(r).sort(_=>Math.random()-.5)))ikinci argüman olarak replacekullanın. Belki o yolda bulunabilecek bir gelişme vardır, ama henüz bir tane bulamadım. Bağlama işlecine sahip bir JS süperset dili kullandıysanız, ::yapabileceğinizi düşünüyorum (s.match(r).sort(_=>Math.random()-.5)))::pop.
apsillers

3

MATL , 15 bayt

tt11Y2m)tnZr7M(

Çevrimiçi deneyin!

açıklama

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 bayt

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

Dene


açıklama

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

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

Alıntı yapılan bir dizenin girişini alan ve karıştırılan dizeyi basan bir program.

Çevrimiçi deneyin

Nasıl çalışır

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 bayt

Küçük harf girişi kullanma

$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];

Açıklama:

$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

Aslında, 24 bayt

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

Çevrimiçi deneyin!

Açıklama:

;"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 bayt

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

Dizeyi bir argüman olarak alır ve sonucu stdout'a yazdırır.

Örneğin

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

baskılar

<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

Bash, 89

Tüm girişlerin küçük harf olduğunu varsayar.

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 bayt

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

56 baytlık golf için @ Ben Owen'a büyük destek

$nTüm küçük harfleri bekleyerek girdi alır , derhal bir chardizi olarak atar.

Bir içine Biz boru Where-Objectmadde elemanlarım dışarı çekmek için bu -matchbir sesli, boru bunları Sort-Objectile {Get-Random}sıralama mekanizması temin edilebilir. Niteleyiciler Get-Randomolmadan yapılan aramalar arasında 0ve [int32]::MaxValue- yani, anında her bir öğeye rasgele ağırlıklar atamak bir tamsayı döndürür . Randomize ünlüleri içine saklarız $a.

Sonunda döngüden geçiyoruz $n. Her eleman için, |%{...}eğer mevcut karakter bir yerdeyse -in $a, bir sonraki defa $aartış sonrası bir sonraki elemanın girişini yaparız $i. Aksi takdirde, şu anki karakteri çıkarırız. Hepsi parens içinde kapsüllenmiş ve bir ipte bir -joinaraya getirilmiştir. Bu dize, boru hattında bırakılır ve çıktı programın sonucunda gizlidir.

Test durumları

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

Burada, $nkarakter chardizisinde karakterleri yineleyerek ve her ünlü harfiyle eşleştirerek, bunun yerine ünlü dizisini çıkarmak için birçok bayt kaydedebilirsiniz . Gibi bir şey:$a=[char[]]$n|?{$_-match'[aeiou]'}|sort{random}
Ben Owen

@BenOwen Holy Dang, evet. 56 bayt golf için teşekkürler. Hayatım boyunca, inşa etmenin daha iyi bir yolunu bulamadım $a.
AdmBorkBork 19

2

Python 3, 106 bayt

Sadece küçük harf.

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.3 , 139 136 bayt (ve hiçbir hata atılmadı)

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 bayt

Çözüm:

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

Çevrimiçi deneyin!

Örnekler:

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

Açıklama:

Ünlülerin yerlerini bulun ve rastgele sırayla çizilen ünlülerle değiştirin.

{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


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.