Cümleden yinelenen kelimeleri kaldırma


10

Bu meydan okumada, her cümlenin yinelenen kelimeleri kaldıracaksınız .

Örnekler

Hello Hello, World!
Hello, World!

Code Code! Golf Code
Code! Golf Code

Hello  hello   World
Hello   World

Programming Golf Programming!
Programming Golf!

Şartname

  • Giriş, ASCII karakterlerden oluşan bir dize olacaktır.
  • Cümle, dizenin sonuna, satır besleme ( \n) veya noktalama işaretine ( .!?) kadar herhangi bir şey olarak tanımlanır .
  • Bir kelime, dizisi olarak tanımlanır A-Za-z.
  • Kelimeler büyük / küçük harfe duyarlı değildir ( Hello== heLlO).
  • Bir kelimenin cümle içindeki sadece ilk oluşumu korunur.
  • Bir kelime kaldırılırsa, boşluklar önce çıkarılan kelime çıkarılmalıdır. (ör. A A B-> A B).

Bu bayt en kısa kodu kazanır!


1
a b a.neye gidiyor?
lirtosiast

@ThomasKwa a b.çünkü ` a` kaldırıldı.
Downgoat

İçin a__b_b_a, elde edersiniz a_b_a(ilk bkaldırıldı) veya a__b_a(ikinci bkaldırıldı)?

@CamilStaps a__b__, tekrarlananlar bve tekrarlananlar akaldırıldığından
alacağınız

1
@ BradGilbertb2gills Girişte tüm ASCII karakterlerine izin verilir. Yine de sadece harfler kelime olarak kabul edilir
Downgoat

Yanıtlar:


3

Vim, 27 bayt

:s/\v\c(<\a+>).{-}\zs\s+\1

27 baytın sonunda sondaki bir satır başı içerdiğini unutmayın.

Çevrimiçi deneyin! Yan not: Bu, yazdığım "V" adlı farklı bir dile bağlantı. V çoğunlukla vim ile geriye dönük olarak uyumludur, bu nedenle tüm niyet ve amaçlar için vim yorumlayıcısı olarak sayılabilir. %Tüm test senaryolarını bir kerede doğrulayabilmeniz için bir bayt ekledim .

Açıklama:

:s/\v                       "Substitute with the 'Magic flag' on. This magic flag allows us
                            "to shorten the regex by removing a lot of \ characters.
     \c(<\a+>)              "A case-insensitive word
              .{-}          "Any character (non-greedy)
                  \zs       "Start the selection. This means everything after this atom
                            "will be removed
                     \s+    "One or more whitespace characters,
                        \1  "Followed by the first word

6

JavaScript (ES6), 98

Not Kendim buldum iken, bu cümlelerde bütün giriş dizesi bölmek sadece ek mantıkla, Neil @ için rahatsız edici benziyor.

s=>s.replace(/[^\n.!?]+/g,s=>s.replace(/ *([a-z]+)/ig,(r,w)=>k[w=w.toUpperCase()]?'':k[w]=r,k=[]))

Ölçek

f=s=>s.replace(/[^\n.!?]+/g,s=>s.replace(/ *([a-z]+)/ig,(r,w)=>k[w=w.toUpperCase()]?'':k[w]=r,k=[]))

console.log=x=>O.textContent+=x+'\n'

;[['Hello Hello, World!','Hello, World!']
,['Code Code! Golf Code','Code! Golf Code']
,['Hello  hello   World','Hello   World']
,['Programming Golf Programming!','Programming Golf!']]
.forEach(t=>{
  var i=t[0],k=t[1],r=f(i)
  console.log((r==k?'OK ':'KO ')+i+' -> '+r)
})  
<pre id=O></pre>


6

Retina , 66 46 bayt

Bayt sayımı ISO 8859-1 kodlamasını varsayar.

i`[a-z]+
·$0·
i` *(·[a-z]+·)(?<=\1[^.!?¶]+)|·

Çevrimiçi deneyin!

açıklama

Yalnızca harfler kelime karakterleri olarak düşünüleceğinden (ancak normal ifade de rakamları ve alt çizgileri de kelime karakterleri olarak kabul eder), kendi kelime sınırlarımızı oluşturmamız gerekir. Girişin yalnızca ASCII karakterleri içereceği garanti edildiğinden, ·tüm kelimelerin etrafına (ASCII dışında, ancak ISO 8859-1 içine) ekliyorum ve yinelemelerle tekrar kaldırıyorum. Bu, genel sözcük sınırlarını uygulamak için bakış açılarını kullanarak 20 bayt tasarruf sağlar.

