Akronimy mogą oczywiście zawęzić czujniki wiadomości


36

Z tego powodu potrzebujesz lepszego sposobu ustalenia, czy fraza jest akronimem słowa. Uważasz również, że warto sprawdzić, czy dane wyrażenie i słowo są rekurencyjnymi akronimami.

Twoje zadanie:

Biorąc pod uwagę słowo, a następnie frazę oddzieloną wierszem, wypisz, czy fraza jest akronimem, a następnie, jeśli jest akronimem rekurencyjnym . (Fraza zawiera to, co oznacza)

  • Dane wejściowe będą się składać ze znaków alfabetycznych oraz spacji.
  • W twoim programie nie powinna być rozróżniana wielkość liter.

Przykład wejścia / wyjścia:

Przypadek 1:

Wkład:

Acronyms
Acronyms can really obviously narrow your message sensors

Wydajność:

True 
True

Przypadek 2:

Wkład:

FAQ
frequently asked questions

Wydajność:

True 
False

Przypadek 3:

Wkład:

foo
bar baz

Wydajność:

False
False

Przypadek 4:

Wkład:

GNU
GNU is not Unix

Wydajność:

False
False

Przypadek 5:

Wkład:

Aha
A huge Aha

Wydajność:

True
True

69
Akronimy mogą się powtarzać? O! Teraz masz sens.
Geobits

2
Nie, o ile jest jasne, jaki jest wynik
Blue

9
To przypomina mi XKCD: xkcd.com/917
ETHproductions


4
ABCDE: Kolejny podstawowy, jasno określony przykład.
John Dvorak,

Odpowiedzi:


10

Pyth, 19 18

&pqJrz0hCKcrw0)}JK

Ten drukuje wynik w dość dziwnym formacie, jak: TrueFalse.

Możesz wypróbować online lub uruchomić pakiet testowy .

Wyjaśnienie:

&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

Zaoszczędź sporo bajtów dzięki SOPython.

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

Najbardziej skomplikowaną częścią tego rozwiązania jest h=tuple(a)==next(zip(*d)).
Spowoduje to rozpakowanie listy ddo formatu zip, a następnie wywołania, nextaby zwrócić krotkę pierwszego elementu każdej przekazywanej iteracji, do zipktórej jest następnie porównywana z krotką każdej litery w ( tuple(a)).


Można zaoszczędzić 7 bajtów przez podstawienie [0]==l za .startswith(l).
Skyler

7

CJam, 21 20 bajtów

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

Wypróbuj to skrzypce w interpretatorze CJam lub zweryfikuj wszystkie przypadki testowe jednocześnie.

Jak to działa

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 bajtów

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

Format wyjściowy nie jest ściśle określony, więc zwracam parę wartości logicznych, np. p "Aha\na huge arm"-> (True,False).


Dzisiaj dowiedziałem się o strażnikach wzorców ( <-) - dzięki!
wchargin

4

Scala, 135 110 108 bajtów

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

Zaoszczędziłem kilka bajtów, używając argumentów wiersza poleceń (dzięki J Atkin za podpowiedź), wypisując booleany jako tupel, używając mkStringzamiast new Stringi drukuj zamiast println.

EDYCJA: Źle zinterpretował pytanie i musiał ponownie wdrożyć rozwiązanie


3

Python 3, 106 bajtów

Cóż, przynajmniej pokonał Scalę;)

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 Prawdopodobnie więcej wyjaśnień na temat każdego przykładu zapobiegnie temu innemu.
Beta Decay

Czy pomogłoby więcej czasu w piaskownicy? W moim (oczywiście raczej ograniczonym) doświadczeniu otrzymujesz odpowiedzi tylko wtedy, gdy jest prawie na szczycie
Blue

@muddyfish Cóż, nie wiem, jak długo to zostawiłeś, więc nie wiem
Beta Decay

Zostawiłem go tam przez około dzień
Blue

@muddyfish Tydzień jest zalecaną normą
Beta Decay

3

AppleScript, 302 301 297 293 bajtów

Och, do diabła tak. Nawet nie przejmowałem się tym, że przegrałem, to jest konkurencyjne dla AppleScript.

ustaw x na (wyświetl okno dialogowe „domyślna odpowiedź” ”)
ustaw y na (wyświetl okno dialogowe „domyślna odpowiedź” ”) słowa zwrócone
ustaw n na liczbę pozycji y
powtórz n
próbować
jeśli nie, znak y oznacza n znak 1 = (x jako tekst) znak n, to zwróć {false, false}
koniec
ustaw n na n-1
koniec
return {true, x jest w y}

Dane wyjściowe jako:

{prawda fałsz}

Lub cokolwiek by się nie wydarzyło.


2

PHP, 120 bajtów

Niewielkie rozróżnianie wielkości liter ma duże znaczenie (26 bajtów). Przeszedł wszystkie przypadki testowe:

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

Zwraca dwie wartości bool w tej formie:

