Invertire le parole senza cambiare maiuscole o punteggiatura


13

Crea un programma con il minor numero di caratteri per invertire ciascuna parola in una stringa mantenendo l'ordine delle parole, nonché la punteggiatura e le lettere maiuscole, nella loro posizione iniziale.

Per "Ordine delle parole" intendo che ogni parola è divisa da uno spazio vuoto (""), quindi le contrazioni e simili saranno trattate come una parola. L'apostrofo nelle contrazioni dovrebbe rimanere nello stesso posto. ("Don't" => "Tno'd").

(Punteggiatura indica tutti i caratteri che non sono az, AZ o spazi bianchi *).

  • I numeri sono stati rimossi da questo elenco a causa del fatto che non è possibile avere numeri maiuscoli. I numeri sono ora trattati come punteggiatura.

Ad esempio, per l'input:

Hello, I am a fish.

dovrebbe produrre:

Olleh, I ma a hsif.

Si noti che O, che è la prima lettera della prima parola, è ora maiuscola, poiché H era maiuscola prima nella stessa posizione.

Anche la virgola e il punto sono nello stesso posto.

Altri esempi:

This; Is Some Text!

sarebbe uscita

Siht; Si Emos Txet!

È possibile utilizzare qualsiasi lingua. Vince il programma con il minor numero di personaggi.


3
Come devono essere trattate le contrazioni? Questo è Don't touch that!mappare t'noD hcuot taht!o fare noD't hcuot taht!?
dmckee --- ex gattino moderatore

2
@dmckee "(Punteggiatura indica caratteri che non sono az, AZ, 1-9 o spazi bianchi)"
John Dvorak

1
@dmckee quindi dovrebbe essere mappato aNod't hcuot tath!
John Dvorak il

1
Invertire ogni parola è facile. Invertire ogni parola e mantenere la maiuscola non lo è.
John Dvorak,

1
Sì, questa è la sfida;) semplicemente invertirli sarebbe troppo semplice e probabilmente verrebbe giù al linguaggio usato. Questo è pensato per farti pensare.
nasonfish

Risposte:


7

GolfScript, 58 54 48 caratteri

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

Questa è una soluzione GolfScript che è diventata piuttosto lunga. Molto del codice sta effettivamente scoprendo se un personaggio è in a-zA-Z. Forse qualcuno può trovare un modo ancora più breve di testarlo.

Puoi provare il codice online . Esempi:

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

Quell'editor di golfscript online sembra utile. Aggiungi ai segnalibri, grazie
John Dvorak,

Puoi tirare il finale " "dentro %per salvarne uno. Ho trovato altri modi per testare a-zA-Z per 11 caratteri, ma nessuno ancora per 10.
Peter Taylor

4

69 APL

Accetta l'immissione dello schermo tramite: t ← ⍞

⎕av[1↓∊(↑¨v),¨((¯1×⌽¨z)+z←¯32×~1↓¨v>97)+¨⌽¨1↓¨v←(+\v<66)⊂v←0,⎕av⍳t←⍞]

L'APL non dovrebbe essere conteggiato in byte UTF-8? :-)
John Dvorak

@JanDvorak Il set di caratteri APL + Win V5 è a byte singolo. Devo convertire in UTF-8 per postare qui affinché i personaggi vengano visualizzati correttamente. Aboveav⍳t sopra restituisce un indice nel set di caratteri da 0 a 255 per i caratteri nel vettore t.
Graham,

4

CoffeeScript, 134 133 caratteri

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 è (ai fini del code golf) una versione leggermente più densa di javascript. Non ha l'operatore ternario, ma ha una via di fuga a javascript.

Ecco la versione javascript:

Javascript, 152 151 caratteri

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

rientrato:

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

Rubino: 89 caratteri (di cui 1 per l' -pinterruttore)

Non ho copiato la soluzione CoffeeScript di Jan Dvorak , ma dopo molti tentativi il mio codice ha finito per sembrare una copia esatta. Una voce inconscia probabilmente continuava a sussurrare "segui il coniglio bianco Jan Dvorak". Quindi i voti per l'algoritmo dovrebbero andare alla sua risposta.

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

Esecuzione di esempio:

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

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

Bel tentativo, ma dovrebbe anche mantenere la punteggiatura in atto: pastebin.com/X8QLf6fW
manatwork

EDIT: oh vedo ora
mniip

-1

EcmaScript 6 (112 caratteri)

L'ingresso è fornito in s.

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

Basato sulla risposta di @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;
    }

minified

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;}

Non dovrebbe essere A-Za-z?
Cyoce,

@Cyoce Un piccolo dettaglio: [A-z]non lo è [A-Za-z]. Il primo è un errore comune (?), Perché contiene caratteri non alfabetici.
Erik the Outgolfer,

1
Inoltre, questo non dovrebbe essere, erm, golfato?
Cyoce,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.