Membalikkan kata-kata tanpa mengubah huruf besar atau tanda baca


13

Buat program dengan jumlah karakter terendah untuk membalikkan setiap kata dalam string sambil menjaga urutan kata-kata, serta tanda baca dan huruf kapital, di tempat awalnya.

Dengan "Urutan kata-kata," Maksud saya setiap kata dibagi dengan ruang kosong (""), sehingga kontraksi dan semacamnya akan diperlakukan sebagai satu kata. Apostrof dalam kontraksi harus tetap di tempat yang sama. ("Don't" => "Tno'd").

(Tanda baca berarti karakter apa pun yang bukan az, AZ, atau spasi putih *).

  • Angka telah dihapus dari daftar ini karena Anda tidak dapat memiliki nomor modal. Angka sekarang diperlakukan sebagai tanda baca.

Misalnya, untuk input:

Hello, I am a fish.

seharusnya menghasilkan:

Olleh, I ma a hsif.

Perhatikan bahwa O, yang merupakan huruf pertama dalam kata pertama, sekarang menjadi huruf kapital, karena H adalah huruf kapital sebelumnya di lokasi yang sama.

Koma dan periode juga di tempat yang sama.

Lebih banyak contoh:

This; Is Some Text!

akan menghasilkan

Siht; Si Emos Txet!

Bahasa apa pun bisa digunakan. Program dengan jumlah karakter terendah akan menang.


3
Bagaimana seharusnya kontraksi diperlakukan? Apakah itu Don't touch that!peta ke t'noD hcuot taht!atau ke noD't hcuot taht!?
dmckee --- ex-moderator kitten

2
@dmckee "(Tanda baca berarti karakter apa pun yang bukan az, AZ, 1-9 atau spasi putih)"
John Dvorak

1
@dmckee jadi harus memetakan keNod't hcuot tath!
John Dvorak

1
Membalik setiap kata itu mudah. Membalik setiap kata dan mempertahankan kapitalisasi tidak.
John Dvorak

1
Yup, itu tantangannya;) hanya membalikkannya akan terlalu sederhana dan kemungkinan akan mengarah ke bahasa yang digunakan. Ini dimaksudkan untuk membuat Anda berpikir.
nasonfish

Jawaban:


7

GolfScript, 58 54 48 karakter

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

Ini adalah solusi GolfScript yang menjadi agak panjang. Banyak kode yang benar-benar mencari tahu apakah sebuah karakter ada di a-zA-Z. Mungkin seseorang dapat menemukan cara yang lebih pendek untuk mengujinya.

Anda dapat mencoba kodenya secara online . Contoh:

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

Editor golfscript online itu terlihat berguna. Bookmark, terima kasih
John Dvorak

Anda dapat menarik bagian " "dalam %untuk menyimpannya. Saya telah menemukan cara lain untuk menguji a-zA-Z untuk 11 karakter, tetapi belum ada untuk 10.
Peter Taylor

4

APL 69

Mengambil input layar melalui: t ← ⍞

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

Bukankah seharusnya APL dihitung dalam UTF-8 byte? :-)
John Dvorak

@JanDvorak Rangkaian karakter APL + Win V5 adalah byte tunggal. Saya harus mengonversi ke UTF-8 untuk mengirim di sini agar karakter dapat ditampilkan dengan benar. ⎕av⍳t di atas mengembalikan indeks ke set karakter dari 0-255 untuk karakter dalam vektor t.
Graham

4

Coffeescript, 134 133 karakter

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 adalah (untuk keperluan kode golf) versi javascript yang sedikit lebih padat. Itu tidak memiliki operator ternary, tetapi memiliki pelarian ke javascript.

Inilah versi javascript:

Javascript, 152 151 karakter

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

Bertakuk:

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 karakter (termasuk 1 untuk -psakelar)

Tidak disalin Jan Dvorak 's CoffeeScript solusi , tapi setelah banyak usaha kode saya berakhir tampak seperti salinan. Suara bawah sadar mungkin terus berbisik "ikuti kelinci putih Jan Dvorak". Jadi upvotes untuk algoritme harus masuk ke jawabannya.

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

Contoh dijalankan:

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


EDIT: oh saya mengerti sekarang
mniip

-1

EcmaScript 6 (112 karakter)

Masukan disediakan di s.

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

Berdasarkan jawaban @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;
    }

Diperkecil

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

Bukankah seharusnya begitu A-Za-z?
Cyoce

@Cyoce Sedikit detail: [A-z]tidak [A-Za-z]. Yang pertama adalah kesalahan umum (?), Karena mengandung karakter non-alfabet.
Erik the Outgolfer

1
Bukankah ini seharusnya, erm, bermain golf?
Cyoce
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.