Знайдіть рекурсивну абревіатуру


10

Вступ

Рекурсивний акронім це абревіатура , який містить або ставиться до себе, наприклад: Fishможе бути рекурсивний акронім Fish is shiny hero, зверніть увагу , як це також містить саму абревіатуру. Інший приклад Hi-> Hi igloo. Або навіть ppcg paints->ppcg paints cool galaxies pouring acid into night time stars

Таким чином, речення є рекурсивним абревіатурою, якщо в перших літерах кожного з слів написано перше слово або слова.


Виклик

Створіть програму, яка містить рядок з 1 або більше слів, розділених пробілом, і виводить рекурсивну абревіатуру або порожній рядок, якщо це неможливо. Це неможливо зробити рекурсивний акронім для рядка , як, наприклад, ppcg elephantтому що ви б почати з взявши pз ppcgподальшим додаванням , що в абревіатурі, а потім взявши eз elephant. Але зараз ми маємо суперечність, оскільки в абревіатурі зараз написано "пе ..", що суперечить "пр ..". Так само і у випадку, наприклад, з hi. Ви б взяли hз hi, але пропозиція закінчилася, і більше немає літер для написання, hiі ми просто залишилися з тим, hщо не відповідаєhi. (Рядок потребує кількості слів, що перевищує або дорівнює кількості букв в абревіатурі)

Введення та вихід не відрізняються від регістру


Обмеження

  • Все, що введено у вашу програму, буде дійсними англійськими словами. Але ви також не забудьте вивести дійсні англійські слова (ви можете використовувати базу даних або просто зберегти слово для кожної з 26 букв)
  • Застосовуються стандартні лазівки та правила вводу-виводу за замовчуванням

Випробування

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

Оцінка балів

Це , тому найменший вихідний код у байтах виграє


1
Q, q [kyoo] іменник, множина Q або Qs, q's або qs. 17-а літера англійського алфавіту, приголосна. будь-який розмовний звук, представлений буквою Q або q, як у швидкому, виправданні чи в Іраку. щось має форму Q.
l4m2

3
Також не думаю, що ppcg - це слово в словнику
l4m2

1
Гаразд, один із цих тестових випадків не вийшов так, як я очікував. Просто щоб переконатися, що ніхто з нас не помилився, ppcg paints cool galaxies pouring acid into night timeбуло б "ppcgpaint", коли воно робиться абревіатурою, але вихід повинен бути, ppcgнавіть якщо це лише часткова відповідність?
Каміль Дракарі

1
Оскільки всі поточні рішення приймають перший варіант ("знайти абревіатуру"), а варіант "знайти речення" набагато складніше (тому жоден спосіб не бути конкурентоспроможним першим - для початку вам потрібен список слів), Я б запропонував зняти це з цього виклику і зробити його власним питанням.
Paŭlo Ebermann

2
@ PaŭloEbermann Добре, я його зняв
FireCubez

Відповіді:


5

Japt , 13 байт

¸
mά
VøUÎ ©V

Спробуйте в Інтернеті!



1
Це не вдається в ppcg paints cool galaxies pouring acid into night time starsтестовій справі
Каміль Дракарі

ось версія, яка працює для цього тестового випадку, але це не гольф
Каміль Дракарі

Моє попереднє рішення в 13 байтах було правильним Dx \
Луїс феліпе Де ісус Муноз

Поточна версія лише перевіряє, що в абревіатурі є перше слово, в результаті якого
з’являються

5

05AB1E , 16 байт

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

Спробуйте в Інтернеті!


1
Чому це змінилося на ð¡замість #останнього редагування? Якісь тестові випадки я не беру до уваги?
Kevin Cruijssen

@KevinCruijssen: Тому #що не вдалося б для введення одного слова вивести вхід замість порожнього рядка.
Емінья

Ага так, це було все. Я пам’ятаю, як раніше щось подібне питав. Я все ще думаю, що він #повинен діяти так само, як ð¡.. Чи є випадок використання, який ви можете придумати, де ви хочете розділити рядок на пробіли, але якщо він не містить пробілу, він повинен залишатися рядком (замість рядка загорнутий у список)? Інші люди, які читають це; FYI: Використання #(розділення на пробіл) на рядку без пробілів призводить до рядка таким, який є (тобто "test" -> "test"). Використання ð¡(розділення на пробіл) на рядку без пробілів призводить до того, що рядок загорнуто у список (тобто "test" -> ["test"]).
Kevin Cruijssen

@KevinCruijssen: Я думаю, що це головним чином пов'язане з тим, що він #також використовується як quit if true(що є його основною функцією). Якщо #повернуто значення false, ви, мабуть, не хотіли б, щоб перевірене значення було зафіксовано у списку, залишеному у стеку.
Емінья

1
@KamilDrakari: Хоча зараз працює.
Емінья

2

