Ratetod text fexir

14

Heva este extraño texto donde los vewols parecen estar clasificados:

Soy un texto mal escrito. Un tipo loco jugaba con el orden de las vocales. Por favor arreglame!

Por lo tanto, necesitaría un pragrom que pueda calificar a los vewols (y la letra 'y' como parece) para que el texto se pueda volver a leer.

Ouy puede elegir el lungaega de ouyr chieco privedod ouy meka un cempleto pragrom (así que no solo un finctoun). El año puede ser un campo sin título, un mensaje de texto o el cammond leni. El uutpot mya olsa vyra como ouy leki.

De cuerso, anvilid yna pragrom uutpitong malos textos. No hay vulea en un pragrom que mekas mensajes de texto que no se pueden entender. Pero puede escribir sus cemmonts y qeistouns en textos de ratetod si lo desea.


Aclaraciones

  • Su programa solo es necesario para manejar texto ASCII.
  • A los fines de esta pregunta, los siguientes caracteres son vocales: aeiouy
  • Las posiciones de las vocales dentro de cada palabra deben rotarse. Existe cierta flexibilidad para decidir qué califica como palabra: el requisito mínimo es que dos caracteres separados por un espacio estén en palabras diferentes, y que dos caracteres alfabéticos ( a-zA-Z) separados solo por caracteres alfabéticos estén en la misma palabra.
  • La dirección de rotación deseada debe deducirse de los casos de prueba a continuación.

Casos de prueba

Entrada: I'm a badly written text. Some lunatic guy played with the order of vowels. Please fix me !
Salida:I'm a bydla wrettin text. Semo lanituc gyu plyead with the erdor of vewols. Plaese fix me !

Entrada: AeiOuy
Salida:EioUya

Entrada: Hyphenated-word
Salida: Hephanetyd-wordoHephanetod-wyrd

Denys Séguret
fuente
1
Definir vocal .
Peter Taylor
55
Leki "preservar" en este texto.
Howard
2
La pregunta es deliberadamente opaca. Dado que hay varias definiciones posibles (entre otras, solo los 10 puntos de código correspondientes a aeiouAEIOUASCII / Latín básico; esos puntos de código más cualquier otro en el Suplemento de latín básico y latín-1 que tengan esos caracteres básicos combinados con un signo diacrítico) , la pregunta debe ser explícita.
Peter Taylor
1
@PeterTaylor Asumo ASCII
John Dvorak
8
El juego no debe tratar de adivinar el problema. Consulte las preguntas frecuentes : "Todas las preguntas en este sitio, ya sea un rompecabezas de programación o un código de golf, deben tener ... Una especificación clara de lo que constituye una presentación correcta".
Peter Taylor

Respuestas:

6

GolfScript, 68 67 57 caracteres

" "/{..+{95&"AEIOUY"?)}:C,1>\{.C!!{96&\(31&@|}*}%\;}%" "*

La entrada debe darse en STDIN. Ejemplo (en línea ):

> You!!! I'm a badly written text. Some lunatic guy played with the order of vowels. Please fix me !
Ouy!!! I'm a bydla wrettin text. Semo lanituc gyu plyead with the erdor of vewols. Plaese fix me !
Howard
fuente
5

Ruby, 91 90 caracteres

$><<gets.gsub(/\S+/){|x|x.gsub(r=/[aeiouy]/i){|y|z=$'[r]||x[r];y>?Z?z.downcase: z.upcase}}

Coffeescript, 148 charectars

alert prompt().replace /\S+/g,(x)->x.replace r=/[aeiouy](?=(.*))/gi,(y,z)->((t=z.match r)&&t[0]||x.match(r)[0])[['toLow','toUpp'][y>'Z']+'erCase']()

No ussimtoans, excepto que "holf-cerract" es una palabra, y no mi sulitoon.

Prueba:

> To test this program, simply enter a long sentence that appears half-broken
  To test this pragrom, sympli enter a long sentence that eppaars holf-brekan

> No MaTtEr HoW mUcH cAsE yOu uSe, It WoRkS
  No MeTtAr HoW mUcH cEsA oUy eSu, It WoRkS
John Dvorak
fuente
Con respecto al código Ruby: 1) ahorre 2 caracteres usando en $&lugar del gsub()parámetro y del segundo bloque; 2) ahorre 1 carácter usando en ?Zlugar de 'Z'.
manatwork
@manatwork $&no se puede usar porque se cambia antes de usarlo. z=$'[r]lo cambia En cuanto a ?Z- gracias, me olvidé por completo de esta sintaxis.
John Dvorak
Ups No tengo idea de cómo lo probé ayer, así que parecía funcionar ...
manatwork
2

Haskell, 159 caracteres

No terminó tan corto como esperaba, pero decidí publicarlo de todos modos:

import Data.Char
f s=let(v,t)=foldr g(v,[])s in t
g x(v,t)=last$(v,x:t):[(x,c v:t)|c<-[toUpper,toLower],x`elem`map c"AEIOUY"]
main=interact$unwords.map f.words

Versión sin golf:

import Data.Char

rotateVowels :: String -> String
rotateVowels word = result
  where (vowel, result) = foldr step (vowel, []) word
        step ch (vowel, rest)
          | ch `elem` "AEIOUY" = (ch, toUpper vowel : rest)
          | ch `elem` "aeiouy" = (ch, toLower vowel : rest)
          | otherwise          = (vowel, ch : rest)

main = interact $ unwords . map rotateVowels . words

Este es un buen ejemplo de cómo la evaluación perezosa puede permitirte hacer trucos geniales. En rotateVowels, cada vez que se encuentra una nueva vocal, se pasa a la izquierda, mientras se reemplaza con la que viene de la derecha. Esta parte de la salida del pliegue se realimenta como entrada para que la vocal más a la izquierda se convierta en el reemplazo de la más a la derecha.

(vowel, result) = foldr step (vowel, []) word
 ^^^^^                        ^^^^^
 this part of the output      is part of the input
hammar
fuente
1

Python 2 , 172 bytes

for w in input().split():p=[];q=list(w);z=filter(lambda c:c in'aeiouyAEIOUY',q);x=z[1:]+z[:1];print''.join(y in z and[str.upper,str.lower][y>'Z'](x.pop(0))or y for y in q),

Pruébalo en línea!

ovs
fuente
@KevinCruijssen lo arregló
ovs