Sheffle tho vawols ureund!


42

Dato una stringa di input, output che stringa con tutte le vocali a, e, i, oe uscambiato a caso tra loro.

Per esempio, nella stringa this is a test, ci sono 4 vocali: [i, i, a, e]. Una mescolanza valida di quelle vocali potrebbe [a, i, e, i]quindi produrre il risultato thas is e tist.

A proposito di mescolanza

Tutte le mescolanze devono essere ugualmente probabili se consideriamo vocali uguali distinte . Per l'esempio sopra, sono possibili quei 24 riordini:

[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 ]

Ognuno dovrebbe essere altrettanto probabile.

Non puoi provare a mescolare casualmente l'intera stringa fino a trovare quella in cui tutte le vocali sono nel posto giusto. In breve, il tempo di esecuzione del codice deve essere costante se l'input è costante.

Ingressi e uscite

  • Si può presumere che tutte le lettere nell'input siano minuscole o maiuscole. Puoi anche supportare il case misto, anche se questo non ti darà alcun bonus.

  • L'input consisterà sempre di caratteri ASCII stampabili. Tutti i caratteri che si trovano nell'input devono essere nell'output, solo le vocali devono essere mescolate e nient'altro.

  • L'input può essere vuoto. Non vi è alcuna garanzia che l'input conterrà almeno una vocale o almeno una non vocale.

  • È possibile prendere l'input da STDIN, come parametro di funzione o qualcosa di simile.

  • È possibile stampare l'output STDOUT, restituirlo da una funzione o qualcosa di simile.

Casi test

La prima riga è l'input dato. La seconda riga è una delle possibili uscite.

<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

punteggio

Si tratta di , per chi veste di camicia e di byte vinti .


17
Voi inglesi / americani e la vostra mancanza di yvocale ..;)
Kevin Cruijssen,

6
@KevinCruijssen Non sono un madrelingua e considererei anche yuna vocale, ma l'ultima sfida in cui ho detto yera una vocale mi è stato chiesto perché l'ho scelto!
Fatalizza il

7
@KevinCruijssen, le lettere non sono vocali: i suoni lo sono.
Peter Taylor,

6
+1 per cwm. Mantenere in vita l'alpinismo e / o il gallese;)
Decadimento beta

2
@KevinCruijssen Do non ha un co w su vo w els che non sono comunemente considerati così.
corsiKa

Risposte:


13

Gelatina , 15 byte

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

Provalo online!

Come funziona

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.

Perché questo sembra abbastanza lento rispetto ad altre risposte?
Fatalizza il

Jelly importa SymPy e NumPy prima di ogni altra cosa. Questo programma e il programma vuoto hanno approssimativamente lo stesso tempo di esecuzione.
Dennis,

15
Prima che qualcuno lo chieda, l' euoi è un grido di appassionato rapimento negli antichi bacchici .
Dennis,

5
@Dennis Per curiosità, perché Jelly ha incorporato le parole del dizionario? Da dove vengono queste parole del dizionario?
Kevin Cruijssen,

1
@KevinCruijssen Quando ho disegnato Jelly, c'erano già alcune lingue del golf che utilizzavano shoco e semplicemente usare un dizionario inglese mi sembrava un buon modo per migliorare l'idea. Ho usato il file /usr/share/dict/wordsdal mio computer e l'ho incluso nell'interprete Jelly.
Dennis,

17

R, 92 91

Non posso ancora commentare, quindi sto aggiungendo la mia risposta, anche se molto simile alla risposta @ Andreï Kostyrka (che ci crediate o no, ma è venuta fuori in modo indipendente).

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

Salvato un byte grazie a @Vlo

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

5
Onestamente, non ci posso credere. Stavo solo scherzando. Bel trucco per salvare alcuni byte!
Andreï Kostyrka,

Giusto per essere sincero, non sto rubando le tue idee per golfare ulteriormente la mia risposta.
Andreï Kostyrka,

3
Hehe, devo prenderli dolci voti in modo che io possa commentare;)
Billywob

Salva un byte con assegnazione in linea 91 bytes=strsplit(readline(),"")[[1]];s[v]=sample(s[v<-s%in%c("a","e","i","o","u")]);cat(s,sep="")
Vlo

Salvare un altro byte utilizzando el()invece di [[1]].
Andreï Kostyrka,

11

R, 99 98 89 byte

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

Sembra essere la prima soluzione leggibile dall'uomo! Grazie a Giuseppe per aver salvato 9 byte!

Casi test:

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

Sembra che non ci sia modo di fare un'assegnazione variabile interna (dentro, come, cat), e ancora alcune persone dimostreranno che mi sbaglio ...


2
letters[c(1,5,9,15,21)]è più lungo di 1 byte e OEIS A161536 e A215721 sembrano essere di scarsa utilità.
Andreï Kostyrka,

Non z=grepl("[aeiou]",x)sarebbe più breve?
Giuseppe,

