Найти рекурсивную аббревиатуру

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. Но теперь у нас есть противоречие, поскольку в настоящее время в аббревиатуре говорится «pe ..», что противоречит «pp ..». Это также касается, например 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

счет

Это , поэтому выигрывает самый маленький исходный код в байтах

FireCubez
источник
1
Q, q [kyoo] существительное, множественное число Q или Qs, q или qs. 17-я буква английского алфавита, согласная. любой разговорный звук, представленный буквой Q или q, например, быстрый, оправдательный или иракский. что-то, имеющее форму Q.
l4m2
3
Также я не думаю, что ppcg - это слово в словаре
l4m2
1
Хорошо, один из этих тестов не получился, как я ожидал. Просто чтобы убедиться, что ни один из нас не делает ошибку, ppcg paints cool galaxies pouring acid into night timeбыло бы "ppcgpaint", когда превращено в аббревиатуру, но результат должен быть, ppcgхотя это только частичное совпадение?
Камил Дракари
1
Поскольку все текущие решения выбирают первый вариант («найти аббревиатуру»), а вариант «найти предложение» намного сложнее (поэтому нет способа конкурировать с первым - для начала вам нужен список слов), Я бы посоветовал убрать его из этого вызова и задать ему свой вопрос.
Пауло Эберманн
2
@ PaŭloEbermann Хорошо, я удалил его
FireCubez

Ответы:

5

Japt , 13 байт

¸
mά
VøUÎ ©V

Попробуйте онлайн!

Луис Фелипе Де Иисус Муньос
источник
11 байтов
лохматый
1
Это терпит неудачу на ppcg paints cool galaxies pouring acid into night time starsконтрольном примере
Камил Дракари
вот версия, которая работает для этого тестового случая, но это не игра в гольф
Камил Дракари
Мое предыдущее 13-байтовое решение было правильным Dx \
Luis felipe De jesus Munoz
Текущая версия просто проверяет, что аббревиатура содержит первое слово, что приводит к некоторым новым проблемам
Камил Дракари
5

05AB1E , 16 байтов

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

Попробуйте онлайн!

Emigna
источник
1
Почему он изменился на ð¡вместо #вашего последнего редактирования? Какие-то особые тестовые случаи я не принимаю во внимание?
Кевин Круйссен,
@KevinCruijssen: Потому что #произойдет сбой при вводе одиночного слова, выводя ввод вместо пустой строки.
Эминья
Ах да, это было так. Я помню, что спрашивал что-то подобное раньше. Я все еще думаю, что #должен действовать так же, как ð¡... Есть ли вариант использования, который вы можете придумать, где вы хотите разбить строку на пробелы, но если она не содержит пробела, она должна остаться строкой (вместо строки завернут в список)? Другие люди читают это; К сведению: использование #(разделить на пробел) строки без пробелов приводит к строке как есть (то есть "test" -> "test"). Использование ð¡(разделить на пробел) строки без пробелов приводит к тому, что строка обернута в список (т.е. "test" -> ["test"]).
Кевин Круйссен
@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принимает список ордеров и возвращает строку. Или регулярное выражение из ответа Moonheart короче :(. Для справки, предыдущий ответ был .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
@ Джо Кинг, я могу делать регулярные выражения, но, судя по всему, я не могу думать со всеми операторами. Я постоянно забываю, что существует оператор 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.

moonheart08
источник
К сожалению, я все еще на стадии, когда регулярные выражения - просто безумие. К сожалению, это не проходит ppcgpaintsтест, иначе я бы предложил что-то вроде $!∈.wordsусловия if
Джо Кинг,
1

K (нгн / к) , 40 байтов

Первый вариант:

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

Попробуйте онлайн!

Thaufeki
источник
На какой из 2 опций это работает?
FireCubez
Первый выводит аббревиатуру из строкового ввода. Я отредактирую свой пост, чтобы уточнить
Thaufeki
1

Rust, 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()}}
Ханнес Карппила
источник
Какой из 2 вариантов делает эта программа?
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 paintts» или «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'

Рик Хичкок
источник
Fail onincrease 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

Попробуйте онлайн!

Мертвый Опоссум
источник
Вы не обязаны выводить «НЕВОЗМОЖНО» в соответствии с запросом @JoKing, это может уменьшить количество ваших байтов
FireCubez
Отдельные буквы, такие как «Я», не работают, они должны выводить эту единственную букву
FireCubez
@FireCubez исправлено
Мертвый Опоссум
0

Javascript, 71 байт

Подход 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 : '';
}
  • Разделить строку на пробел.
  • Создайте новую строку, взяв первый символ из каждого слова.
  • Сравните это с первым словом.
Алфей
источник
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
1
100?
Только для ASCII
@ Только для ASCII, круто! Это решение побеждает Python. :)
Dr Y Wit
Не возражаете добавить код когда-нибудь? IMO, немного странно видеть, что bytecount не видит решения
только ASCII