Зворотні слова без зміни великих літер чи розділових знаків


13

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

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

(Знаки пунктуації означають будь-які символи, які не є az, AZ або пробілами *).

  • Цифри було вилучено із цього списку через те, що ви не можете мати великі регістри. Числа тепер трактуються як розділові знаки.

Наприклад, для введення:

Hello, I am a fish.

він повинен виводити:

Olleh, I ma a hsif.

Зауважте, що О, що є першою літерою першого слова, зараз є капіталом, оскільки H раніше був капіталом у тому самому місці.

Кома та період також знаходяться в одному місці.

Більше прикладів:

This; Is Some Text!

виведе

Siht; Si Emos Txet!

Можна використовувати будь-яку мову. Перемагає програма з найменшою кількістю символів.


3
Як слід лікувати скорочення? Тобто Don't touch that!карта t'noD hcuot taht!чи до noD't hcuot taht!?
dmckee --- кошеня колишнього модератора

2
@dmckee "(Знаки пунктуації означають будь-які символи, які не є az, AZ, 1-9 або пробілами)"
Джон Дворак

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.

Цей онлайн-редактор golfscript виглядає корисним. Закладка, дякую
Джон Дворак

Ви можете витягнути фінал " "всередині, %щоб зберегти його. Я знайшов інші способи тестування 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

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

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
манатура

EDIT: о, я бачу зараз
1313

-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 Маленька деталь: [A-z]ні [A-Za-z]. Перша - це поширена (?) Помилка, оскільки вона містить неабетичні символи.
Ерік Аутгольфер

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