bool(true)
bool(false)

Odczytuje dwa argumenty z wiersza poleceń, takie jak:

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

Bez golfa

$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

Rubin, 77 74 bajty

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

1

Ruby, 52 bajty

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

Przykład:

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

1

Matlab, 90 bajtów

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

Przykład (zauważ, że Matlab wyświetla true/ falseas 1/ 0):

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

1

JavaScript ES6, 95 92 bajtów

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

Wprowadź oba ciągi jako parametry. Zwraca tablicę z dwiema wartościami: po jednej dla każdego logicznego.


1
Nie pomyślałbym o użyciu wyrażenia regularnego zamiast .indexOf. Dobra robota! Być może r=eval(`/^${a}$/i`)działałby zamiast aktualnej rkonfiguracji.
ETHprodukcje

@ETHproductions a ja z kolei nie pomyślałby o evalpostaci RegExpobiektu skracania. Dzięki za wskazówkę!
Mwr247,

0

GNU sed, 118 bajtów

Wymaga -rflagi, zawartej w wyniku jako +1. Zauważ, że używam \bdo dopasowania granicy słowa, chociaż nie mogę znaleźć tego udokumentowanego w GNU sed. To działa dla mnie ...

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

Rozszerzony:

#!/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 bajtów

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

Format wyjściowy to. [bool, bool]To pobiera dane wejściowe z argumentów wiersza poleceń.


0

Lua 5.3, 182 bajty

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 bajty

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

Stosowanie:

> 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 bajtów

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)}'
  • Zainicjuj, T="True";F="False"aby uprościć wyjście.
  • NR*NF<2{a=tolower($1)}: set a tylko, jeśli pierwszy wiersz ma tylko jedno pole.
  • END{...}: zakładając tylko dwie linie ...
    • for(i=1;i<=NF;i++)b=b substr(tolower($i),1,1): konstruuj akronim rekurencyjny.
    • print(a==b?T:F)"\n"(a==tolower($1)?T:F): wydrukuj wyniki obu porównań a==bi a==tolower($1).

Jeśli ktoś wie, jak zoptymalizować rekursywną konstrukcję akronimu, nie krępuj się zasugerować.


0

SpecBAS - 144 bajty

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

Konwersja 2 x danych wejściowych na wielkie litery zapisuje znaki vs. konwersja małych liter. Może teraz mieć wiele przypisań wykonanych w jednej LETinstrukcji, co również pomaga. I TEXTratuje jedną postaćPRINT .

Używa 1/0, aby pokazać prawda / fałsz (apostrof po prostu przenosi dane wyjściowe do następnego wiersza).


0

Perl5, 90 bajtów

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

oszukiwanie trochę: 0 = wszystkie fałszywe, 1 = jedna prawda, 2 = oba prawdziwe. Nie jestem golfistą, ale denerwuje mnie perl podczas przeglądania!

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

Przetestuj poniższy fragment kodu w dowolnej przeglądarce zgodnej 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 bajtów

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

Shucks ... Myślałem, że wszystko załatwiłem, ale najwyraźniej się myliłem.

Definiuje to anonimową funkcję, która pobiera dane wejściowe jako dwa ciągi znaków i zwraca oraz tablicę dwóch elementów boolowskich. Pierwszy element jest obliczany przez porównanie pierwszego łańcucha małymi literami z pierwszym znakiem każdego słowa w drugim łańcuchu. Drugi element oblicza się po prostu przez sprawdzenie, czy drugi ciąg znaków zawiera pierwszy.

Oto inne rozwiązanie dla drugiego przedmiotu; 2 bajty krótsze, ale obsługuje go bardzo niewiele przeglądarek:

p&&c.includes(a)

Sprawdzanie, czy drugi ciąg zawiera pierwszy, kończy się niepowodzeniemGNU: Gnus nettle unicorns
edc65

Sprawdź ponownie: wypróbowałem i nawet nie działa: ReferenceError: l is not defined(brakowało l=wcześniej toLowerCase)
edc65

... naprawiłem ten błąd, ponieważ nie działa 'GNU','GNU is not unix'(przypadek testowy 4) powinien być fałszywy, fałszywy
edc65

@ edc65 Shucks, usunąłem l=chwilę, szukając błędu i zapomniałem go przywrócić. Dzięki, że o tym wspomniałeś! Drugi przypadek testowy również powinien zostać naprawiony.
ETHproductions

0

Pyke (po opublikowaniu był bez tytułu), (niekonkurencyjny), 20 bajtów

l1c"jFh)J"iQl1qDji{&

Możesz znaleźć kod źródłowy tutaj , język jest całkowicie niestabilny (pierwsze wyzwanie testowe), więc nie spodziewaj się, że będzie działał w przyszłości (zatwierdzenie 8)

Lub 18 bajtów (stabilny)

l1idcmhsRl1jqDji{&

Wypróbuj tutaj!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.