i`[a-z]+
·$0·

Bu, her kelimeyle eşleşir ve onu çevreler ·.

i` *(·[a-z]+·)(?<=\1[^.!?¶]+)|·

Bu iki adım bire sıkıştırılmıştır. <sp>*(·[a-z]+·)(?<=\1[^.!?¶]+)(dahil edilerek sağlanır tam kelime ile eşleşen ·ondan önceki herhangi bir boşluk, birlikte maçında) şartıyla bir yere daha önce cümlede aynı kelimeyi bulabilirsiniz (Geriye İlerleme ile sağlanır gibi). ( Satır besleme ile eşleşir.)

Diğer kısım ise ·, ilk yarının bir parçası olarak eşleşmeyen tüm yapay sözcük sınırlarıyla eşleşen kısımdır. Her iki durumda da, eşleşme dizeden basitçe kaldırılır.


4

C, 326 bayt

Kim düzenli ifadelere ihtiyaç duyar?

#include <ctype.h>
#define a isalpha
#define c(x)*x&&!strchr(".?!\n",*x)
#define f(x)for(n=e;*x&&!a(*x);++x);
main(p,v,n,e,o,t)char**v,*p,*n,*e,*o,*t;{for(p=v[1];*p;p=e){f(p)for(e=p;c(e);){for(;a(*++e););f(n)if(c(n)){for(o=p,t=n;a(*o)&&(*o-65)%32==(*t-65)%32;o++,t++);if(a(*t))e=n;else memmove(e,t,strlen(t)+1);}}}puts(v[1]);}

3

Perl 6 , 104 bayt

{[~] .split(/<[.!?\n]>+/,:v).map(->$_,$s?{.comb(/.*?<:L>+/).unique(as=>{/<:L>+/;lc $/}).join~($s//'')})} # 104

Kullanımı:

# give it a lexical name
my &code = {...}

say code "Hello Hello, World!
Code Code! Golf Code
Hello  hello   World
Programming Golf Programming!";
Hello, World!
Code! Golf Code
Hello   World
Programming Golf!

açıklama

{
  [~]                         # join everything that follows:

  .split(/<[.!?\n]>+/,:v)     # split on boundaries, keeping them
  .map(                       # loop over sentence and boundary together
    -> $_, $s? {              # boundary is optional (at the end of the string)
      .comb(/.*?<:L>+/)       # grab the words along with leading non letters
      .unique(                # keep the unique ones by looking at …
        as => {/<:L>+/;lc $/} # only the word chars in lowercase
      )
      .join                   # join the sentence parts
      ~                       # join that with …
      ($s//'')                # the boundary characters or empty string 
    }
  )
}

1

Perl 5, 57 bayt

56 bayt kodu + 1 -p

s/[^.!?
]+/my%h;$&=~s~\s*([A-z]+)~!$h{lc$1}++&&$&~egr/eg

Kullanımı:

perl -pe 's/[^.!?
]+/my%h;$&=~s~\s*([A-z]+)~!$h{lc$1}++&&$&~egr/eg' <<< 'Hello Hello, World!
Code Code! Golf Code
Hello  hello   World
Programming Golf Programming!
'
Hello, World!
Code! Golf Code
Hello   World
Programming Golf!

+1 olması gerekebilir, şu anda girişte yalnızca boşluklar olacağını, sekme olmadığını varsayıyorum.


Bir yorumdan "Girişte tüm ASCII karakterlerine izin verilir. Ancak harfler sadece kelime olarak kabul edilir" (Bunu meydan
Martin Ender

@ MartinBüttner Lanet olsun, tamam \sbunun yerine kullanmak için güncelleme yapacağım ... Yine de retina cevabının yakınında bir yer yok!
Dom Hastings

Oh, neden şimdi sorduğunu anlıyorum. Kelimelerin önünde boşluk bırakmamız gerekirse , başka bir bayta da ihtiyacım var. Soru özellikle "boşluklar" diyor. Açıklama istedim.
Martin Ender

@ MartinBüttner Sanırım yorumum da çok net değildi! Yine de yorumlarınız için teşekkürler!
Dom Hastings
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.