Sheffle tho vawols ureund!


42

Dada una cadena de entrada, de salida que cadena con todas las vocales a, e, i, oy ucambió al azar entre sí.

Por ejemplo, en la cadena this is a test, hay 4 vocales: [i, i, a, e]. Por lo tanto, una combinación válida de esas vocales podría estar [a, i, e, i]produciendo la salida thas is e tist.

Sobre barajar

Todas las mezclas serán igualmente probables si consideramos que las vocales iguales son distintas . Para el ejemplo anterior, esos 24 shuffles son posibles:

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

Cada uno debe ser igualmente probable.

No puede intentar barajar aleatoriamente la cadena completa hasta encontrar una donde todas las vocales estén en el lugar correcto. En resumen, el tiempo de ejecución de su código será constante si la entrada es constante.

Entradas y salidas

  • Puede suponer que todas las letras en la entrada serán minúsculas o mayúsculas. También puede admitir carcasa mixta, aunque esto no le dará ninguna bonificación.

  • La entrada siempre consistirá en caracteres ASCII imprimibles. Todos los caracteres que están en la entrada deben estar en la salida, solo las vocales deben mezclarse y nada más.

  • La entrada puede estar vacía. No hay garantía de que la entrada contendrá al menos una vocal o al menos una no vocal.

  • Puede tomar la entrada de STDIN, como parámetro de función, o algo similar.

  • Puede imprimir el resultado STDOUT, devolverlo desde una función o algo similar.

Casos de prueba

La primera línea es la entrada dada. La segunda línea es una de las salidas posibles.

<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

Tanteo

Este es el , en cambio, la lista de camisas se gana en bytes .


17
Ustedes ingleses / estadounidenses y su falta de yvocales ...;)
Kevin Cruijssen

66
@KevinCruijssen No soy un hablante nativo y también consideraría yuna vocal, pero el último desafío donde dije yfue una vocal ¡Me preguntaron por qué elegí eso!
Fatalize

77
@KevinCruijssen, las letras no son vocales: los sonidos sí.
Peter Taylor

66
+1 para cwm. Mantener alpinismo y / o galés con vida;)
Beta Decay

2
@KevinCruijssen no tienen un co w sobre vo w els que no son comúnmente considerados de modo.
corsiKa

Respuestas:


13

Jalea , 15 bytes

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

Pruébalo en línea!

Cómo funciona

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.

¿Por qué esto parece bastante lento en comparación con otras respuestas?
Fatalize el

Jelly importa SymPy y NumPy antes que nada. Este programa y el programa vacío tienen aproximadamente el mismo tiempo de ejecución.
Dennis


55
@Dennis Sin embargo, por curiosidad, ¿por qué Jelly ha incorporado palabras en el diccionario? ¿De dónde saca estas palabras del diccionario?
Kevin Cruijssen

1
@KevinCruijssen Cuando diseñé Jelly, ya había algunos idiomas de golf que usaban shoco , y simplemente usar un diccionario de inglés parecía una buena manera de mejorar esa idea. Usé el archivo /usr/share/dict/wordsde mi computadora y lo incluí en el intérprete Jelly.
Dennis

17

R, 92 91

No puedo comentar todavía, así que estoy agregando mi propia respuesta, aunque muy similar a la respuesta de @ Andreï Kostyrka (lo creas o no, pero se me ocurrió de forma independiente).

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

Sin golf

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

Guardado un byte gracias a @Vlo

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

55
Honestamente, no puedo creerlo. Es una broma. Buen truco para guardar algunos bytes!
Andreï Kostyrka

Para ser honesto, no estoy robando sus ideas para jugar golf mi respuesta aún más.
Andreï Kostyrka

3
Jeje, tengo que conseguirles dulces votos para que pueda comentar;)
Billywob

Guardar un byte con asignación en línea 91 bytess=strsplit(readline(),"")[[1]];s[v]=sample(s[v<-s%in%c("a","e","i","o","u")]);cat(s,sep="")
Vlo

Guarde otro byte utilizando en el()lugar de [[1]].
Andreï Kostyrka

11

R, 99 98 89 bytes

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

¡Parece ser la primera solución legible para humanos! ¡Gracias a Giuseppe por guardar 9 bytes!

Casos de prueba:

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

Parece que no hay forma de hacer una asignación de variable interna (dentro, como, cat), y nuevamente algunas personas van a demostrar que estoy equivocado ...


2
letters[c(1,5,9,15,21)]es 1 byte más largo, y OEIS A161536 y A215721 parecen ser de poca o ninguna ayuda tampoco.
Andreï Kostyrka

¿No z=grepl("[aeiou]",x)sería más corto?
Giuseppe

@Giuseppe ¡Lo hiciste de nuevo! Gracias.
Andreï Kostyrka

