Yoda konuşan bir meydan okuma, bu


44

Meydan okuma

Bence çok açık, değil mi? Bir dizgeyi argüman olarak alan ve ilgili konuşmacı Yoda konuşmasını veren bir işlev veya program yapmanız gerekir.

Bu , yani en az bayt sayısı kazanır.

Girdi

Giriş satır besleme olmadan herhangi bir dize olabilir . Eğer böyle oluşuyorsa bir dizgeyi tercüme edebilirsiniz:

Konu + Fiil + Başka bir şey.

Nerede Konu bir şahıs zamiri olan (I, sen he, she, it, biz, onlar). İkinci kelimenin bir fiil olduğunu kabul etmek zorunda değilsin.

İlk kelime zamir değilse, giriş geçerlidir ancak çıkış geçerli olacaktır. Too difficult, this sentence is.

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

Giriş bir harfle bitebilir, a. ya da bir!

Ayrıca, dizeler Non-Ascii, Parantez, virgül, virgül içerebilir ...

Çıktı

Tercüme edilebilir bir cümle durumunda, çıktı cümlenin sonunda özne ve fiil ile aynı cümledir.

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

Zamir üzerindeki virgül, süre ve küçük harf zorunludur. (Tabii ki, zamir ben ise elbette).

Daha önce belirtildiği gibi, eğer tercüme edilemez ise dizgeyi çıkarmanız gerekir. Too difficult, this sentence is.

Örnekler

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
Soru dışı bir bakış açısıyla, mastarsızlar da taşınmamalı mı? Örneğin, olması You have to win this code challengegerektiği gibi This code challenge, you have to win.
Addison Crump,

9
"Bu kod yarışmasını kazanmak için var." kulağa gerçekten garip geliyor.
nicael

3
Girdi virgül içerebilir mi? Giriş ne olursa gelmez bir mektup, bir dönem veya sona !? Bunun gerçekleşmeyeceği garantili midir, yoksa bununla başa çıkmalı mıyız ve başlarında zamir olmayanlarla aynı şeyi basmalıyız. Giriş satır beslemeleri içerebilir mi? Kesme işareti? İki noktalar / parantez / backticks? ASCII olmayan karakterler? "Girdi herhangi bir dize olabilir" diyorsunuz , ancak test durumlarınız yalnızca belirli dizeleri kapsar.
Martin Ender

4
'mecbur', İngilizceye özgü garip bir yardımcı fiil yapısıdır; Yoda'nın kullanması pek mümkün değil. “Bu kod mücadelesi, kazanmanız gerekir.” Öte yandan, Yoda'nın kullanma eğiliminde kendi yardımcı fiil yapıları vardır: “Bu kod mücadelesi kazandı, yaptı”. Yoda'yı "Bu kodla mücadele, o kazandı" veya "bu kodla mücadeleyi kazanmak için" diyemiyorum.
Linda Jean

4
Cevaplara daha fazla ihtiyaç yok mu?
Steve Ives,

Yanıtlar:


17

Retina, 162 137 145 134 131 129

Artık noktalama işaretleri doğru bir şekilde işleniyor. Test durumu:You will not win this challenge...! -> Not win this challenge..., you will.

Çevrimiçi Deneyin!

[.!]$

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.

Açıklama:

Sonunda noktalama varsa, silin.

[.!]$

^empty line

Zamiri, ben hariç, küçük harfe dönüştürün.

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

Eşleşmeyen satırları filtrele <Pronoun><space><word><space><word>...

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

Böl pronoun + verb, remainder. Sonra yeniden düzenleyin.

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

İlk karakteri büyük harfe dönüştürün.

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

Sonuç boşsa, yukarıdaki filtreyi geçmedi. Bir hata mesajı yazdırın.

^$
Too difficult, this sentence is.

Harf çevirisi modunda karakter sınıfları köşeli parantez kullanmaz.
Martin Ender

1
Ayrıca, [^ ]muhtemelen \Sher yerle [^ ]+değiştirilebilir ve ilk regex ile değiştirilebilir .+. Karakter sınıflarında kaçmana gerek yok, .bu yüzden [.!]iyi çalışıyor. Eğer sırasını takas olmadığı Ayrıca, $1ve $2üçüncü aşamada, tek grup içine yakalamak ve 5 bayt kaydedebilirsiniz.
Martin Ender