@Giuseppe L'hai fatto di nuovo! Grazie.
Andreï Kostyrka,

10

CJam, 23 byte

lee_{"aeiou"&},_mrerWf=

Provalo online!

Spiegazione

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 byte

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

Spiegazione

ž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

Provalo online!


5

Python 3, 109 byte

Supporta solo vocali minuscole.

Grazie a @Alissa per aver salvato un byte extra.

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 esso!


non sarebbe più breve se è una funzione che prende la stringa e restituisce quella stringa con vocali mescolate?
Alissa,

@Alissa Grazie, ha salvato un byte! : D
Decadimento beta

non sono sicuro se sarà più breve, ma potresti a.pop(random.randrange(0,len(a)))invece di mescolare un
Alissa

4

TSQL, 275 byte

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 @

Violino


3

Perl, 38 byte

Include +1 per -p

Esegui con la frase su 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 byte

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

Sì, probabilmente questo può essere giocato un po 'a golf, ma Java non ha alcuni pratici built-in per questo afaik .. Inoltre, ho dimenticato di dimenticare la variante di array codegolfed per Collections.shuffle..

Casi non testati e test:

Provalo qui.

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

Uscita possibile:

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

1
Che ne dici di riutilizzare inel secondo ciclo?
Frozn,

Ho pensato "perché non è andato con char [] invece di un elenco", così ho iniziato, ma la mancanza di Arrays.shufflemi ha fermato proprio lì ...
Olivier Grégoire

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

3

Perl 6 , 65 byte

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

Funzione anonima. Presuppone input in lettere minuscole.

( provalo online )


3

Rubino 45 + 1 = 46 byte

+1 byte per -pflag

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

3

Brachylog , 39 byte

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

Provalo online!

Spiegazione

  • Predicato principale:

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

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

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

3

Javascript (ES6), 78 76 byte

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

Salvato 2 byte grazie a apsillers

Versione alternativa proposta da apsillers (anche 76 byte)

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

Test

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
Non ho trovato un miglioramento (esatto stesso punteggio), ma ho trovato una divertente semplificazione: rilasciare il l=...tutto e utilizzare la funzione associata [].pop.bind(s.match(r).sort(_=>Math.random()-.5)))come secondo argomento replace(anziché una funzione freccia). Forse c'è un miglioramento da trovare lungo quella strada, ma non ne ho ancora trovato uno. Se hai usato un linguaggio superset JS che ha l'operatore bind ::, penso che potresti farlo (s.match(r).sort(_=>Math.random()-.5)))::pop.
apsillers

3

MATL , 15 byte

tt11Y2m)tnZr7M(

Provalo online!

Spiegazione

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 byte

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

Provalo


Spiegazione

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

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

Un programma che accetta l'input di una stringa tra virgolette e stampa la stringa mescolata.

Provalo online

Come funziona

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 byte

Utilizzo di input minuscoli

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

Spiegazione:

$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

In realtà, 24 byte

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

Provalo online!

Spiegazione:

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

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

Prende la stringa come argomento e stampa il risultato su stdout.

Per esempio

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

stampe

<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

Presuppone che tutti gli input siano in minuscolo.

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 byte

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

Grandi oggetti di scena a @ Ben Owen per il golf a 56 byte

Riceve input $n, aspettandosi tutti i caratteri minuscoli, li lancia immediatamente come una charmatrice.

Noi tubo che in una Where-Objectclausola per estrarre gli elementi che -matchuna vocale, li tubo Sort-Objectcon {Get-Random}il meccanismo di ordinamento. Chiamata Get-Randomsenza qualificatori restituirà un intero compreso tra 0e [int32]::MaxValue- vale a dire, l'assegnazione di pesi casuali per ogni elemento al volo. Conserviamo le vocali randomizzate in $a.

Alla fine, passiamo attraverso $n. Per ogni elemento, |%{...}se il carattere corrente si trova da qualche parte -in $a, viene emesso l'elemento successivo $a, post-incremento $iper la volta successiva. Altrimenti, emettiamo il carattere corrente. Questo è tutto incapsulato in parentesi ed editato -joininsieme in una stringa. Quella stringa viene lasciata sulla pipeline e l'output è implicito alla conclusione del programma.

Casi test

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

Puoi salvare molti byte qui ripetendo $ni caratteri e facendo corrispondere su ciascuna vocale per produrre invece l' chararray di vocali. Qualcosa del tipo:$a=[char[]]$n|?{$_-match'[aeiou]'}|sort{random}
Ben Owen,

@BenOwen Holy dang, sì. Grazie per il golf a 56 byte. Per la mia vita, non riuscivo a capire un modo migliore per costruire $a.
AdmBorkBork,

2

Python 3, 106 byte

Solo lettere minuscole.

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 byte (e nessun errore generato)

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 byte

Soluzione:

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

Provalo online!

Esempi:

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

Spiegazione:

Trova le posizioni delle vocali e sostituiscile con le vocali disegnate in ordine casuale.

{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


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.