Haskell, 51 48 байт

Редагувати: -3 байти завдяки @xnor.

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

Знаходить абревіатуру.

Спробуйте в Інтернеті!

\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

Оскільки ви не використовуєте x, композиція (\w-> ...).wordsбуде коротшою.
xnor

2

Perl 6 , 50 42 58 49 байт

-9 байт завдяки nwellnhof

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

Спробуйте в Інтернеті!

Перший варіант. Я використовую той факт, що ordповертає порядкове значення першої літери рядка, тоді як chrsприймає список порядків і повертає рядок. Або виразка з відповіді місячного серця коротша :(. Для довідки попередня відповідь була .words>>.ord.chrsзамість[~] m:g/<<./

Пояснення:

{~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

Вам не потрібно виводити "НЕМОЖЛИВО" зараз
FireCubez

@Jo King Я можу робити реджекси, але все життя я не можу думати з усіма операторами. Я забуваю, що оператор x існує, наприклад: P
moonheart08

1

Сітківка 0,8,2 , 60 байт

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

Спробуйте в Інтернеті! Знаходить рекурсивну абревіатуру, якщо така є. Пояснення:

^
$'¶

Скопіюйте введення.

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

Зменшіть слова в першому рядку до їх початкових літер.

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

Якщо можливо, вставляйте пробіли, щоб відповідати початковим словам.

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

Виведіть перший рядок, якщо це префікс другого рядка.


Для фарб ppcg висновок недійсний, він не повинен нічого виводити, оскільки ppзамість нього
пишеться

@FireCubez Вибачте, я працював над старішою версією питання.
Ніл

1

Perl 6 , 56 байт

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

Спробуйте в Інтернеті!

Раніше регекси для мене були заплутаними і непридатними. Раптом я їх прекрасно розумію. Що зі мною трапилось: P

Виконує вибір 1.


На жаль, я все ще перебуваю на етапі, коли регулярні виразки - просто божевілля. На жаль, це не відповідає ppcgpaintsтесту, інакше я запропонував би щось на зразок $!∈.wordsумови if
Jo King


1

Іржа, 155, спробуйте онлайн!

Вибрано: Проблема 1: Пошук абревіатури

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

Безголовки, трохи:

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

Або якщо ми можемо припустити, що вхід є в малому регістрі, просто 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()}}

Який із двох варіантів робить ця програма?
FireCubez

@FireCubez Оновлено.
Ханнес Карппіла

1

Желе , 9 байт

Ḳµ;\fZḢWƊ

Повна програма надрукування рекурсивної абревіатури, якщо це можливо.

Спробуйте в Інтернеті!

Як?

Ḳµ;\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

Що ви маєте на увазі під «надрукувати перше слово»? Потрібно знайти абревіатуру, якщо така існує, чи робить це?
FireCubez

Якщо "ppcg малює круті галактики, що виливають кислоту в небо", слід надрукувати "фарби ppcg" або "ppcgpaints"
FireCubez

О, я пропустив вимогу суміжних слів :(
Джонатан Аллан

Виправлено це, щоб задовольнити цю вимогу.
Джонатан Аллан

1

JavaScript [ES6], 74 байти

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

Створює регулярний вираз, на який потрібно відповідати. Дивіться приклади в коді.

Усі тестові справи:

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'


Збійincrease i
l4m2

@ l4m2, тепер виправлено.
Рік Хічкок

0

Python 2 , 106 байт

Перший варіант - пошук рекурсивної абревіатури.
Повертає результат у списку.

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

Спробуйте в Інтернеті!

Python 2 , 120 байт

Перший варіант - пошук рекурсивної абревіатури.

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

Спробуйте в Інтернеті!


Вам не потрібно виводити "IMPOSSIBLE" за запитом @JoKing, що може зменшити кількість байтів
FireCubez

Одиночні букви типу "я" не працюють, вона повинна виводити цю одну букву
FireCubez

@FireCubez виправлено
Dead Possum

0

Javascript, 71 байт

Підхід 1

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

Безголівки:

l=s=>{
    p = s.split(' ');
    k = p.reduce((r,x)=>r+x[0],'');
    return k==p[0] ? k : '';
}
  • Розбийте рядок на пробіл.
  • Створіть новий рядок, взявши перший символ з кожного слова.
  • Порівняйте його з першим словом.



0

Скала, 76 байт

Рішення для простого випадку (абревіатури без пробілів)

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

Scala, 144 байти 100 байт (див. Рішення лише у ASCII у коментарях)

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

Тест на 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


Можна :::замінити ++? Також, List[String]-> Seq[Any]?
Лише ASCII


@ ASCII-тільки, класно! Це рішення перемагає Python. :)
Dr Y Wit

Ви хочете додати код десь? IMO це трохи дивно, коли бачити рахунок, не бачачи рішення
лише для ASCII
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.