10

CJam, 23 bytes

lee_{"aeiou"&},_mrerWf=

Pruébalo en línea!

Explicación

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 bytes

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

Explicación

ž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

Pruébalo en línea!


5

Python 3, 109 bytes

Solo admite vocales en minúsculas.

Gracias a @Alissa por guardar un byte adicional.

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


¿No sería más corto si es una función que toma una cadena y devuelve esa cadena con vocales mezcladas?
Alissa

@Alissa Gracias, ¡salvó un byte! : D
Beta Decay

no estoy seguro si será más corto, pero podría en a.pop(random.randrange(0,len(a)))lugar de barajar un
Alissa

4

TSQL, 275 bytes

Golfizado:

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 @

Sin golf:

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 @

Violín


3

Perl, 38 bytes

Incluye +1 para -p

Corre con la frase en 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 bytes

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í, esto probablemente se puede jugar bastante, pero Java no tiene ninguna función integrada para este afaik ... Además, olvidé un poco la variante de matriz codegolf para Collections.shuffle...

Sin golf y casos de prueba:

Pruébalo aquí

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

Salida posible:

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

1
¿Qué tal reutilizar ien el segundo ciclo?
Frozn

Pensé "por qué no fue con char [] en lugar de una Lista", así que empecé, pero la falta de Arrays.shufflemí me detuvo allí ...
Olivier Grégoire

Afeitado 6 personajes con algunos ajustes menores: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


3

Ruby 45 + 1 = 46 bytes

+1 byte para -pbandera

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

3

Brachylog , 39 bytes

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

Pruébalo en línea!

Explicación

  • Predicado principal:

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

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

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

3

Javascript (ES6), 78 76 bytes

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

Guardado 2 bytes gracias a apsillers

Versión alternativa propuesta por apsillers (76 bytes también)

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

Prueba

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
No fue una mejora (exactamente el mismo puntaje), sino una uglificación divertida que encontré: soltar l=...completamente y usar la función enlazada [].pop.bind(s.match(r).sort(_=>Math.random()-.5)))como segundo argumento para replace(en lugar de una función de flecha). Tal vez haya una mejora en ese camino, pero aún no he encontrado una. Si utilizó un lenguaje JS-superset que tiene el operador de enlace ::, creo que podría hacerlo (s.match(r).sort(_=>Math.random()-.5)))::pop.
apsillers

3

MATL , 15 bytes

tt11Y2m)tnZr7M(

Pruébalo en línea!

Explicación

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 bytes

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

Intentalo


Explicación

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

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

Un programa que toma la entrada de una cadena entre comillas e imprime la cadena aleatoria.

Pruébalo en línea

Cómo funciona

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 bytes

Usando entrada minúscula

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

Explicación:

$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

En realidad, 24 bytes

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

Pruébalo en línea!

Explicación:

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

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

Toma la cadena como argumento e imprime el resultado en stdout.

P.ej

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

huellas dactilares

<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

Asume que todas las entradas están en minúsculas.

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 bytes

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

Grandes apoyos a @ Ben Owen para el golf de 56 bytes

Toma entrada $n, esperando todas las minúsculas, inmediatamente la charconvierte como una matriz.

Lo canalizamos en una Where-Objectcláusula para extraer esos elementos que son -matchvocales, y los canalizamos Sort-Objectcon {Get-Random}el mecanismo de clasificación. Las llamadas Get-Randomsin calificadores devolverán un número entero entre 0y [int32]::MaxValue, es decir, asignar pesos aleatorios a cada elemento sobre la marcha. Almacenamos las vocales aleatorias en $a.

Finalmente, nos conectamos $n. Para cada elemento, |%{...}si el carácter actual está en alguna parte -in $a, mostramos el siguiente elemento $a, después del incremento $ipara la próxima vez. De lo contrario, mostramos el carácter actual. Todo eso está encapsulado en parens y -joineditado en una cadena. Esa cadena se deja en la tubería, y la salida está implícita al final del programa.

Casos de prueba

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

Puede guardar muchos bytes aquí iterando a través $nde los caracteres y haciendo coincidir cada vocal para obtener el charconjunto de vocales. Algo así como:$a=[char[]]$n|?{$_-match'[aeiou]'}|sort{random}
Ben Owen

@BenOwen Santo Dios, sí. Gracias por el golf de 56 bytes. Por mi vida, no pude encontrar una mejor manera de construir $a.
AdmBorkBork

2

Python 3, 106 bytes

Solo en minúsculas.

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 bytes (y sin errores)

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 bytes

Solución:

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

Pruébalo en línea!

Ejemplos:

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

Explicación:

Encuentre ubicaciones de las vocales y reemplácelas con las vocales dibujadas en un orden aleatorio.

{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


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.