Znajdź rekurencyjny akronim

10

Wprowadzenie

Rekurencyjny akronim jest skrótem, który zawiera lub odnosi się do siebie, na przykład: Fishmoże być rekurencyjny akronim Fish is shiny hero, który zawiera zawiadomienie jak również sam skrót. Innym przykładem jest Hi-> Hi igloo. Lub nawet ppcg paints->ppcg paints cool galaxies pouring acid into night time stars

Zasadniczo zdanie jest rekurencyjnym akronimem, jeśli pierwsze litery każdego ze słów oznaczają pierwsze słowo lub słowa.


Wyzwanie

Utwórz program, który pobiera ciąg 1 lub więcej słów oddzielonych spacją i generuje rekurencyjny akronim lub pusty ciąg, jeśli jest to niemożliwe. Niemożliwe jest utworzenie rekurencyjnego akronimu dla ciągu, takiego jak na przykład, ppcg elephantponieważ zaczynasz od wzięcia pod, ppcga następnie dodając go do akronimu, a następnie biorąc eod elephant. Ale teraz mamy sprzeczność, ponieważ akronim oznacza obecnie „pe ..”, co jest sprzeczne z „pp ..”. Tak też jest na przykład w przypadku hi. Weźmiesz hod hi, ale zdanie już się skończyło i nie ma już liter do przeliterowania, hia my zostajemy z htym, co nie pasujehi. (Ciąg wymaga ilości słów większej lub równej liczbie liter w akronimie)

W danych wejściowych i wyjściowych nie jest rozróżniana wielkość liter


Ograniczenia

  • Wszystko, co zostanie wprowadzone do twojego programu, będzie poprawnymi angielskimi słowami. Musisz jednak upewnić się, że wypisujesz również prawidłowe angielskie słowa (możesz użyć bazy danych lub po prostu zapisać słowo dla każdej z 26 liter)
  • Obowiązują standardowe luki i domyślne reguły we / wy

Przypadki testowe

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

Punktacja

To jest , więc wygrywa najmniejszy kod źródłowy w bajtach

FireCubez
źródło
1
Q, q [kyoo] rzeczownik, liczba mnoga Q lub Qs, q's lub qs. 17. litera alfabetu angielskiego, spółgłoska. każdy wymawiany dźwięk reprezentowany przez literę Q lub q, jak w szybkim, uniewinnionym lub Iraku. coś o kształcie Q.
l4m2
3
Nie sądzę też, aby ppcg było słowem w słowniku
l4m2
1
Okej, jeden z tych przypadków testowych nie wyszedł zgodnie z oczekiwaniami. ppcg paints cool galaxies pouring acid into night timeŻeby upewnić się, że żaden z nas się nie pomyli, po utworzeniu akronimu nie byłoby „ppcgpaint”, ale wynik powinien być taki, ppcgże jest to tylko częściowe dopasowanie?
Kamil Drakari
1
Ponieważ wszystkie obecne rozwiązania przyjmują pierwszą opcję („znajdź akronim”), a opcja „znajdź zdanie” jest znacznie bardziej skomplikowana (więc nie ma możliwości konkurowania z pierwszą - na początek potrzebujesz listy słów), Sugerowałbym usunięcie go z tego wyzwania i uczynienie z niego własnego pytania.
Paŭlo Ebermann
2
@ PaŭloEbermann W porządku, usunąłem go
FireCubez

Odpowiedzi:

5

Japt , 13 bajtów

¸
mά
VøUÎ ©V

Wypróbuj online!

Luis Felipe De Jesus Munoz
źródło
11 bajtów
Kudłaty
1
Nie udaje się to w ppcg paints cool galaxies pouring acid into night time starsprzypadku testowym
Kamil Drakari
oto wersja, która działa dla tego przypadku testowego, ale nie jest w golfa
Kamil Drakari
Moje poprzednie 13 bajtowe rozwiązanie było poprawne Dx \
Luis felipe De jesus Munoz
Obecna wersja tylko sprawdza, czy akronim zawiera pierwsze słowo, co powoduje pewne nowe problemy
Kamil Drakari,
5

