Özyinelemeli bir kısaltma bulun


10

Giriş

Bir yinelemeli bir kısaltmasıdır : içeren ya da örneğin, tek başına ifade eder bir kısaltmadır Fishiçin yinelemeli bir kısaltmasıdır olabilir Fish is shiny hero, bu da bir kısaltma kendisini içerir dikkat edin. Başka bir örnek Hi-> Hi igloo. Hatta ppcg paints->ppcg paints cool galaxies pouring acid into night time stars

Yani, kelimelerin her birinin ilk harfleri ilk kelimeyi veya kelimeleri hecelerse, bir cümle yinelemeli bir kısaltmadır.


Meydan okuma

Boşluk karakteriyle ayrılmış 1 veya daha fazla kelimeden oluşan bir dize alan ve yinelemeli bir kısaltma veya imkansızsa boş bir dize çıkaran bir program yapın. Örneğin, böyle bir dize için bir özyinelemeli kısaltmayı yapmak mümkün değildir ppcg elephantEğer alarak başlamak çünkü pgelen ppcgsonra bir kısaltma ifade ederek, daha sonra alarak egelen elephant. Ama şimdi bir çelişkimiz var, çünkü kısaltma şu anda "pp .." ile çelişen "pe .." yazıyor. Örneğin, bu da geçerlidir hi. Sen alacaktı hgelen hi, ancak cümle üzerinde şimdi ve telaffuz etmek artık harf olduğuna hive biz sadece kalır hhangi uymuyorhi. (Dize, kısaltmadaki harf miktarına eşit veya daha fazla miktarda kelimeye ihtiyaç duyar)

Giriş ve çıkış büyük / küçük harfe duyarlı değildir


Kısıtlamalar

  • Programınıza girilen her şey geçerli İngilizce kelimeler olacaktır. Ancak geçerli İngilizce kelimeleri de çıkardığınızdan emin olmalısınız (bir veritabanını kullanabilir veya 26 harfin her biri için bir kelime saklayabilirsiniz)
  • Standart boşluklar ve varsayılan IO kuralları geçerlidir

Test Durumları

hi igloo -> hi
ppcg paints -> (impossible)
ppcg paints cool giraffes -> ppcg
ppcg paints cool galaxies pouring acid into night time stars -> ppcgpaints
ppcg paints cool galaxies pouring acid into night time -> ppcg
ppcg questions professional pool challengers greatly -> (impossible)
I -> I

puanlama

Bu , bu yüzden bayttaki en küçük kaynak kodu kazanır


1
Q, q [kyoo] isim, çoğul Q'lar veya Q'lar, q'lar veya q'lar. İngiliz alfabesinin 17. harfi, ünsüz. hızlı, beraat veya Irak'ta olduğu gibi Q veya q harfiyle gösterilen herhangi bir ses. Q şeklindeki bir şey
l4m2 26:18

3
Ayrıca ppcg sözlüğünde bir kelime olduğunu sanmıyorum
l4m2 26:18

1
Tamam, bu test durumlarından biri beklediğim gibi sonuçlanmadı. Sadece ikimizin bir hata yapmadığından emin olmak ppcg paints cool galaxies pouring acid into night timeiçin bir kısaltma haline getirildiğinde "ppcgpaint" olmazdı, ama çıktı ppcgsadece kısmi bir eşleşme olsa da olmalı ?
Kamil Drakari

1
Tüm mevcut çözümler ilk seçeneği kullandığından ("kısaltma bul") ve "cümle bul" seçeneği çok daha karmaşıktır (bu yüzden ilkiyle rekabet etmenin hiçbir yolu yoktur - başlangıçta bir kelime listesine ihtiyacınız vardır), Bunu bu zorluktan çıkarmayı ve kendi sorusunu sormayı öneririm.
Paŭlo Ebermann

2
@ PaŭloEbermann Tamam, kaldırdım
FireCubez

Yanıtlar:


5

Japt , 13 bayt

¸
mά
VøUÎ ©V

Çevrimiçi deneyin!



1
Bu ppcg paints cool galaxies pouring acid into night time starstest davasında başarısız
Kamil Drakari

İşte bu test senaryosu için çalışan bir versiyon, ama golf değil
Kamil Drakari

Önceki 13 bayt çözümüm doğru oldu Dx \
Luis felipe De jesus Munoz

Mevcut sürüm sadece kısaltmanın ilk kelimeyi içerdiğini kontrol eder, bu da bazı yeni sorunlara yol
açar

