Odwróć słowa bez zmiany wielkich liter i znaków interpunkcyjnych

13

Utwórz program z najmniejszą liczbą znaków, aby odwrócić każde słowo w ciągu, zachowując kolejność słów, a także znaki interpunkcyjne i wielkie litery w ich początkowym miejscu.

Przez „Kolejność słów” rozumiem, że każde słowo jest podzielone pustą spacją („”), więc skurcze i takie będą traktowane jako jedno słowo. Apostrofa skurczów powinna pozostać w tym samym miejscu. („Don't” => „Tno'd”).

(Interpunkcja oznacza dowolne znaki, które nie są az, AZ ani białymi znakami *).

  • Numery zostały usunięte z tej listy, ponieważ nie można mieć wielkich liczb. Liczby są teraz traktowane jako znaki interpunkcyjne.

Na przykład dla danych wejściowych:

Hello, I am a fish.

powinien generować:

Olleh, I ma a hsif.

Zwróć uwagę, że O, która jest pierwszą literą w pierwszym słowie, jest teraz wielką literą, ponieważ H była wcześniej wielką literą w tym samym miejscu.

Przecinek i kropka również znajdują się w tym samym miejscu.

Więcej przykładów:

This; Is Some Text!

wyszedłby

Siht; Si Emos Txet!

Można użyć dowolnego języka. Program z najmniejszą liczbą znaków wygrywa.

nasonfish
źródło
3
Jak leczyć skurcze? Czy to jest Don't touch that!mapowanie do t'noD hcuot taht!czy noD't hcuot taht!?
dmckee --- były moderator kociak
2
@dmckee „(Interpunkcja oznacza dowolne znaki, które nie są az, AZ, 1-9 lub spacjami)”
John Dvorak
1
@dmckee, więc powinno się odwzorować naNod't hcuot tath!
John Dvorak,
1
Odwracanie każdego słowa jest łatwe. Odwracanie każdego słowa i zachowanie wielkich liter nie jest.
John Dvorak,
1
Tak, to wyzwanie;) po prostu ich odwrócenie byłoby zbyt proste i prawdopodobnie sprowadzałoby się do używanego języka. To ma zmusić cię do myślenia.
nasonfish,

Odpowiedzi:

7

GolfScript, 58 54 48 znaków

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

To rozwiązanie GolfScript stało się dość długie. Wiele kodu w rzeczywistości sprawdza, czy znak jest w a-zA-Z. Może ktoś może znaleźć jeszcze krótszy sposób na przetestowanie tego.

Możesz wypróbować kod online . Przykłady:

> 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.
Howard
źródło
Ten internetowy edytor gry w golfa wygląda na przydatny. Zakładki, dzięki
John Dvorak,
Możesz wyciągnąć finał do " "środka, %aby go uratować. Znalazłem inne sposoby testowania a-zA-Z dla 11 znaków, ale jeszcze nie dla 10.
Peter Taylor
4

APL 69

Odbiera dane z ekranu za pośrednictwem: t ← ⍞

⎕av[1↓∊(↑¨v),¨((¯1×⌽¨z)+z←¯32×~1↓¨v>97)+¨⌽¨1↓¨v←(+\v<66)⊂v←0,⎕av⍳t←⍞]
Graham
źródło
Czy APL nie powinien być liczony w bajtach UTF-8? :-)
John Dvorak,
@JanDvorak Zestaw znaków APL + Win V5 jest jednobajtowy. Muszę przekonwertować na UTF-8, aby opublikować tutaj, aby znaki były poprawnie renderowane. ⎕av⍳t powyżej zwraca indeks do zestawu znaków od 0-255 dla znaków w wektorze t.
Graham,
4

Coffeescript, 134 133 znaków

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 jest (dla celów golfa) nieco gęstszą wersją javascript. Nie ma potrójnego operatora, ale ma ucieczkę do javascript.

Oto wersja javascript:

JavaScript, 152 151 znaków

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"]()})}))

Zębaty:

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"]()
  })
}))
John Dvorak
źródło
2

Rubin: 89 znaków (w tym 1 dla -pprzełącznika)

Nie kopiowane Jan Dvorak „s rozwiązanie coffeescript , ale po wielu próbach mój kod zakończony patrząc jak dokładną kopią. Podświadomy głos prawdopodobnie szeptał „podążaj za białym królikiem Janem Dvorakiem”. Dlatego głosowanie za algorytmem powinno przejść do jego odpowiedzi.

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

Przykładowy przebieg:

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
człowiek w pracy
źródło
0

Lua, 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)))
mniip
źródło
Niezła próba, ale powinna też zachować interpunkcję: pastebin.com/X8QLf6fW
manatwork
EDYCJA: och, rozumiem teraz
mniip
-1

EcmaScript 6 (112 znaków)

Dane wejściowe znajdują się w s.

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

Na podstawie odpowiedzi @Jana Dorvaka.

Szczoteczka do zębów
źródło
-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;
    }

Zminimalizowane

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;}
drobnoustrój
źródło
Nie powinno tak być A-Za-z?
Cyoce
@Cyoce Mały szczegół: [A-z]nie jest [A-Za-z]. Pierwszy jest częstym błędem (?), Ponieważ zawiera znaki niealfabetyczne.
Erik the Outgolfer,
1
Czy nie powinno to być, hm, golfa?
Cyoce