05AB1E , 16 bajtów

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

Wypróbuj online!

Emigna
źródło
1
Dlaczego zmieniło się na ð¡zamiast #w ostatniej edycji? Jakieś specjalne przypadki testowe, których nie biorę pod uwagę?
Kevin Cruijssen
@KevinCruijssen: Ponieważ #nie powiedzie się w przypadku wprowadzania pojedynczego słowa, które wypisuje dane wejściowe zamiast pustego ciągu.
Emigna
Ach tak, to było to. Pamiętam, że wcześniej pytałem o coś podobnego. Nadal uważam, że #powinien zachowywać się tak samo jak ð¡... Czy istnieje przypadek użycia, w którym można pomyśleć o miejscu, w którym chcesz podzielić ciąg znaków na spacje, ale jeśli nie zawiera spacji, powinien pozostać ciągiem (zamiast ciągu zawinięte w listę)? Inni ludzie to czytają; FYI: Użycie #(podział na spację) na łańcuchu bez spacji powoduje, że łańcuch jest taki, jaki jest (tj "test" -> "test".). Użycie ð¡(podział na spację) na łańcuchu bez spacji powoduje, że łańcuch jest zawijany na liście (tj "test" -> ["test"].).
Kevin Cruijssen
@KevinCruijssen: Myślę, że to głównie dlatego, że #jest używany jako quit if true(co jest jego główną funkcją). Jeśli zostanie #zwrócony false, prawdopodobnie nie chcesz, aby wartość była zawijana na liście pozostawionej na stosie.
Emigna
1
@KamilDrakari: Teraz działa.
Emigna
2

Haskell, 51 48 bajtów

Edycja: -3 bajty dzięki @xnor.

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

Znajduje akronim.

Wypróbuj online!

\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
nimi
źródło
Ponieważ nie używasz x, komponowanie (\w-> ...).wordsbyłoby krótsze.
xnor
2

Perl 6 , 50 42 58 49 bajtów

-9 bajtów dzięki nwellnhof

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

Wypróbuj online!

