Một thách thức nói tiếng Yoda, đây là


44

Các thách thức

Chà, tôi nghĩ nó khá rõ ràng phải không? Bạn phải tạo một hàm hoặc một chương trình lấy một chuỗi làm đối số và đưa ra lời nói Yoda không chính xác.

Đây là , vì vậy số byte ít nhất sẽ thắng.

Đầu vào

Đầu vào có thể là bất kỳ chuỗi nào không có linefeed. Bạn có thể dịch một chuỗi nếu nó được sáng tác như thế này:

Chủ ngữ + Động từ + Cái gì khác.

Trong đó Chủ ngữ là một đại từ nhân xưng (Tôi, bạn, anh ấy, cô ấy, nó, chúng tôi, họ). Bạn không cần phải nhận ra rằng từ thứ hai là một động từ.

Nếu từ đầu tiên không phải là đại từ, đầu vào hợp lệ nhưng đầu ra sẽ là Too difficult, this sentence is.

You have to win this code challenge -> Translatable
Luke has to win this code challenge -> Untranslatable

Đầu vào có thể kết thúc bằng một chữ cái, a. hoặc a !, không phải với a ?.

Hơn nữa, các chuỗi có thể chứa Non-Ascii, Dấu ngoặc đơn, dấu phẩy, dấu hai chấm ...

Đầu ra

Trong trường hợp một câu có thể dịch, đầu ra là cùng một câu, với chủ ngữ và động từ ở cuối câu.

You have to win this code challenge -> To win this code challenge, you have.

Dấu phẩy, dấu chấm và chữ thường trong đại từ là bắt buộc. (Tất nhiên, ngoại trừ, nếu đại từ là I).

Như đã nói trước đây, nếu không thể dịch được, bạn phải xuất chuỗi Too difficult, this sentence is.

Ví dụ

You have to win this code challenge -> To win this code challenge, you have.
He won this code challenge -> This code challenge, he won.  (I know this is not yoda-speaking, but I don’t want to overcomplicate this challenge)
I ate an ice cream earlier! -> An ice cream earlier, I ate.
I liked the Star Wars original trilogy more than the prequel’s one. -> The Star Wars original trilogy more than the prequel’s one, I liked.
I find your lack of faith disturbing -> Your lack of faith disturbing, I find.
I think we are done with the examples -> We are done with examples, I think.
He is your son, Vader -> Your son, Vader, he is.
I think they’ll add new features -> They’ll add new features, I think.
I made a fantastic code challenge (I hope) -> A fantastic code challenge (I hope), I made.
I love constants like π -> Constants like π, I love.

I’ll be the next President, I swear! -> Too difficult, this sentence is.
This challenge is great! -> Too difficult, this sentence is.
Is this challenge great? -> Too difficult, this sentence is.
Luke is not ready for this task -> Too difficult, this sentence is.
Somebody loves constants like π -> Too difficult, this sentence is.
[Empty string] -> Too difficult, this sentence is.

9
Từ quan điểm không phải câu hỏi, không nên di chuyển quá? Ví dụ, You have to win this code challengenên được This code challenge, you have to win.
Addison Crump

9
"Để chiến thắng thử thách mã này, bạn có." Nghe thật lạ.
nicael

3
Đầu vào có thể chứa dấu phẩy không? Điều gì xảy ra nếu đầu vào không kết thúc bằng một chữ cái, dấu chấm hoặc !? Điều đó có được đảm bảo không xảy ra hay chúng ta nên xử lý điều đó và in điều tương tự như khi không có đại từ hàng đầu. Đầu vào có thể chứa các nguồn cấp dữ liệu không? Tông đồ? Dấu hai chấm / dấu ngoặc đơn / backticks? Ký tự không phải ASCII? Bạn nói "đầu vào có thể là bất kỳ chuỗi nào ", nhưng các trường hợp thử nghiệm của bạn chỉ bao gồm các loại chuỗi rất cụ thể.
Martin Ender

4
'phải' là một đặc điểm xây dựng động từ trợ giúp kỳ lạ đối với tiếng Anh; Yoda không thể sử dụng nó. "Thử thách mã này, giành chiến thắng, bạn phải." Mặt khác, Yoda có các cấu trúc động từ trợ giúp riêng mà anh ta có xu hướng sử dụng: "Thử thách mã này, đã thắng, anh ta đã làm". Tôi không thể hình dung Yoda nói "Thử thách mã này, anh ấy đã thắng" hoặc "để chiến thắng thử thách mã này, bạn có".
LindaJeanne

4
Không phải câu trả lời cần nhiều hơn 'Mmmmm?
Steve Ives

Câu trả lời:


17

Võng mạc, 162 137 145 134 131 129

Nhiều dấu chấm câu được xử lý chính xác. Trường hợp thử nghiệm:You will not win this challenge...! -> Not win this challenge..., you will.

Hãy thử trực tuyến!

[.!]$

