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


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.