Сокращения могут действительно сузить ваши датчики сообщений


36

Из-за этого вам нужен лучший способ понять, является ли фраза аббревиатурой слова. Вы также думаете, что стоит посмотреть, являются ли рассматриваемая фраза и слово рекурсивными акронимами.

Твое задание:

Если дано слово, а затем фраза, разделенная строкой, выведите, если фраза является аббревиатурой, а затем, если это рекурсивная аббревиатура . (Фраза содержит то, что она обозначает)

  • Ввод будет состоять из букв и пробелов.
  • Ваша программа не должна быть чувствительной к регистру.

Пример ввода / вывода:

Случай 1:

Входные данные:

Acronyms
Acronyms can really obviously narrow your message sensors

Выход:

True 
True

Случай 2:

Входные данные:

FAQ
frequently asked questions

Выход:

True 
False

Случай 3:

Входные данные:

foo
bar baz

Выход:

False
False

Дело 4:

Входные данные:

GNU
GNU is not Unix

Выход:

False
False

Дело 5:

Входные данные:

Aha
A huge Aha

Выход:

True
True

69
Сокращения могут повторяться? Ой! Теперь ты имеешь смысл.
Geobits

2
Нет, до тех пор, пока ясно, что выходной
Blue

9
Это напоминает мне о XKCD: xkcd.com/917
ETHproductions


4
ABCDE: еще один базовый, четко определенный пример.
Джон Дворжак

Ответы:


10

Пиф, 19 18

&pqJrz0hCKcrw0)}JK

Это выводит результат в довольно нечетном формате, например: TrueFalse.

Вы можете попробовать это онлайн или запустить Test Suite .

Объяснение:

&pqJrz0hCKcrw0)}JK      :
    rz0    rw0          : read two lines of input, and convert each to lower case
          c   )         : chop the second input on whitespace
   J     K              : store the first line in J and the chopped second line in K
  q    hC               : zip K and take the first element, check if it is the same as J
 p                      : print and return this value
&              }JK      : and the value with whether J is in K, implicit print

15

Python 3, 89

Благодаря SOPython сэкономлено несколько байтов.

a=input().lower()
d=input().lower().split()
h=tuple(a)==next(zip(*d))
print(h,h&(a in d))

Наиболее сложной частью этого решения является h=tuple(a)==next(zip(*d)).
Это распаковывает список dв zip, а затем вызывает, nextчтобы вернуть кортеж первого элемента каждого переданного итератора, zipкоторый затем сравнивается с кортежем каждой буквы в a ( tuple(a)).


Вы можете сэкономить 7 байт, заменяя [0]==l на .startswith(l).
Скайлер

7

CJam, 21 20 байт

qeuN/)S/_:c2$s=_p*&,

Попробуйте эту скрипку в интерпретаторе CJam или проверьте все тестовые случаи одновременно.

Как это работает

qeu                  e# Read from STDIN and convert to uppercase.
   N/                e# Split at linenfeeds.
     )S/             e# Pop the second line form the array.
      S/             e# Split it at spaces.
        _:c          e# Push a copy and keep on the initial of each word.
           2$s       e# Push a copy of the line array and flatten it.
                     e# This pushes the first line.
              =      e# Check for equality.
               _p    e# Print a copy of the resulting Boolean.
                 *   e# Repeat the word array 1 or 0 times.
                  &  e# Intersect the result with the line array.
                   , e# Push the length of the result (1 or 0).

4

Haskell, 81 80 байт

import Data.Char
f[a,b]|c<-words b=(a==map(!!0)c,elem a c)
p=f.lines.map toLower

Формат вывода не является строго определенным, поэтому я возвращаю пару логических значений, например p "Aha\na huge arm"-> (True,False).


Сегодня я узнал о паттернах ( <-) - спасибо!
wchargin

4

Scala, 135 110 108 байт

val Array(x,y)=args.map(_.toLowerCase)
val z=y.split(" ").map(_(0)).mkString
print(z==x,z==x&&y.contains(z))

