Скорочення дійсно можуть звузити датчики повідомлень


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
Скорочення можуть повторюватися? Ой! Тепер ти викликаєш сенс.
Геобіць

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

Пітон 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який потім порівнюється з кортежем кожної літери в ( tuple(a)).


Ви можете зберегти 7 байтів, замінивши [0]==l на .startswith(l).
Skyler

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

Збережено кілька байтів, використовуючи аргументи командного рядка (спасибі Дж. Аткіну за підказку), вивівши булеви як тупель, використовуючи mkStringзамість new Stringі друкуючи замість println.

EDIT: Невірно трактували питання, і довелося повторно реалізувати рішення


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 Можливо, більше пояснень кожного прикладу не дозволить цього траплятися іншим людям.
Бета-розпад

Чи допомогло б більше часу в пісочниці? З мого (очевидно, досить обмеженого) досвіду цього, ви отримуєте лише відповіді, хоча це майже на самому верху
Синій

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

Я залишив його там приблизно на добу
Синій

@muddyfish Тиждень - рекомендована норма
бета-розпад

3

AppleScript, 302 301 297 293 байт

Ах, пекло так. Навіть не турбуючись, що я програю, це конкурентоспроможно для AppleScript.

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

Виходи:

{true, false}

Або як би там не було відповіді.


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"

Безумовно

$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)
);


1

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

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

Приклад:

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

1

Матлаб, 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скорочувачем об'єктів. Дякую за пораду!
Mwr247

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

Розширено:

#!/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

Луа 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 = обидві правдиві. Я не гольфіст, але я засмучений, що під час перегляду відсутній перл!

($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

... виправлена ​​помилка, вона не вдається 'GNU','GNU is not unix'(тестовий випадок 4) має бути помилковою, помилковою
edc65

@ edc65 Shucks, я стирав l=час, шукаючи помилку і забув повернути її. Дякуємо, що підняли це! Також слід виправити інший тестовий випадок.
ETHproductions

0

Pyke (без публікації без публікації), (неконкурентоспроможний), 20 байт

l1c"jFh)J"iQl1qDji{&

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

Або 18 байт (стабільно)

l1idcmhsRl1jqDji{&

Спробуйте тут!

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