ความท้าทายที่พูดภาษาโยดานี่คือ


44

ความท้าทาย

ฉันคิดว่ามันค่อนข้างชัดเจนใช่ไหม คุณต้องสร้างฟังก์ชั่นหรือโปรแกรมที่รับสตริงเป็นอาร์กิวเมนต์และแสดงผลลัพธ์ของการพูด Yoda ที่สัมพันธ์กัน

นี่คือดังนั้นจำนวนไบต์ที่น้อยที่สุดจึงจะชนะ

การป้อนข้อมูล

อินพุตอาจเป็นสตริงใด ๆ ที่ไม่มี linefeed คุณสามารถแปลสตริงได้ถ้ามันประกอบด้วยดังนี้

Subject + Verb + อย่างอื่น

โดยที่Subjectเป็นคำสรรพนามส่วนตัว (ฉันคุณเธอเธอเราพวกเขา) คุณไม่จำเป็นต้องรู้ว่าคำที่สองเป็นคำกริยา

หากคำแรกไม่ใช่สรรพนามอินพุตจะใช้ได้ แต่เอาต์พุตจะเป็น Too difficult, this sentence is.

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

การป้อนข้อมูลสามารถลงท้ายด้วยตัวอักษร หรือ a! ไม่ใช่กับ?

นอกจากนี้สตริงสามารถมี Non-Ascii, วงเล็บ, เครื่องหมายจุลภาค, เครื่องหมายโคลอน ...

ผลลัพธ์

ในกรณีของประโยคที่แปลได้ผลลัพธ์จะเป็นประโยคเดียวกันโดยมีหัวเรื่องและคำกริยาที่ท้ายประโยค

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

เครื่องหมายจุลภาคระยะเวลาและตัวพิมพ์เล็กบนคำสรรพนามเป็นสิ่งจำเป็น (ยกเว้นแน่นอนถ้าสรรพนามคือฉัน)

ตามที่ระบุไว้ก่อนหน้านี้ถ้ามันไม่แปลว่าคุณต้องเอาท์พุทสตริง Too difficult, this sentence is.

ตัวอย่าง

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
จากมุมมองที่ไม่ใช่คำถามไม่ควรย้ายอนันต์ด้วยหรือไม่ ยกตัวอย่างเช่นที่ควรจะเป็นYou have to win this code challenge This code challenge, you have to win
Addison Crump

9
"ในการชนะการท้าทายรหัสนี้คุณมี" ฟังดูแปลกมาก
nicael

3
อินพุตสามารถมีเครื่องหมายจุลภาคหรือไม่ อะไรถ้าใส่ไม่ได้จบในจดหมายระยะเวลาหรือ!? เป็นสิ่งที่รับประกันได้ว่าจะไม่เกิดขึ้นหรือเราควรจัดการสิ่งนั้นและพิมพ์สิ่งเดียวกันกับที่ไม่มีสรรพนามชั้นนำ อินพุตสามารถมี linefeeds ได้หรือไม่ Apostrophes? ทวิภาค / วงเล็บ / backticks? ไม่ใช่อักขระ ASCII? คุณพูดว่า "อินพุตอาจเป็นสตริงใดก็ได้ " แต่กรณีทดสอบของคุณครอบคลุมเฉพาะสตริงประเภทที่เฉพาะเจาะจงเท่านั้น
Martin Ender

4
'to to' เป็นคำกริยาตัวช่วยสร้างที่แปลกประหลาดเป็นภาษาอังกฤษ มันไม่น่าเป็นไปได้ที่โยดาจะใช้มัน "ความท้าทายของรหัสนี้ชนะคุณต้องทำ" ในทางตรงกันข้ามโยดามีคำกริยาสำหรับผู้ช่วยของเขาเองซึ่งเขามักจะใช้: "รหัสนี้ท้าทายชนะเขาทำ ฉันนึกภาพไม่ออกโยดาว่า "ท้าทายรหัสนี้เขาชนะ" หรือ "ชนะรหัสท้าทายคุณมี"
LindaJeanne