T`A-Z`a-z`^\w\w
G`^(I|we|you|s?he|it|they) \S+ \S
(\S+ \S+) (.*)
$2, $1.
T`a-z`A-Z`^.
^$
Too difficult, this sentence is.

Sự miêu tả:

Nếu cuối cùng có dấu chấm câu, hãy xóa nó.

[.!]$

^empty line

Chuyển đổi đại từ sang chữ thường, ngoại trừ nó là I.

T`A-Z`a-z`^\w\w

Lọc ra bất kỳ dòng nào không khớp <Pronoun><space><word><space><word>...

G`^(I|we|you|s?he|it|they) \S+ \S

Chia thành pronoun + verb, remainder. Sau đó sắp xếp lại.

(\S+ \S+) (.*)
$2, $1.

Chuyển đổi ký tự đầu tiên thành chữ hoa

T`a-z`A-Z`^.

Nếu kết quả trống, nó không vượt qua bộ lọc ở trên. In một thông báo lỗi.

^$
Too difficult, this sentence is.

Các lớp ký tự trong chế độ chuyển ngữ không sử dụng dấu ngoặc vuông.
Martin Ender

1
Ngoài ra, [^ ]có thể được thay thế bằng \Smọi nơi, và trong regex đầu tiên [^ ]+có thể được thay thế bằng .+. Trong các lớp nhân vật bạn không cần phải thoát .nên [.!]hoạt động tốt. Ngoài ra, vì bạn không trao đổi thứ tự $1$2trong giai đoạn thứ ba, bạn có thể nắm bắt chúng thành một nhóm duy nhất và lưu 5 byte.
Martin Ender

([^I]|It)có thể rút ngắn thành^\w\w
Martin Ender

Wow, thật là một loạt các cải tiến. Cảm ơn.
Rainer P.

Tôi nghĩ I|Itcó thể trở thành I?, nếu Retina ủng hộ điều đó
Conor O'Brien

7

ES6, 212

Điều này có thể có thể thêm một chút golf xuống:

i=>(r=/(you|s?he|it?|we|they)( \S+) ([^\.!?]+)/i.exec(i))?(c=(a,b)=>a[`to${['Low','Upp'][b]}erCase`]())(r[3].slice(0,1),1)+r[3].slice(1)+", "+c(r[1],+(/i/i.test(r[1])))+r[2]+".":"Too difficult, this sentence is."

JSFiddle (yêu cầu trình duyệt cập nhật như Chrome) hoặc chạy nó thông qua node.js

Ung dung:

i=>{
    r=/(you|s?he|it?|we|they)( \S+) ([^\.!?]+)/i.exec(i); //Main RegExp
    c=(a,b)=>a[`to${['Low','Upp'][b]}erCase`](); //shortcut for toUpperCase/toLowerCase
    if (r)
        return c(r[3].slice(0,1),1)+r[3].slice(1) + ", " //the "something else", properly formated
             + c(r[1], +(/i/i.test(r[1]))) //The subject lowercased except for "i" or "I"
             + r[2] + "."; //The End
    else //no match, no sentence to translate
        return "Too difficult, this sentence is.";
}

Kiểm tra bị hỏng: I think they’ll add new features-> trả về They, I think.trên Google Chrome 47.0.2526.106 m. Ngoài ra, nó không thích I love constants like π. Để thêm vào đó, I made a fantastic code challenge (I hope)trả về A fantastic code challenge , I made.thay vìA fantastic code challenge (I hope), I made.
Ismael Miguel

@IsmaelMiguel Đã sửa, nhưng thậm chí còn ít hơn 3 ký tự do một lỗi khác tôi cũng đã sửa
Helco

Nó giải quyết tất cả các vấn đề, tất cả các bài kiểm tra có vẻ tốt. Làm tốt! Bạn có upvote của tôi.
Ismael Miguel

3
Bạn cần thêm ^vào đầu regex của mình nếu không một câu với bất kỳ văn bản nào trước đại từ sẽ vẫn được phân tích cú pháp là hợp lệ.
dùng81655

6

JavaScript (ES6), 164 byte

s=>([,p,,i,r]=s.match`^(((I)|You|He|She|It|We|They) \\S+) (.*?)[.!]?$`)?r[0].toUpperCase()+r.slice(1)+`, ${i?p:p.toLowerCase()}.`:"Too difficult, this sentence is."

Giải trình

Thật đau đớn khi có bao nhiêu byte viết hoa chữ cái đầu tiên của chuỗi trong JavaScript ...

s=>

  // Match and get specific parts of the input string
  ([,p,,i,r]=s.match`^(((I)|You|He|She|It|We|They) \\S+) (.*?)[.!]?$`)?

    r[0].toUpperCase()+r.slice(1)     // capitalise first letter
      +`, ${i?p:p.toLowerCase()}.`    // lower-case the pronoun (unless it is I)
  :"Too difficult, this sentence is."

Kiểm tra