Сохранение нескольких байтов с использованием аргументов командной строки (спасибо J Atkin за подсказку), использование логических значений в качестве tupel, использование mkStringвместо new Stringprint и println.

РЕДАКТИРОВАТЬ: неправильно истолковал вопрос, и пришлось переопределить решение


3

Python 3, 106 байт

Ну, по крайней мере, это победило Скала;)

x=input().lower()
y=input().lower().split()
g=all(x[i]==y[i][0]for i in range(len(y)))
print(g,g&(x in y))

1
@muddyfish Возможно, более подробное объяснение каждого примера предотвратит это от других людей.
бета-распад

Поможет ли больше времени в песочнице? По моему (очевидно, довольно ограниченному) опыту, вы получаете ответы, пока он почти на вершине
Blue

@muddyfish Ну, я не знаю, как долго вы его оставили, так что я не знаю
Beta Decay

Я оставил его там примерно на день
Blue

@muddyfish Неделя - рекомендуемая норма
бета-распад

3

AppleScript, 302 301 297 293 байта

О, черт возьми, да. Даже не надоело, что я проигрываю, это конкурентоспособно для AppleScript.

установить x в (отображать диалог "" ответ по умолчанию "") возвращаемый текст
установить y в (отобразить диалог "" ответ по умолчанию "") возвращенный текст
установить n на номер элемента y
повторить н
пытаться
если не символ y элемента n, 1 = (x как текст), символ n, затем вернуть {false, false}
конец
установите n в n-1
конец
return {true, x в y}

Выходы как:

{правда, ложь}

Или каким бы ни был ответ.


2

PHP, 120 байт

Не чувствительность к регистру - большой вес (26 байт). Пройдены все тестовые случаи:

foreach($c=explode(' ',strtolower($argv[2]))as$l)$m.=$l[0];var_dump($x=$m==$a=strtolower($argv[1]),$x&&in_array($a,$c));

Выводит два значения bool в этой форме:

bool(true)
bool(false)

Читает два аргумента из командной строки, например:

a.php Acronyms "Acronym can really obviously narrow your message sensors"

Ungolfed

$acronym = strtolower($argv[1]);
$words = strtolower($argv[2]);
$words = explode(' ', $words);

foreach($words as $word) {
    $letters .= $word[0];
}

$isAcronym = $letters == $acronym;

var_dump(
    $isAcronym,
    $isAcronym && in_array($acronym, $words)
);

2

Рубин, 77 74 байта

b=gets.chop.upcase
a=gets.upcase
p c=a.scan(/\b\w/)*''==b,c&&a.include?(b)

1

Рубин, 52 байта

