Обратные слова без изменения заглавных букв или знаков препинания

13

Создайте программу с наименьшим количеством символов, чтобы поменять местами каждое слово в строке, сохраняя при этом порядок слов, а также знаки препинания и заглавные буквы на их первоначальном месте.

Под «Порядком слов» я подразумеваю, что каждое слово разделяется пустым пробелом («»), поэтому сокращения и тому подобное будут рассматриваться как одно слово. Апостроф в сокращениях должен оставаться на одном месте. ("Не" => "Tno'd").

(Пунктуация означает любые символы, которые не являются az, AZ или пробелом *).

  • Числа были удалены из этого списка из-за того, что у вас не может быть заглавных чисел. Числа теперь рассматриваются как знаки пунктуации.

Например, для ввода:

Hello, I am a fish.

он должен вывести:

Olleh, I ma a hsif.

Обратите внимание, что O, которая является первой буквой в первом слове, теперь является заглавной, поскольку H ранее была заглавной в том же месте.

Запятая и точка тоже в одном месте.

Больше примеров:

This; Is Some Text!

будет выводить

Siht; Si Emos Txet!

Любой язык может быть использован. Программа с наименьшим количеством символов выигрывает.

nasonfish
источник
3
Как лечить схватки? То есть Don't touch that!карта к t'noD hcuot taht!или к noD't hcuot taht!?
dmckee --- котенок экс-модератора
2
@dmckee "(Знаки пунктуации означают любые символы, отличные от az, AZ, 1-9 или пробела)"
John Dvorak
1
@dmckee, поэтому он должен отображаться вNod't hcuot tath!
Джон Дворак
1
Поменять каждое слово легко. Реверсировать каждое слово и сохранять заглавные буквы нельзя.
Джон Дворак
1
Да, это проблема;) просто просто поменять их местами было бы слишком просто и, вероятно, сводиться к используемому языку. Это должно заставить вас думать.
nasonfish

Ответы:

7

GolfScript, 58 54 48 символов

" "/{.{65- 223&26<}:A,\{.A{96&\)31&@+}*}%+}%" "*

Это решение GolfScript, которое стало довольно длинным. Много кода на самом деле выясняет, находится ли символ в a-zA-Z. Может быть, кто-то может найти еще более короткий способ проверить это.

Вы можете попробовать код онлайн . Примеры:

> Hello, I am fish.
Olleh, I ma hsif.

> This; Is Some Text!
Siht; Si Emos Txet!

> Don't try this at home.
Tno'd yrt siht ta emoh.
Говард
источник
Этот онлайн-редактор для гольфа выглядит полезным. Закладка, спасибо
Джон Дворжак
Вы можете вытащить финал " "внутри, %чтобы сохранить один. Я нашел другие способы тестирования a-zA-Z для 11 символов, но еще нет для 10.
Питер Тейлор,
4

APL 69

Вводит экран через: t ← ⍞

⎕av[1↓∊(↑¨v),¨((¯1×⌽¨z)+z←¯32×~1↓¨v>97)+¨⌽¨1↓¨v←(+\v<66)⊂v←0,⎕av⍳t←⍞]
Грэхем
источник
Не следует ли считать APL в байтах UTF-8? :-)
Джон Дворжак
@JanDvorak Набор символов APL + Win V5 является однобайтовым. Я должен преобразовать в UTF-8, чтобы публиковать здесь, чтобы символы правильно отображались. Aboveav⍳t выше возвращает индекс в наборе символов от 0 до 255 для символов в векторе t.
Грэм
4

CoffeeScript, 134 133 персонажа

alert prompt().replace /\S+/g,(x)->c=x.match r=/[a-z]/gi;return x.replace r,(y)->return c.pop()[`(y<"a"?"toUpp":"toLow")`+"erCase"]()

Coffeescript - это (для целей гольф-кода) немного более плотная версия javascript. У него нет тернарного оператора, но есть выход в javascript.

Вот версия JavaScript:

Javascript, 152 151 персонажа

alert(prompt().replace(/\S+/g,function(x){c=x.match(r=/[a-z]/gi);return x.replace(r,function(y){return c.pop()[(y<"a"?"toUpp":"toLow")+"erCase"]()})}))

Отступ:

alert(prompt().replace(/\S+/g,function(x){
  c=x.match(r=/[a-z]/gi);
  return x.replace(r, function(y){
    return c.pop()[(y<"a"?"toUpp":"toLow")+"erCase"]()
  })
}))
Джон дворак
источник
2

Рубин: 89 символов (включая 1 для -pпереключателя)

Не копируется Jan Dvorak «s решение CoffeeScript , но после многих попыток моего код закончился выглядит как точная копия. Подсознательный голос, вероятно, продолжал шептать: «Следуй за белым кроликом Яном Двораком». Так что отзывы за алгоритм должны идти на его ответ.

$_.gsub!(/\S+/){|m|l=m.scan r=/[a-z]/i;m.gsub(r){|c|l.pop.send c<?a?:upcase: :downcase}}

Образец прогона:

bash-4.2$ ruby -p reverse-word.rb <<< "Hello, I am a fish.
This; Is Some Text!
Don't touch that!
S'm00ch1e"
Olleh, I ma a hsif.
Siht; Si Emos Txet!
Tno'd hcuot taht!
E'h00cm1s
manatwork
источник
0

Луа, 143

print(((io.read"*l"):gsub("%w+",function(s)local r=""for i=1,#s do r=("")[s:byte(-i)>96 and"lower"or"upper"](s:sub(i,i))..r end return r end)))
МНИИП
источник
Хорошая попытка, но она также должна сохранять пунктуацию на месте: pastebin.com/X8QLf6fW
manatwork
РЕДАКТИРОВАТЬ: о, я вижу сейчас
mniip
-1

EcmaScript 6 (112 символов)

Вход предоставляется в s.

alert(s.replace(/\S+/g,x=>(_=x.match(X=/[a-z]/gi),x.replace(X,a=>_.pop()[(a<"a"?"toUpp":"toLow")+"erCase"]()))))

Основано на ответе @Jan Dorvak.

зубная щетка
источник
-2

C # (375)

 public static string rev(string s)
    {
        var r = new Regex("[^A-za-z]");

        var result = "";
        var token = "";
        foreach (var c in s)
        {
            if (!r.IsMatch(c + ""))
            {
                token += c;
            }
            else
            {
                result += new string(token.Reverse().ToArray());
                result += c;
                token = "";
            }
        }

        var arr = result.ToArray();
        int i = 0;
        foreach (var c in s)
        {
            arr[i] = char.IsUpper(c) ? char.ToUpper(arr[i]) : char.ToLower(arr[i]);
            i++;
        }

        result = new string(arr);
        return result;
    }

Минимизированный

public static string rev(string s){var r=new Regex("[^A-za-z]");var result="";var token="";foreach(var c in s){if(!r.IsMatch(c+"")){token+=c;}else{result+=new string(token.Reverse().ToArray());result+=c;token="";}}var arr=result.ToArray();int i=0;foreach(var c in s){arr[i]=char.IsUpper(c)?char.ToUpper(arr[i]):char.ToLower(arr[i]);i++;}result=new string(arr);return result;}
микробный
источник
Не должно ли это быть A-Za-z?
Cyoce
@Cyoce Маленькая деталь: [A-z]нет [A-Za-z]. Первая - распространенная (?) Ошибка, потому что она содержит не алфавитные символы.
Эрик Outgolfer
1
И разве это не должно быть, гольф?
Cyoce