4
คำตอบไม่ต้องการ 'Mmmmm มากกว่านี้ใช่ไหม
Steve Ives

คำตอบ:


17

Retina, 162 137 145 134 131 129

การจัดการเครื่องหมายวรรคตอนหลายตอนถูกต้องแล้ว กรณีทดสอบ:You will not win this challenge...! -> Not win this challenge..., you will.

ลองออนไลน์!

[.!]$

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.

รายละเอียด:

หากมีเครื่องหมายวรรคตอนในท้ายที่สุดให้ลบออก

[.!]$

^empty line

เปลี่ยนสรรพนามเป็นตัวเล็กยกเว้นมันคือ I

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

กรองบรรทัดใด ๆ ที่ไม่ตรงกัน <Pronoun><space><word><space><word>...

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

แยกออกเป็น,pronoun + verb remainderจากนั้นจัดเรียงใหม่

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

แปลงอักขระตัวแรกเป็นตัวพิมพ์ใหญ่

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

หากผลลัพธ์ว่างเปล่าจะไม่ผ่านตัวกรองด้านบน พิมพ์ข้อความผิดพลาด

^$
Too difficult, this sentence is.

คลาสของตัวละครในโหมดการถอดเสียงไม่ได้ใช้วงเล็บเหลี่ยม
Martin Ender

1
นอกจากนี้ยัง[^ ]อาจจะสามารถถูกแทนที่ด้วย\Sทุกที่และใน regex แรกสามารถถูกแทนที่ด้วย[^ ]+ .+ในคลาสตัวละครคุณไม่จำเป็นต้องหลบหนี.เพื่อให้[.!]ทำงานได้ดี นอกจากนี้เนื่องจากคุณไม่สลับลำดับ$1และ$2ในขั้นตอนที่สามคุณสามารถจับภาพเหล่านี้ไว้ในกลุ่มเดียวและบันทึกได้ 5 ไบต์
Martin Ender

([^I]|It)สามารถย่อให้เหลือ^\w\w
Martin Ender

ว้าวเป็นภาระของการปรับปรุง ขอบคุณ
Rainer P.

ฉันคิดว่าI|Itสามารถเป็นI?ได้ถ้า Retina รองรับนั้น
Conor O'Brien

7

ES6, 212

สิ่งนี้อาจทำให้ความสามารถในการเล่นกอล์ฟลดลงอีก:

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 (ต้องใช้เบราว์เซอร์ที่ทันสมัยเช่น Chrome) หรือเรียกใช้ผ่าน node.js

Ungolfed:

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

ทดสอบไม่ได้: I think they’ll add new features-> ส่งคืนThey, I think.ใน Google Chrome 47.0.2526.106 m I love constants like πนอกจากนี้ก็ไม่ชอบ หากต้องการเพิ่มสิ่งนั้นให้I made a fantastic code challenge (I hope)ส่งคืนA fantastic code challenge , I made.แทนA fantastic code challenge (I hope), I made.
Ismael Miguel

@IsmaelMiguel แก้ไข แต่ยังมี 3 ตัวอักษรน้อยลงเนื่องจากข้อผิดพลาดอื่นที่ฉันแก้ไข
Helco

แก้ไขปัญหาทั้งหมดแล้วการทดสอบทั้งหมดดูดี ทำได้ดี! คุณได้ upvote ของฉัน
Ismael Miguel

3
คุณต้องเพิ่ม^จุดเริ่มต้นของ regex ของคุณมิฉะนั้นประโยคที่มีข้อความใด ๆ ก่อนที่คำสรรพนามจะยังคงถูกแยกวิเคราะห์ว่าถูกต้อง
user81655

6

JavaScript (ES6), 164 ไบต์

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

คำอธิบาย

