Tantangan berbahasa Yoda, ini


44

Tantangan

Yah, saya pikir itu cukup jelas, bukan? Anda harus membuat fungsi atau program yang menggunakan string sebagai argumen dan menampilkan Yoda yang bisa berbicara.

Ini adalah , jadi paling tidak jumlah byte yang menang.

Input

Input bisa berupa string apa saja tanpa linefeed. Anda dapat menerjemahkan string jika disusun seperti ini:

Subjek + Kata Kerja + Sesuatu yang lain.

Di mana Subjek adalah kata ganti orang (saya, kamu, dia, dia, itu, kita, mereka). Anda tidak harus mengenali bahwa kata kedua adalah kata kerja.

Jika kata pertama bukan kata ganti, input tersebut valid tetapi hasilnya akan menjadi Too difficult, this sentence is.

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

Input dapat diakhiri dengan huruf, a. atau a!, bukan dengan a?

Selanjutnya, string dapat berisi Non-Ascii, Parenthesis, koma, titik dua ...

Hasil

Dalam kasus kalimat yang dapat diterjemahkan, keluarannya adalah kalimat yang sama, dengan subjek dan kata kerja di akhir kalimat.

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

Koma, titik, dan huruf kecil pada kata ganti adalah wajib. (Kecuali, tentu saja, jika kata ganti adalah aku).

Seperti yang dinyatakan sebelumnya, jika tidak dapat diterjemahkan Anda harus menampilkan string Too difficult, this sentence is.

Contohnya

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
Dari sudut pandang non-pertanyaan, bukankah infinitif juga harus dipindahkan? Misalnya, You have to win this code challengeseharusnya This code challenge, you have to win.
Addison Crump

9
"Untuk memenangkan tantangan kode ini, kamu harus." terdengar sangat aneh.
nicael

3
Bisakah input mengandung koma? Bagaimana jika input tidak diakhiri dengan huruf, titik, atau !? Apakah itu dijamin tidak akan terjadi atau haruskah kita menanganinya dan mencetak hal yang sama seperti ketika tidak ada kata ganti utama. Bisakah input berisi umpan baris? Apostrof? Colon / tanda kurung / backticks? Karakter non-ASCII? Anda mengatakan "input bisa berupa string apa saja ", tetapi kotak uji Anda hanya mencakup jenis string yang sangat spesifik.
Martin Ender

4
'have to' adalah konstruksi kata kerja pembantu yang aneh dengan bahasa Inggris; tidak mungkin Yoda akan menggunakannya. "Kode ini menantang, menang, kamu harus." Di sisi lain, Yoda memiliki konstruksi kata kerja penolong sendiri yang cenderung ia gunakan: "Kode ini menantang, menang, memang." Saya tidak bisa membayangkan Yoda mengatakan "Ini tantangan kode, dia menang" atau "untuk memenangkan tantangan kode ini, Anda harus".
LindaJeanne

4
Bukankah jawabannya membutuhkan lebih banyak 'Mmmmm?
Steve Ives

Jawaban:


17

Retina, 162 137 145 134 131 129

Banyak tanda baca sekarang ditangani dengan benar. Kasus cobaan:You will not win this challenge...! -> Not win this challenge..., you will.

Cobalah secara Online!

[.!]$

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.

Deskripsi:

Jika ada tanda baca pada akhirnya, hapus itu.

[.!]$

^empty line

Ubah kata ganti menjadi huruf kecil, kecuali I.

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

Saring semua saluran yang tidak cocok <Pronoun><space><word><space><word>...

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

Dibagi menjadi pronoun + verb, remainder. Kemudian atur ulang.

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

Ubah karakter pertama menjadi huruf besar.

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

Jika hasilnya kosong, itu tidak melewati filter di atas. Cetak pesan kesalahan.

^$
Too difficult, this sentence is.

Kelas karakter dalam mode transliterasi tidak menggunakan tanda kurung.
Martin Ender

1
Juga, [^ ]mungkin bisa diganti dengan di \Smana - mana, dan di regex pertama [^ ]+bisa diganti dengan .+. Di kelas karakter Anda tidak perlu melarikan diri .jadi [.!]berfungsi dengan baik. Juga, karena Anda tidak menukar urutan $1dan $2pada tahap ketiga, Anda dapat menangkapnya menjadi satu kelompok dan menyimpan 5 byte.
Martin Ender

