Büyük harf veya noktalama işareti değiştirmeden kelimeleri tersine çevirme


13

Bir dizedeki her sözcüğü tersine çevirirken, noktalama işaretlerini ve büyük harfleri başlangıç ​​yerlerinde tutarken en düşük karakterli bir program oluşturun.

"Kelimelerin sırası" ile ifade etmek gerekirse, her kelimenin boş bir alana ("") bölündüğünü kastediyorum, bu nedenle kasılmalar ve bu tür kelimeler tek bir kelime olarak ele alınacaktır. Kasılmalardaki kesme işareti aynı yerde kalmalıdır. ("Yapma" => "Yapmam").

(Noktalama işaretleri az, AZ veya boşluk * olmayan karakterler anlamına gelir).

  • Büyük harflere sahip olamayacağınız için sayılar bu listeden çıkarıldı. Sayılar artık noktalama işareti olarak değerlendiriliyor.

Örneğin, giriş için:

Hello, I am a fish.

çıktı vermelidir:

Olleh, I ma a hsif.

İlk kelimedeki ilk harf olan O'nun şimdi sermaye olduğuna dikkat edin, çünkü H aynı yerde daha önce sermaye idi.

Virgül ve dönem de aynı yerdedir.

Daha fazla örnek:

This; Is Some Text!

çıktı

Siht; Si Emos Txet!

Herhangi bir dil kullanılabilir. En az karakter içeren program kazanır.


3
Kasılmalar nasıl tedavi edilmelidir? Bu Don't touch that!harita t'noD hcuot taht!veya harita noD't hcuot taht!mı?
dmckee --- eski moderatör kedi yavrusu

2
@dmckee "(Noktalama işaretleri az, AZ, 1-9 veya boşluk olmayan karakterler anlamına gelir)"
John Dvorak

1
@dmckee yani haritaya gerekirNod't hcuot tath!
John Dvorak

1
Her kelimeyi tersine çevirmek kolaydır. Her kelimeyi tersine çevirmek ve büyük harf kullanımını sürdürmek değildir.
John Dvorak

1
Evet, bu meydan okuma;) sadece onları tersine çevirmek çok basit olurdu ve muhtemelen kullanılan dile gelecektir. Bu sizi düşündürmek içindir.
nasonfish

Yanıtlar:


7

GolfScript, 58 54 48 karakter

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

Bu oldukça uzun bir GolfScript çözümüdür. Kodun çoğu aslında bir karakterin a-zA-Z'de olup olmadığını öğreniyor. Belki birisi bunu test etmenin daha kısa bir yolunu bulabilir.

Kodu çevrimiçi deneyebilirsiniz . Örnekler:

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

Bu çevrimiçi golfscript editörü faydalı görünüyor. Yer imi, teşekkürler
John Dvorak

Birini kaydetmek için " "içindeki finali çekebilirsiniz %. A-zA-Z'yi 11 karakter için test etmenin başka yollarını buldum, ancak henüz 10 için yok.
Peter Taylor

4

APL 69

Ekran girişini şununla alır: t ← ⍞

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

APL UTF-8 bayt olarak sayılmamalı mı? :-)
John Dvorak

@JanDvorak APL + Win V5 karakter kümesi tek bayttır. Karakterlerin doğru bir şekilde görüntülenmesi için buraya göndermek için UTF-8'e dönüştürmeliyim. Yukarıdaki tav⍳t, t vektöründeki karakterler için 0-255 arasındaki karakter kümesine bir dizin döndürür.
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 (kod golf amaçları için) javascript'in biraz daha yoğun bir versiyonudur. Üçlü operatörü yok, ancak javascriptten kaçıyor.

Javascript sürümü:

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

Girintili'ye:

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 ( -panahtar için 1 dahil )

Değil kopyalanan Jan Dvorak 'ın CoffeeScript çözümü , ancak birçok denemeden sonra benim kod tam bir kopyası gibi bakarak sona erdi. Bilinçaltı sesi muhtemelen “ beyaz tavşanı Jan Dvorak'ı takip et” diye fısıldamaya devam etti . Bu yüzden algoritma için oylar cevabına gitmelidir.

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

Örnek çalışma:

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

Güzel bir deneme, ama aynı zamanda noktalama işaretlerini yerinde tutmalı: pastebin.com/X8QLf6fW
manatwork

EDIT: oh i see now
mniip

-1

EcmaScript 6 (112 karakter)

Giriş sağlanır 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'ın cevabına dayanarak.


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

küçültülmüş

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

Olmamalı mı A-Za-z?
Cyoce

@Cyoce Biraz detay: [A-z]değil [A-Za-z]. Birincisi yaygın (?) Bir hata, çünkü alfabetik olmayan karakterler içeriyor.
Outgolfer Erik

1
Ayrıca bu olmamalı, erm, golfed?
Cyoce
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.