Đảo ngược từ mà không thay đổi chữ hoa hoặc dấu câu


13

Tạo một chương trình có số lượng ký tự thấp nhất để đảo ngược từng từ trong một chuỗi trong khi vẫn giữ thứ tự của các từ, cũng như dấu câu và chữ in hoa, ở vị trí ban đầu.

Theo "Thứ tự của các từ", ý tôi là mỗi từ được chia cho một khoảng trống (""), do đó các cơn co thắt và như vậy sẽ được coi là một từ. Dấu nháy đơn trong các cơn co thắt phải ở cùng một chỗ. ("Đừng" => "Tno'd").

(Dấu câu có nghĩa là bất kỳ ký tự nào không phải là az, AZ hoặc khoảng trắng *).

  • Các số đã bị xóa khỏi danh sách này do thực tế là bạn không thể có số vốn. Số bây giờ được coi là dấu chấm câu.

Ví dụ: đối với đầu vào:

Hello, I am a fish.

cần xuất ra:

Olleh, I ma a hsif.

Lưu ý rằng O, là chữ cái đầu tiên trong từ đầu tiên, bây giờ là vốn, vì H là vốn trước đây ở cùng một vị trí.

Dấu phẩy và dấu chấm cũng ở cùng một chỗ.

Ví dụ khác:

This; Is Some Text!

sẽ xuất

Siht; Si Emos Txet!

Bất kỳ ngôn ngữ có thể được sử dụng. Chương trình có số lượng nhân vật thấp nhất sẽ thắng.


3
Nên điều trị các cơn co thắt như thế nào? Đó là Don't touch that!bản đồ đến t'noD hcuot taht!hay noD't hcuot taht!?
dmckee --- ex-moderator mèo con

2
@dmckee "(Dấu câu có nghĩa là bất kỳ ký tự nào không phải là az, AZ, 1-9 hoặc khoảng trắng)"
John Dvorak

1
@dmckee vì vậy nó nên ánh xạ tớiNod't hcuot tath!
John Dvorak

1
Đảo ngược từng từ là dễ dàng. Đảo ngược từng từ và giữ viết hoa là không.
John Dvorak

1
Yup, đó là thách thức;) chỉ đơn giản là đảo ngược chúng sẽ quá đơn giản và có khả năng sẽ đi xuống ngôn ngữ được sử dụng. Điều này có nghĩa là làm cho bạn suy nghĩ.
cá mũi

Câu trả lời:


7

GolfScript, 58 54 48 ký tự

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

Đây là một giải pháp GolfScript trở nên khá dài. Rất nhiều mã thực sự đang tìm hiểu xem một ký tự có trong a-zA-Z hay không. Có lẽ ai đó có thể tìm thấy một cách thậm chí ngắn hơn để thử nghiệm nó.

Bạn có thể thử mã trực tuyến . Ví dụ:

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

Đó là trình soạn thảo golfscript trực tuyến có vẻ hữu ích. Đánh dấu trang, cảm ơn
John Dvorak

Bạn có thể kéo trận chung kết " "bên trong %để lưu một. Tôi đã tìm thấy các cách khác để kiểm tra a-zA-Z trong 11 ký tự, nhưng chưa có cách nào cho 10.
Peter Taylor

4

APL 69

Đưa đầu vào màn hình qua: t ←

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

APL không nên được tính bằng byte UTF-8? :-)
John Dvorak

@JanDvorak Bộ ký tự APL + Win V5 là byte đơn. Tôi phải chuyển đổi sang UTF-8 để đăng ở đây để các ký tự hiển thị chính xác. ⎕av⍳t ở trên trả về một chỉ mục vào bộ ký tự từ 0-255 cho các ký tự trong vectơ t.
Graham

4

Bản thảo 134 133 ký tự

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 là (cho các mục đích của mã golf) một phiên bản javascript dày hơn một chút. Nó không có toán tử ternary, nhưng nó có một lối thoát cho javascript.

Đây là phiên bản javascript:

Javascript, 152 151 ký tự

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

Thụt lề:

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 ký tự (bao gồm 1 cho -pchuyển đổi)

Không sao chép giải pháp CoffeeScript của Jan Dvorak , nhưng sau nhiều lần thử, mã của tôi đã kết thúc giống như một bản sao chính xác. Một giọng nói trong tiềm thức có lẽ không ngừng thì thầm theo con thỏ trắng Jan Dvorakiến. Vì vậy, upvote cho thuật toán nên đi đến câu trả lời của mình.

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

Chạy mẫu:

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

Cố

EDIT: oh tôi thấy ngay bây giờ
mniip

-1

EcmaScript 6 (112 ký tự)

Các đầu vào được cung cấp trong s.

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

Dựa trên câu trả lời của @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;
    }

Giảm thiểu

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

Có nên không A-Za-z?
Cyoce

@Cyoce Một chi tiết nhỏ: [A-z]không phải [A-Za-z]. Lỗi đầu tiên là một lỗi phổ biến (?), Vì nó chứa các ký tự không phải là chữ cái.
Erik the Outgolfer

1
Cũng không nên điều này, erm, chơi golf?
Cyoce
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.