5

05AB1E , 16 bayt

ð¡©ηʒJ®€нJηså}θJ

Çevrimiçi deneyin!


1
Son düzenlemeniz ð¡yerine neden olarak değişti #? Dikkate almadığım bazı özel test durumları?
Kevin Cruijssen

@KevinCruijssen: Çünkü #boş bir dize yerine girdiyi çıkaran tek sözcük girişi başarısız olur.
Emigna

Ah evet, hepsi bu. Daha önce benzer bir şey sorduğumu hatırlıyorum. Hala #aynı davranmalıdır düşünüyorum ð¡.. Boşluklarda bir dize bölmek istediğinizi düşünebilirsiniz bir kullanım durumu var, ama bir boşluk içermiyorsa, dize (yerine dize kalmalıdır) bir listede sarılmış)? Bunu okuyan diğer insanlar; Bilginize: #Boşluksuz bir dizede (boşlukta böl) kullanılması dizgiyi olduğu gibi (yani "test" -> "test") ile sonuçlanır . Kullanılması ð¡listesi (yani sarılmış dizede boşluk sonuç alınamadan bir ipe (uzay bölünmüş) "test" -> ["test"]).
Kevin Cruijssen

@KevinCruijssen: Bence esas #olarak quit if true(ana işlevi olan) olarak da kullanılıyor . Yanlış #döndürülürse, işaretlenen değerin yığın üzerinde bırakılan bir listeye sarılmasını istemezsiniz.
Emigna

1
@KamilDrakari: Şimdi çalışıyor.
Emigna

2

Haskell, 51 48 bayt

Düzenleme: @xnor sayesinde -3 bayt.

(\w->[r|p<-scanl1(++)w,map(!!0)w==p,r<-p]).words

Kısaltmayı bulur.

Çevrimiçi deneyin!

\w->            .words -- let 'w' be the input list split into words
   p<-scanl1(++)w      -- loop 'p' through the list starting with the first word
                       --  and appending the next words one by one, e.g.
                       --  "Fish","is","shiny","hero" -> "Fish","Fishis","Fishisshiny","Fishisshinyhero"
     ,map(!!0)w==p     -- if the word made out of the first characters of the
                       --  words of 'w' equal 'p'
  [r|   r<-p]          -- return the letters of 'p' - if the check before
                       --  never evaluates to True then no letters, i.e. the
                       --  the empty string is returned

Kullanmadığınız için xbeste (\w-> ...).wordsdaha kısa olacaktır.
xnor

2

Perl 6 , 50 42 58 49 bayt

Nwellnhof sayesinde -9 bayt

{~first {m:g/<<./.join~~/^$^a/},[R,] [\~] .words}

Çevrimiçi deneyin!

