Текст текстового тексту


14

I heva цей wierd текст, де vewols здається ratetod:

Я погано написаний текст. Якийсь божевільний хлопець грав із порядком голосних. Будь ласка, виправте мене!

Тож мені знадобиться прагром, який може оцінювати веоли (і букву "у", як здається) назад, щоб текст міг бути аґенським.

Ouy може choeso lungaega of ouyr chieco privedod ouy meka a cempleto pragrom (так що не просто фінктун). Yntre може бути нефіліптом, текстовим feli або каммонським лені. Uutpot mya olsa vra як ouy leki.

З куєрсо я буду заважати погано використовувати погані тексти. У прагромі немає вуали, яку б текст текстів МАК не міг передати. Але ouy може виправити ouyr цемент і qeistouns у текстах ratetod, якщо вони хочуть.


Роз'яснення

  • Ваша програма вимагає лише для обробки тексту ASCII.
  • Для цього питання наступні символи є голосними: aeiouy
  • Позиції голосних усередині кожного слова слід обертати. Існує деяка гнучкість у визначенні того, що кваліфікується як слово: мінімальна вимога полягає в тому, щоб два символи, розділені пробілом, були різними словами, а два алфавітні символи ( a-zA-Z), розділені лише алфавітними символами, містяться в одному слові.
  • Бажаний напрямок обертання слід зробити з наведених нижче тестових випадків.

Тестові справи

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

Вхід: AeiOuy
Вихід:EioUya

Вхід: Hyphenated-word
Вихід: Hephanetyd-wordабоHephanetod-wyrd


1
Визначте голосну .
Пітер Тейлор

5
Я лекі "зберігаю" у цьому центтоксе.
Говард

2
Питання свідомо непрозоре. Враховуючи, що існує декілька можливих визначень (серед інших, лише 10 кодових точок, що відповідають aeiouAEIOUASCII / Basic Latin; ті кодові точки плюс будь-які інші в додатку Basic Latin та Latin-1, у яких ті основні символи поєднуються з діакритикою) , питання має бути явним.
Пітер Тейлор

1
@PeterTaylor Я припускаю, ASCII
Джон Дворак

8
У грі не повинно йти про здогадування проблеми. Див. Поширені запитання : "У всіх питаннях на цьому веб-сайті, будь то головоломка з програмуванням чи код з гольфом, повинно бути ... Чітка специфікація того, що є правильним поданням".
Пітер Тейлор

Відповіді:


6

GolfScript, 68 67 57 символів

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

Вхід повинен бути вказаний на STDIN. Приклад ( онлайн ):

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

5

Рубі, 91 90 символів

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

Coffeescript, 148 чаректарів

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']()

Ніяких усимтоанців, окрім того, що «хольф-церакт» - це слово, а не мій сулітун.

Тест:

> 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

Щодо коду Ruby: 1) запасіть 2 символи, використовуючи $&замість gsub()параметра y другого блоку; 2) запасіть 1 символ, використовуючи ?Zзамість 'Z'.
манатура

@manatwork $&не можна використовувати, оскільки він змінений до того, як я його використаю. z=$'[r]змінює його. Щодо ?Z- дякую, я повністю забув про цей синтаксис.
Джон Дворак

На жаль Не маю ідеї, як я тестував це вчора, так виявилося, що це працює…
manatwork

2

Haskell, 159 символів

Не закінчилося так швидко, як я сподівався, але я все-таки вирішив опублікувати це:

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

Негольована версія:

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

Це хороший приклад того, як лінива оцінка може дозволяти вам робити цікаві трюки. В rotateVowels, кожен раз , коли новий голосний знайдений, він передається зліва, замінюючи його з одним наближаються праворуч. Ця частина виводу зі згину подається назад як вхід, так що крайній лівий голосний стає заміною самого правого.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.