p !!gets[/^#{x=gets.scan(/\b\w/)*""}$/i],!! ~/#{x}/i

Пример:

$ echo "Aha
A huge AHA" | ruby acronym.rb
true
true

1

Matlab, 90 байт

function z=f(r,s)
z=[sum(regexpi(s(regexpi(s,'(?<=(\s|^))\S')),r))>0 nnz(regexpi(s,r))>0];

Пример (обратите внимание, что Matlab отображает true/ falseкак 1/ 0):

>> f('Aha', 'A huge Aha')
ans =
     1     1

1

JavaScript ES6, 95 92 байта

(a,b)=>[(r=eval(`/^${a}$/i`)).test((s=b.split` `).map(c=>c[0]).join``),s.some(c=>r.test(c))]

Введите обе строки в качестве параметров. Выводит массив с двумя значениями: по одному для каждого логического значения.


1
Я бы не подумал об использовании регулярных выражений вместо .indexOf. Хорошо сделано! Возможно, r=eval(`/^${a}$/i`)будет работать вместо вашей текущей rнастройки.
ETHproductions

@ETHproductions И я , в свою очередь , не подумал бы , evalкак RegExpобъект Shortener. Спасибо за совет!
Mwr247 22.10.15

0

GNU sed, 118 байт

Требуется -rфлаг, включенный в оценку как +1. Обратите внимание, что я использую \bдля сопоставления границы слова, хотя я не могу найти это задокументировано в GNU sed. Это работает для меня ...

N
h
s/^(.*)\n.*\b\1\b.*/True/i
/\n/s/.*/False/
x
:
s/(.)(.*\n)\1[^ ]* ?/\2/i
t
/../s/.*/False/
/F/h
/F/!s/.*/True/
G

Expanded:

#!/bin/sed -rf

N
h

# Is it recursive?
s/^(.*)\n.*\b\1\b.*/True/i
# If no replacement, there's still a newline => false
/\n/s/.*/False/

x

# Is it an acronym?
# Repeatedly consume one letter and corresponding word
:
s/(.)(.*\n)\1[^ ]* ?/\2/i
t
# If more than just \n remain, then false
/../s/.*/False/
# And falsify recursive, too
/F/h
# !False => true
/F/!s/.*/True/

G

0

Groovy, 91 байт

a=args*.toLowerCase()
println([a[1].split()*.charAt(0).join("")==a[0],a[1].contains(a[0])])

Выходной формат. [bool, bool]Это принимает его от аргументов командной строки.


0

Lua 5.3, 182 байта

a=""b=io.read c=a.lower d=a.reverse e=d(c(b()))f=~e:len()h=a.sub g=d(c(b()))for m in g:gmatch"[^ ]+"do f=-~f if h(e,f,f)~=h(m,~0)then break end k=k or m==e end f=f>~1print(f,f and k)

0

R, 93 байта

a=tolower(readLines(,2));cat(a[1]==gsub("([^ ])\\w* ?","\\1",a[2]),a[1]%in%scan(t=a[2],w=""))

Использование:

> a=tolower(readLines(,2));cat(a[1]==gsub("([^ ])\\w* ?","\\1",a[2]),a[1]%in%scan(t=a[2],w=""))
Aha
A huge Aha
Read 3 items
TRUE TRUE
> a=tolower(readLines(,2));cat(a[1]==gsub("([^ ])\\w* ?","\\1",a[2]),a[1]%in%scan(t=a[2],w=""))
Acronyms
Acronyms can really obviously narrow your message sensors
Read 8 items
TRUE TRUE
> a=tolower(readLines(,2));cat(a[1]==gsub("([^ ])\\w* ?","\\1",a[2]),a[1]%in%scan(t=a[2],w=""))
FAQ
frequently asked questions
Read 3 items
TRUE FALSE
> a=tolower(readLines(,2));cat(a[1]==gsub("([^ ])\\w* ?","\\1",a[2]),a[1]%in%scan(t=a[2],w=""))
foo
bar baz
Read 2 items
FALSE FALSE

0

awk 137 байт

awk 'BEGIN{T="True";F="False"}NR*NF<2{a=tolower($1)}END{for(i=1;i<=NF;i++)b=b substr(tolower($i),1,1);print(a==b?T:F)"\n"(a==tolower($1)?T:F)}'
  • Инициализируйте, T="True";F="False"чтобы упростить вывод.
  • NR*NF<2{a=tolower($1)}: установить, aтолько если в первой строке есть только одно поле.
  • END{...}: при условии, только две строки ...
    • for(i=1;i<=NF;i++)b=b substr(tolower($i),1,1): построить рекурсивную аббревиатуру.
    • print(a==b?T:F)"\n"(a==tolower($1)?T:F): распечатать вывод обоих сравнений, a==bи a==tolower($1).

Если кто-нибудь знает, как оптимизировать рекурсивную конструкцию аббревиатуры, не стесняйтесь предлагать.


0

SpecBAS - 144 байта

1 INPUT a$,b$: LET a$=UP$(a$),b$=UP$(b$),d$="": DIM c$(SPLIT b$,NOT " ")
2 FOR EACH w$ IN c$(): LET d$=d$+w$(1): NEXT w$
3 TEXT d$=a$'POS(a$,b$)>0

Преобразование 2-х входов в верхний регистр сохраняет символы против преобразования в нижний регистр. Теперь можно сделать несколько назначений в одном LETоператоре, что также помогает. И TEXTсохраняет один символ более PRINT.

Использует 1/0, чтобы показать true / false (апостроф просто перемещает вывод на следующую строку).


0

Perl5, 90 байт

($a,$b)=map{chomp;lc}<>;print((join"",map{substr($_,0,1)}split/ /,$b)ne $a?0:($b=~$a?2:1))

немного обманывают: 0 = все ложно, 1 = одно истина, 2 = оба истина. Я не игрок в гольф, но расстроен Perl отсутствует при просмотре!

($a,$b)=map{chomp;lc}<>;              # get the two lines as lowercase
print((                               #
join"",map{substr($_,0,1)}split/ /,$b # collapse first letters of secondline
     ) ne $a  ? 0 : ( $b=~$a ? 2 : 1))# 0 nothing, 1 not recursive, or 2 

0

JavaScript (ES6) 93

(w,s)=>s[L='toLowerCase'](w=w[L](z=y='')).replace(/\w+/g,v=>y+=v[z=z||v==w,0])&&[y=y==w,y&&z]

Попробуйте запустить приведенный ниже фрагмент в любом браузере, совместимом с EcmaScript 6

f=(w,s)=>s[L='toLowerCase'](w=w[L](z=y='')).replace(/\w+/g,v=>y+=v[z=z||v==w,0])&&[y=y==w,y&&z]

// TEST

out=x=>O.innerHTML+=x+'\n';

;[
 ['Acronyms', 'Acronyms can really obviously narrow your message sensors', true, true]
,['FAQ', 'frequently asked questions', true, false]
,['foo', 'bar baz', false, false]
,['GNU', 'GNU is not Unix', false, false]
,['Aha', 'A huge Aha', true, true]
,['Lolcat', 'Laughing over lolcat captions and tearing.', true, true]
,['ABCDE', 'Another basic clearly defined example.', true, false]
,['GNU', 'Gnus nettle unicorns', true, false]
,['PHP', 'PHP Hypertext Preprocessor', true, true]
].forEach(([a,b,c,d]) => (
  [r,s]=f(a,b), 
  out(((r==c && s==d)?'OK ':'KO ') + a + ',' + b + ' -> ' + f(a,b))
))
<pre id=O></pre>


0

JavaScript (ES6), 89 96 95 байт

(a,b)=>[p=(a=a[l='toLowerCase']())==(c=b[l]().split` `).map(x=>x[0]).join``,p&&c.some(x=>x==a)]

Черт ... Я думал, что все улажено, но, видимо, я ошибался.

Это определяет анонимную функцию, которая принимает входные данные в виде двух строк, а также возвращает массив двух логических элементов. Первый элемент рассчитывается путем сравнения первой строки со всеми строчными буквами с первым символом каждого слова во второй строке. Второй элемент рассчитывается просто путем проверки, содержит ли вторая строка первую.

Вот еще одно решение для второго пункта; На 2 байта короче, но очень немногие браузеры поддерживают это:

p&&c.includes(a)

Проверка, не содержит ли вторая строка первую,GNU: Gnus nettle unicorns
edc65

Пожалуйста, проверьте еще раз: попробовал и даже не работает: ReferenceError: l is not defined(отсутствует l=раньше toLowerCase)
edc65 21.10.15

... исправил эту ошибку, она не работает 'GNU','GNU is not unix'(тестовый пример 4) должен быть ложным, ложным
edc65

@ edc65 Черт, я стер l=, ища ошибку, и забыл ее вернуть. Спасибо, что подняли это! Другой контрольный пример также должен быть исправлен.
ETHproductions

0

Пайк (без публикации при публикации), (неконкурентный), 20 байт

l1c"jFh)J"iQl1qDji{&

Вы можете найти исходный код здесь , язык совершенно нестабилен (первый тестовый вызов для него), поэтому не ожидайте, что он будет работать в будущем (commit 8)

Или 18 байт (стабильный)

l1idcmhsRl1jqDji{&

Попробуй это здесь!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.