([^I]|It)kısaltılabilir^\w\w
Martin Ender

Vay, ne kadar iyileştirme yükü. Teşekkürler.
Rainer P.

Bence I|Itolabilir I?, Retina destekleri eğer
Conor O'Brien

7

ES6, 212

Bu muhtemelen biraz daha golf oynayabilir:

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 gibi güncel bir tarayıcı gerektirir) veya node.js üzerinden çalıştırın

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

Bozuk test: I think they’ll add new features-> They, I think.Google Chrome'da döndürür 47.0.2526.106 m. Ayrıca, sevmiyor I love constants like π. Eklemek için yerineI made a fantastic code challenge (I hope)A fantastic code challenge , I made.A fantastic code challenge (I hope), I made.
Ismael Miguel

@IsmaelMiguel Sabit, ancak sabitlediğim başka bir hata nedeniyle 3 karakter daha da
azlaştı

Tüm sorunları çözdü, tüm testler iyi görünüyor. Aferin! Benim artı oyumu aldın.
Ismael Miguel

3
^Regex'inizin başlangıcına eklemeniz gerekir, aksi halde zamir hala geçerli olarak ayrıştırılmadan önce herhangi bir metni içeren bir cümle.
kullanici81655,

6

JavaScript (ES6), 164 bayt

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

açıklama

Bir dizenin ilk harfini büyük harf kullanarak kaç baytın JavaScript kullanması neredeyse acı verici ...

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

Ölçek

Sınama, tarayıcılar arası daha uyumlu hale getirmek için yıkım atamasını kullanmaz.


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()}.: "Çok zor, bu cümle."
36'da

@wally Teşekkürler, ama ne yazık ki bu regex büyük Itharfle kalsın ve Sheyyerine eşleşirdi She.
user81655

Ah, sınavım yetersizdi! Evet nedenini görebiliyorum ... Ah peki.
Wally

3

Python, 261 bayt

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'un b[-1]in".!"Next gibi şeyler umrunda değil


Sanırım b=b[:-1]parçadaki bir alanı kaldırabilirsin .
Conor O'Brien,

@ CᴏɴᴏʀO'Bʀɪᴇɴ teşekkürler!
Robert Grant,

3
b=b[:-1]ile satırın sonuna koyabilirsiniz if. Son satırda dönüş sonra boşluğu kaldırabilirsiniz. bu, 2 boşluğu bir sekme ve 3'ü bir sekme ve bir boşlukla değiştirerek python3 uyumluluğunu kıracak
undergroundmonorail

2

Python, 218 217 204 bayt

Bunun daha da golfe atılabileceğinden emin değilim.

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

değiştirebileceğiniz s.split(' ')için s.split()ve 'I|We|You|He|She|It|They'.split('|')için 'I We You He She It They'.split()değiştirin if...elsebaşka yerde kullanılan aynı boolean listede, değişimle t[0]iniçin t[0]in, dönüş etrafında spawce kaldırmak
Blue

1

GNU sed, 129 bayt

-rBayrak için +1 bayt ekliyorum.

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

açıklama

Bir öncü eşleşirsek Ietikete atlarız:

/^I /b

Eğer diğer zamirlerden birini eşleştirirsek, onu küçümser, sonra etikete atlarız:

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

Aksi halde hata mesajını yazdırır ve bir sonraki giriş satırına geçeriz:

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

Etikete atlarsak, son noktalama işaretlerini kaldırırız:

:
s/[.!]$//

ve ilk iki sözcüğü cümlenin geri kalanıyla değiştirip yeni ilk sözcüğü büyük harfle yazıp istediğiniz noktalamayı yaptığımız gibi ekleyin:

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

Programınız, girişin en az üç kelimeden oluşup oluşmadığını kontrol etmez. Gibi cümle You arebirinci ve ikinci satır geçer ama sonuncusu ile eşleşmez, bu nedenle çıktı you arehata mesajı yerine geçer. ...|They) \S+ \S/\L&/İlk iki satıra benzer bir çek ekleyin .
Rainer P.

@Rainer - Haklısın (Kısa girişler için test senaryosu eksikliğini suçluyorum). Yakında yeniden nasıl çalışacağına bakacağım.
Toby Speight
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.