Kiểm tra không sử dụng phân công hủy để làm cho nó tương thích nhiều trình duyệt hơn.


162 ký tự: var Solution = s => (p = s.match ^(((It?)|You|[HW]e|[ST]hey) \\S+) (.*?)[.!]?$)? P [4] [0] .toUpperCase () + p [4] .slice (1) + , ${p[3]?p[1]:p[1].toLowerCase()}.: "Quá khó, câu này là."
wally

@wally Cảm ơn, nhưng thật không may rằng regex sẽ làm cho Itviết hoa và cũng phù hợp Sheythay vì She.
dùng81655

Ah, thử nghiệm của tôi là không đủ! Vâng, tôi có thể thấy tại sao ... Ah tốt.
wally

3

Python, 261 byte

import re
def a(b):
 if b[-1:]in".!":
  b=b[:-1]
 if re.match('(I|YOU|S?HE|IT|WE|THEY) \w+ \S+',b.upper()):
  b=(b+',').split()
  if b[0]!="I":
   b[0]=b[0].lower()
  b=" ".join(b[2:]+b[:2])
  return b[0].upper()+b[1:]
 return "Too difficult, this sentence is."

Hóa ra Python không bận tâm đến những thứ như b[-1]in".!"Tiếp theo tôi sẽ chơi với đối tượng phù hợp hơn, nếu không ai đánh bại tôi với nó :)


Tôi nghĩ bạn có thể loại bỏ một khoảng trống trong b=b[:-1]phần này.
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ cảm ơn!
Robert Grant

3
bạn có thể đặt b=b[:-1]ở cuối dòng với if. bạn có thể xóa khoảng trắng từ sau khi hoàn trả dòng cuối cùng. điều này sẽ phá vỡ khả năng tương thích python3 bằng cách thay thế 2 khoảng trắng bằng một tab và 3 bằng một tab và một khoảng trắng
ngầm trong

2

Python, 218 217 204 byte

Không chắc chắn nếu điều này có thể được tiếp tục xuống golf.

def f(s):t=s.split();u=' '.join(t[2:]).rstrip('!.');return['Too difficult, this sentence is.','%s, %s %s.'%(u[0].upper()+u[1:],['I',t[0].lower()][t[0]!='I'],t[1])][t[0]in'I We You He She It They'.split()]

Ung dung:

def f(s):
    t = s.split()
    u = ' '.join(t[2:]).rstrip('!.')
    return [
        'Too difficult, this sentence is.',
        '%s, %s %s.' % (u[0].upper() + u[1:],
                        ['I', t[0].lower()][t[0] != 'I'],
                        t[1])
    ][t[0] in 'I We You He She It They'.split()]

bạn có thể thay đổi s.split(' ')để s.split()'I|We|You|He|She|It|They'.split('|')để 'I We You He She It They'.split(), thay thế if...elsevới cùng một danh sách boolean sử dụng ở những nơi khác, thay đổi t[0]inđể t[0]in, loại bỏ các spawce xung quanh sự trở lại
xanh

1

GNU sed, 129 byte

Tôi đang bao gồm +1 byte cho -rcờ.

#!/bin/sed -rf

/^I /b
s/^(You|[HW]e|She|It|They) /\L&/
t
s/.*/Too difficult, this sentence is./p
d
:
s/[.!]$//
s/^([^ ]+ [^ ]+) (.*)/\u\2, \1./

Giải trình

Nếu chúng tôi phù hợp với một hàng đầu, Ichúng tôi nhảy đến nhãn:

/^I /b

Nếu chúng ta ghép một trong những đại từ khác, chúng ta viết thường nó, sau đó nhảy đến nhãn:

s/^(You|[HW]e|She|It|They) /\L&/
t

Nếu không, chúng tôi in thông báo lỗi và chuyển sang dòng đầu vào tiếp theo:

s/.*/Too difficult, this sentence is./p
d

Nếu chúng tôi nhảy đến nhãn, chúng tôi sẽ xóa bất kỳ dấu chấm câu cuối cùng:

:
s/[.!]$//

và hoán đổi hai từ đầu tiên với phần còn lại của câu, viết hoa từ đầu tiên mới và thêm dấu câu cần thiết khi chúng ta làm như vậy:

s/^([^ ]+ [^ ]+) (.*)/\u\2, \1./

Chương trình của bạn không kiểm tra xem đầu vào có bao gồm ít nhất ba từ hay không. Các câu như You arevượt qua dòng đầu tiên và dòng thứ hai nhưng không khớp với dòng cuối cùng, vì vậy đầu ra you arethay vì thông báo lỗi. Thêm một kiểm tra như ...|They) \S+ \S/\L&/hai dòng đầu tiên.
Rainer P.

@Rainer - Bạn nói đúng (Tôi đổ lỗi cho việc thiếu các trường hợp thử nghiệm cho các đầu vào ngắn). Tôi sẽ xem xét làm thế nào để làm lại điều này sớm.
Toby Speight
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.