([^I]|It)dapat disingkat menjadi^\w\w
Martin Ender

Wow, sungguh banyak perbaikan. Terima kasih.
Rainer P.

Saya pikir I|Itbisa menjadi I?, jika Retina mendukung itu
Conor O'Brien

7

ES6, 212

Ini mungkin bisa sedikit lebih jauh turun:

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 (membutuhkan browser terbaru seperti Chrome) atau menjalankannya melalui node.js

Tidak Disatukan:

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

Tes rusak: I think they’ll add new features-> kembali They, I think.di Google Chrome 47.0.2526.106 m. Juga, itu tidak suka I love constants like π. Untuk menambahkan itu, I made a fantastic code challenge (I hope)kembali A fantastic code challenge , I made.bukanA fantastic code challenge (I hope), I made.
Ismael Miguel

@IsmaelMiguel Tetap, tetapi bahkan mendapat 3 karakter lebih sedikit karena bug lain yang juga saya perbaiki
Helco

Ini menyelesaikan semua masalah, semua tes tampak baik-baik saja. Sudah selesai dilakukan dengan baik! Anda mendapat upvote saya.
Ismael Miguel

3
Anda harus menambahkan ^ke awal regex Anda jika tidak kalimat dengan teks apa pun sebelum kata ganti masih akan diuraikan sebagai valid.
user81655

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

Penjelasan

Hampir menyakitkan berapa banyak byte yang menggunakan huruf kapital dari huruf pertama dalam 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."

Uji

Tes tidak menggunakan tugas penataan untuk membuatnya lebih kompatibel lintas-browser.


162 karakter: 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()}.: "Terlalu sulit, kalimat ini adalah."
Wally

@wally Terima kasih, tapi sayangnya itu regex akan membuat Ittinggal dikapitalisasi dan juga cocok Sheybukan She.
user81655

Ah, pengujian saya tidak cukup! Ya saya bisa melihat mengapa ... Ah, baiklah.
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."

Ternyata Python tidak keberatan hal-hal seperti b[-1]in".!"Selanjutnya saya akan bermain dengan objek pertandingan lebih banyak, jika tidak ada yang mengalahkan saya untuk itu :)


Saya pikir Anda dapat menghapus ruang di b=b[:-1]bagian itu.
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ terima kasih!
Robert Grant

3
Anda dapat menempatkan b=b[:-1]di akhir baris dengan if. Anda dapat menghapus spasi dari setelah kembali pada baris terakhir. ini akan merusak kompatibilitas python3 dengan mengganti 2 spasi dengan tab dan 3 dengan tab dan spasi
undergroundmonorail

2

Python, 218 217 204 byte

Tidak yakin apakah ini bisa diturunkan lebih lanjut.

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

Tidak Disatukan:

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

Anda dapat mengubah s.split(' ')ke s.split()dan 'I|We|You|He|She|It|They'.split('|')untuk 'I We You He She It They'.split(), mengganti if...elsedengan daftar boolean yang sama yang digunakan di tempat lain, mengubah t[0]inke t[0]in, menghapus lubang di sekitar pengembalian
Biru

1

GNU sed, 129 byte

Saya menyertakan +1 byte untuk -rbendera.

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

Penjelasan

Jika kami cocok dengan pemimpin Ikami melompat ke label:

/^I /b

Jika kami mencocokkan salah satu kata ganti lainnya, kami menurunkannya, lalu melompat ke label:

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

Kalau tidak, kita mencetak pesan kegagalan dan pindah ke jalur input berikutnya:

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

Jika kami melompat ke label, kami menghapus tanda baca terakhir:

:
s/[.!]$//

dan menukar dua kata pertama dengan sisa kalimat, menggunakan huruf besar kata pertama yang baru dan menambahkan tanda baca yang diperlukan saat kita melakukannya:

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

Program Anda tidak memeriksa apakah input terdiri dari setidaknya tiga kata. Kalimat seperti You aremelewati baris pertama dan kedua tetapi tidak cocok dengan yang terakhir, jadi outputnya you arebukan pesan kesalahan. Tambahkan tanda centang ...|They) \S+ \S/\L&/pada dua baris pertama.
Rainer P.

@Rainer - Anda benar (saya menyalahkan kurangnya test case untuk input pendek). Saya akan melihat cara memperbaikinya segera.
Toby Speight
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.