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


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!



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!


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

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

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.


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.


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

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

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

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'


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!


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.



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


Można :::zastąpić ++? Również List[String]-> Seq[Any]?
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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.