Pierwsza opcja. Wykorzystuję fakt, że ordjedyna zwraca wartość porządkową pierwszej litery łańcucha, a jednocześnie chrsbierze listę zamówień i zwraca łańcuch. Lub wyrażenie regularne z odpowiedzi księżycowego serca jest krótsze :(. Dla porównania, poprzednia odpowiedź brzmiała .words>>.ord.chrszamiast[~] m:g/<<./

Wyjaśnienie:

{~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
Jo King
źródło
Nie musisz teraz wyświetlać „NIEMOŻLIWE”
FireCubez
@Jo King, mogę robić wyrażenia regularne, ale przez całe życie nie mogę myśleć ze wszystkimi operatorami.
Wciąż
1

Retina 0.8.2 , 60 bajtów

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

Wypróbuj online! Znajduje rekurencyjny akronim, jeśli istnieje. Wyjaśnienie:

^
$'¶

Zduplikuj dane wejściowe.

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

Zmniejsz słowa w pierwszym wierszu do ich pierwszych liter.

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

W miarę możliwości wstaw spacje, aby dopasować oryginalne słowa.

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

Wyjście pierwszego wiersza, jeśli jest to przedrostek drugiego wiersza.

Neil
źródło
W przypadku farb ppcg wynik jest nieprawidłowy, nie powinien wypisywać niczego, ponieważ pptylko przeliteruje część pierwszego słowa zamiast całego
FireCubez
@FireCubez Przepraszamy, pracowałem nad starszą wersją pytania.
Neil,
1

Perl 6 , 56 bajtów

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

Wypróbuj online!

Poprzednio wyrażenia regularne były dla mnie mylące i bezużyteczne. Nagle rozumiem je doskonale. Co się ze mną stało: P

Spełnia wybór 1.

moonheart08
źródło
Niestety wciąż jestem na etapie, w którym wyrażenia regularne to po prostu szaleństwo. Niestety to nie kończy się ppcgpaintstestem, w przeciwnym razie zasugerowałbym coś takiego $!∈.wordsdla warunku if
Jo King
1

K (ngn / k) , 40 bajtów

Pierwsza opcja:

{$[1=#:x;x;$[(*:t)~,/*:'t:" "\x;*:t;`]]}

Wypróbuj online!

Thaufeki
źródło
Która z 2 opcji działa na tym?
FireCubez
Pierwszy, wypisuje akronim z ciągu znaków wejściowych.
Przeredaguję
1

Rust, 155, spróbuj online!

Wybrane: Problem 1: Znalezienie akronimu

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

Niegolfowany, tylko trochę:

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

Lub jeśli możemy założyć, że wszystkie dane wejściowe są pisane małymi literami, wystarczy 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()}}
Hannes Karppila
źródło
Którą z 2 opcji robi ten program?
FireCubez
@FireCubez Zaktualizowano.
Hannes Karppila
1

Galaretka , 9 bajtów

Ḳµ;\fZḢWƊ

Pełny program drukujący skrót rekurencyjny, jeśli jest to możliwe.

Wypróbuj online!

W jaki sposób?

Ḳµ;\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
Jonathan Allan
źródło
Co rozumiesz przez „wydrukuj pierwsze słowo”? Musi znaleźć akronim, jeśli taki istnieje, prawda?
FireCubez
Nie powiedzie się za „ppcg maluje fajne galaktyki wylewające kwas na niebo”, powinien wydrukować „ppcg maluje” lub „ppcgpaints”
FireCubez
Och, spóźniłem się na wymaganie dotyczące sąsiednich słów :(
Jonathan Allan
Naprawiono go, aby spełnić to wymaganie.
Jonathan Allan
1

JavaScript [ES6], 74 bajty

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

Tworzy wyrażenie regularne do dopasowania. Zobacz przykłady w kodzie.

Wszystkie przypadki testowe:

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'

Rick Hitchcock
źródło
Fail onincrease i
l4m2
@ L4m2, teraz naprawiony.
Rick Hitchcock,
0

Python 2 , 106 bajtów

Pierwsza opcja - znalezienie rekurencyjnego akronimu.
Zwraca wynik na liście.

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

Wypróbuj online!

Python 2 , 120 bajtów

Pierwsza opcja - znalezienie rekurencyjnego akronimu.

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

Wypróbuj online!

Dead Possum
źródło
Nie jest wymagane, aby wyświetlać „NIEMOŻLIWE” zgodnie z prośbą @JoKing, co może zmniejszyć liczbę bajtów
FireCubez
Pojedyncze litery, takie jak „I”, nie działają, powinna
wypisać
@FireCubez naprawiony
Dead Possum
0

JavaScript, 71 bajtów

Podejście 1

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

Nie golfowany:

l=s=>{
    p = s.split(' ');
    k = p.reduce((r,x)=>r+x[0],'');
    return k==p[0] ? k : '';
}
  • Podziel ciąg według spacji.
  • Utwórz nowy ciąg, biorąc pierwszy znak z każdego słowa.
  • Porównaj to z pierwszym słowem.
alpheus
źródło
0

Python 2 , 109 bajtów

def f(s,J=''.join):s=s.split();return[J(s[:i])for i in range(len(s)+1)if J(zip(*s)[0]).find(J(s[:i]))==0][-1]

Wypróbuj online!

Chas Brown
źródło
0

Scala, 76 bajtów

Rozwiązanie dla prostej skrzynki (akronimy bez białych znaków)

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

Scala, 144 bajty 100 bajtów (patrz rozwiązanie ASCII-tylko w komentarzach)

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

Test w REPL

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
Dr Y Wit
źródło
Można :::zastąpić ++? Również List[String]-> Seq[Any]?
Tylko ASCII,
1
100?
Tylko ASCII,
@ Tylko ASCII, super! To rozwiązanie pokonuje Python. :)
Dr Y Wit
Może kiedyś dodasz kod? IMO to trochę dziwne widzieć bajt bez liczenia rozwiązania
tylko ASCII