İlk seçenek. Ben ords bir listesini alır ordve bir dize döndürür , sadece bir dize ilk harfinin sıra değeri döndürür aslında istismar ediyorum chrs. Ya da ay kalbinin cevabındaki normal ifade daha kısadır :(. Referans olarak, önceki cevap .words>>.ord.chrsyerine[~] m:g/<<./

Açıklama:

{~first {m:g/<<./.join~~/^$^a/},[R,] [\~] .words}
{                                               } # Anonymous code block
  first  # Find the first 
                                [R,] [\~] .words  # Of the reverse of the triangular joined words
         {                    }  # That matches:
          m:g/   /   # Match all from the original string
              <<.    # Single letters after a word boundary
                  .join    # Joined
                       ~~/^$^a/   # And starts with the given word
 ~  # And stringify Nil to an empty string

Artık "IMPOSSIBLE" çıktısını
almanıza

@Jo King regexes yapabilirim, ama hayatım boyunca tüm operatörlerle düşünemiyorum. X operatörünün varlığını unutmaya devam ediyorum, örneğin: P
moonheart08

1

Retina 0.8.2 , 60 bayt

^
$'¶
\G(\w)\w* ?
$1
+`^(.+)(\w.*¶\1 )
$1 $2
!`^(.+)(?=¶\1 )

Çevrimiçi deneyin! Varsa özyinelemeli kısaltmayı bulur. Açıklama:

^
$'¶

Girişi çoğaltın.

\G(\w)\w* ?
$1

İlk satırdaki kelimeleri ilk harflerine kadar azaltın.

+`^(.+)(\w.*¶\1 )
$1 $2

Mümkünse orijinal sözcüklerle eşleşecek boşluklar ekleyin.

!`^(.+)(?=¶\1 )

İkinci satırın öneki ise ilk satırın çıktısını alın.


Ppcg boyalar için çıktı geçersiz, hiçbir şey çıktılamıyor çünkü pphepsi yerine ilk kelimenin bir kısmını
yazıyor

@FireCubez Maalesef, sorunun eski bir sürümü üzerinde çalışıyordum.
Neil

1

Perl 6 , 56 bayt

$!=[~] m:g{<<.};say $! if m:g{<<\w+}.map({$_ eq $!}).any

Çevrimiçi deneyin!

Daha önce regexes kafa karıştırıcı ve benim için kullanılamaz. Aniden onları mükemmel anlıyorum. Bana ne oldu: P

Seçiminizi yerine getirir 1.


Ne yazık ki, hala normal ifadelerin sadece delilik olduğu aşamadayım. Ne yazık ki, bu ppcgpaintstest başarısız olur , aksi takdirde $!∈.wordsif koşulu gibi bir şey
Jo King


1

Rust, 155, çevrimiçi dene!

Seçili: Problem 1: Kısaltma bulma

type S=String;fn f(t:&str)->S{let l=t.to_lowercase();let w=l.split(' ').fold(S::new(),|a,b|a+&b[..1])+" ";if (l+" ").contains(w.as_str()){w}else{S::new()}}

Ungolfed, sadece biraz:

fn f(t: &str) -> String {
    let l = t.to_lowercase();
    let w = l.split(' ').fold(String::new(), |a, b| a + &b[0..1]) + " ";
    if (l + " ").contains(w.as_str()) {
        w
    } else {
        String::new()
    }
}

Veya girişin tamamen küçük harf olduğunu varsayabilirsek, sadece 130:

type S=String;fn f(l:S)->S{let w=l.split(' ').fold(S::new(),|a,b|a+&b[..1])+" ";if (l+" ").contains(&w.as_str()){w}else{S::new()}}

Bu program 2 seçenekten hangisini yapıyor?
FireCubez

@FireCubez Güncellendi.
Hannes Karppila

1

Jöle , 9 bayt

Ḳµ;\fZḢWƊ

Mümkünse özyinelemeli kısaltmayı yazdırmak için tam program.

Çevrimiçi deneyin!

Nasıl?

Ḳµ;\fZḢWƊ - Main Link: list of characters
Ḳ         - split at space (let's call this v)
 µ        - start a new monadic chain (i.e. f(v)):
   \      - cumulative reduce v with:
  ;       -   concatenation -> [v(1), v(1);v(2), v(1);v(2);v(3); ...]
        Ɗ - last three links as a monad (i.e. f(v)):
     Z    -   transpose -> [[v(1)[1], v(2)[1], ...],[v(1)[1],v(2)[2],...],...]
      Ḣ   -   head -> [v(1)[1], v(2)[1], ...] ... i.e. 'the potential abbreviation'
       W  -   wrap in a list -> ['the potential abbreviation']
    f     - filter discard those from the left list that are not in the right list
          - implicit print -- a list of length 0 prints nothing
          -                   while a list of a single item prints that item

"İlk kelimeyi yazdır" ile ne demek istiyorsun? Eğer varsa kısaltmayı bulmalı, öyle mi?
FireCubez

"Ppcg boyalar gökyüzüne değil asit dökülen serin galaksileri boyar", "ppcg boyalar" veya "ppcgpaints" yazdırmak için başarısız
FireCubez

Oh, bitişik kelimeler gereksinimini kaçırdım :(
Jonathan Allan

Bu gereksinimi karşılamak için düzeltildi.
Jonathan Allan

1

JavaScript [ES6], 74 bayt

s=>s.split` `.map(w=>(b+='('+w,e+=')?',t+=w[0]),b=e=t='')&&t.match(b+e)[0]

Eşleşecek normal bir ifade oluşturur. Koddaki örneklere bakın.

Tüm test örnekleri:

let f=

s=>s.split` `.map(w=>(b+='('+w,e+=')?',t+=w[0]),b=e=t='')&&t.match(b+e)[0]

console.log(f('hi igloo'))
// 'hi'.match('(hi(igloo)?)?')[0] == 'hi'

console.log(f('ppcg paints'))
// 'pp'.match('(ppcg(paints)?)?')[0] == ''

console.log(f('ppcg paints cool giraffes'))
// 'ppcg'.match('(ppcg(paints(cool(giraffes)?)?)?)?')[0] == 'ppcg'

console.log(f('ppcg paints cool galaxies pouring acid into night time stars'))
// 'ppcgpaints'.match('(ppcg(paints(cool(galaxies(pouring(acid(into(night(time(stars)?)?)?)?)?)?)?)?)?)?')[0] == 'ppcgpaints'

console.log(f('ppcg paints cool galaxies pouring acid into night time'))
// 'ppcgpaint'.match('(ppcg(paints(cool(galaxies(pouring(acid(into(night(time)?)?)?)?)?)?)?)?)?')[0] == 'ppcg'

console.log(f('ppcg questions professional pool challengers greatly'))
// 'pqppcg'.match('(ppcg(questions(professional(pool(challengers(greatly)?)?)?)?)?)?')[0] == ''

console.log(f('I'))
// 'I'.match('(I)?')[0] == 'I'

console.log(f('increase i'))
// 'ii'.match('(increase(i)?)?')[0] == ''

console.log(f('i increase'))
// 'ii'.match('(i(increase)?)?')[0] == 'i'


Başarısızincrease i
l4m2

@ l4m2, şimdi düzeltildi.
Rick Hitchcock

0

Python 2 , 106 bayt

İlk seçenek - özyinelemeli kısaltma bulma.
Listedeki sonucu döndürür.

I=input().split()
print[' '.join(I[:i])for i in range(1,-~len(I))if[j[0]for j in I]==list(''.join(I[:i]))]

Çevrimiçi deneyin!

Python 2 , 120 bayt

İlk seçenek - özyinelemeli kısaltma bulma.

def F(I,a=[],r=''):
 for j in I.split():
  a+=j,
  if list(''.join(a))==[i[0]for i in I.split()]:r=' '.join(a)
 return r

Çevrimiçi deneyin!


@JoKing'in isteğine göre "IMPOSSIBLE" yazmanız gerekmiyor, bu da bayt sayınızı düşürebilir
FireCubez

'Ben' gibi tek harfler işe yaramıyor, o tek harf çıktı almalı
FireCubez

@FireCubez düzeltildi
Dead Possum

0

Javascript, 71 bayt

Yaklaşım 1

l=s=>{p=s.split(' ');k=p.reduce((r,x)=>r+x[0],'');return k==p[0]?k:''}

Ungolfed:

l=s=>{
    p = s.split(' ');
    k = p.reduce((r,x)=>r+x[0],'');
    return k==p[0] ? k : '';
}
  • Dizeyi boşlukla bölün.
  • Her kelimeden ilk karakteri alarak yeni dize oluşturun.
  • İlk kelimeyle karşılaştırın.



0

Scala, 76 bayt

Basit dava için çözüm (boşluk olmayan kısaltmalar)

def^(s:String)={val l=s.split(" ");if(l(0)==l.map(_(0)).mkString)l(0)else""} 

Scala, 144 bayt 100 bayt (yalnızca yorumlarda ASCII'nin çözümüne bakın)

def^(s:String)={val l=s.split(" ");l.scanLeft(List[String]())(_:::List(_)).find(_.mkString==l.map(_(0)).mkString).map(_.mkString).getOrElse("")}

REPL'de test

scala> def^(s:String)={val l=s.split(" ");if(l(0)==l.map(_(0)).mkString)l(0)else""}
$up: (s: String)String

scala> ^("hi igloo")
res12: String = hi

scala> ^("ppcg paints cool giraffes")
res13: String = ppcg

scala> ^("ppcg paints Xcool giraffes")
res14: String = ""

scala> ^("ppcg paints cool galaxies pouring acid into night time stars")
res15: String = ""

scala>

scala> def^(s:String)={val l=s.split(" ");l.scanLeft(List[String]())(_:::List(_)).find(_.mkString==l.map(_(0)).mkString).map(_.mkString).getOrElse("")}
$up: (s: String)String

scala> ^("hi igloo")
res16: String = hi

scala> ^("ppcg paints cool giraffes")
res17: String = ppcg

scala> ^("ppcg paints Xcool giraffes")
res18: String = ""

scala> ^("ppcg paints cool galaxies pouring acid into night time stars")
res19: String = ppcgpaints


İle :::değiştirilebilir ++? Ayrıca, List[String]-> Seq[Any]?
Sadece ASCII


@ Sadece ASCII, havalı! Bu çözüm Python'u yener. :)
Dr Y Wit

Kodu bir ara eklemek ister misiniz? IMO, çözümü görmeden bayt sayısını görmek biraz garip
sadece ASCII-sadece
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.