มันเกือบจะเจ็บปวดว่าจะต้องใช้ตัวอักษรตัวแรกของสตริงจำนวนเท่าใดใน 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."

ทดสอบ

การทดสอบไม่ได้ใช้การมอบหมายการทำลายโครงสร้างเพื่อให้สามารถใช้งานร่วมกับเบราว์เซอร์ได้มากขึ้น


162 chars: 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()}.: "ยากเกินไปประโยคนี้คือ"
เก่ง

@wally ขอบคุณ แต่โชคร้ายที่ regex จะทำให้Itการเข้าพักทุนและยังตรงกับแทนShey She
user81655

อ๊ะการทดสอบของฉันไม่เพียงพอ! ใช่ฉันเห็นว่าทำไม ...
เก่ง

3

Python ขนาด 261 ไบต์

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

ปรากฎว่า Python ไม่สนใจสิ่งต่าง ๆ อย่างb[-1]in".!"ถัดไปฉันจะเล่นกับวัตถุที่จับคู่ได้มากกว่านี้หากไม่มีใครเอาชนะฉันได้ :)


ฉันคิดว่าคุณสามารถลบพื้นที่ในb=b[:-1]ส่วน
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴขอบคุณ!
Robert Grant

3
คุณสามารถวางที่ท้ายบรรทัดกับที่b=b[:-1] ifคุณสามารถลบช่องว่างออกจากหลังการส่งคืนในบรรทัดสุดท้าย นี้จะแบ่งการทำงานร่วมกันโดยการแทนที่ python3 2 คันมีแท็บและ 3 กับแท็บและพื้นที่
undergroundmonorail

2

Python, 218 217 204 ไบต์

ไม่แน่ใจว่าจะสามารถลงสนามได้ต่อไปหรือไม่

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

Ungolfed:

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

คุณสามารถเปลี่ยนs.split(' ')ไปs.split()และ'I|We|You|He|She|It|They'.split('|')จะ'I We You He She It They'.split()เปลี่ยนif...elseกับรายการบูลเดียวกับที่ใช้ที่อื่น ๆ การเปลี่ยนแปลงt[0]inที่จะt[0]inเอา spawce รอบผลตอบแทน
สีฟ้า

1

GNU sed, 129 ไบต์

ฉันรวม +1 ไบต์สำหรับ-rธง

#!/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./

คำอธิบาย

หากเราจับคู่กับผู้นำIเราจะข้ามไปที่ป้ายกำกับ:

/^I /b

หากเราจับคู่หนึ่งสรรพนามอื่นเราย่อมันลงไปแล้วข้ามไปที่ป้ายกำกับ:

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

มิฉะนั้นเราจะพิมพ์ข้อความความล้มเหลวและย้ายไปที่บรรทัดอินพุตถัดไป:

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

หากเราข้ามไปที่ป้ายกำกับเราจะลบเครื่องหมายวรรคตอนสุดท้าย:

:
s/[.!]$//

และสลับสองคำแรกด้วยประโยคที่เหลือโดยใช้คำแรกเป็นตัวพิมพ์ใหญ่และเพิ่มเครื่องหมายวรรคตอนตามที่เราต้องการ:

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

โปรแกรมของคุณไม่ตรวจสอบว่าอินพุตประกอบด้วยคำอย่างน้อยสามคำ ประโยคเช่นYou arepass แรกและบรรทัดที่สอง แต่ไม่ตรงกันในที่สุดดังนั้นผลลัพธ์you areแทนที่จะเป็นข้อความแสดงข้อผิดพลาด เพิ่มเครื่องหมายเช่น...|They) \S+ \S/\L&/สองบรรทัดแรก
Rainer P.

@Rainer - ถูก (ฉันตำหนิการขาดกรณีทดสอบสำหรับอินพุตสั้น) ฉันจะดูวิธีการทำใหม่ในไม่ช้า
Toby Speight
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.