Akronyme können Ihre Nachrichtensensoren wirklich offensichtlich einschränken


36

Aus diesem Grund müssen Sie besser herausfinden, ob eine Phrase ein Akronym für ein Wort ist. Sie denken auch, dass es sich lohnen würde, zu prüfen, ob die betreffende Phrase und das betreffende Wort rekursive Akronyme sind.

Deine Aufgabe:

Geben Sie ein Wort und dann eine durch eine Linie getrennte Phrase aus, wenn die Phrase ein Akronym und dann ein rekursives Akronym ist . (Die Phrase enthält, wofür sie steht.)

  • Die Eingabe besteht aus alphabetischen Zeichen sowie Leerzeichen.
  • Ihr Programm sollte nicht zwischen Groß- und Kleinschreibung unterscheiden.

Beispiel Input / Output:

Fall 1:

Eingang:

Acronyms
Acronyms can really obviously narrow your message sensors

Ausgabe:

True 
True

Fall 2:

Eingang:

FAQ
frequently asked questions

Ausgabe:

True 
False

Fall 3:

Eingang:

foo
bar baz

Ausgabe:

False
False

Fall 4:

Eingang:

GNU
GNU is not Unix

Ausgabe:

False
False

Fall 5:

Eingang:

Aha
A huge Aha

Ausgabe:

True
True

69
Akronyme können wiederkehren? Oh! Jetzt machst du Sinn.
Geobits

2
Nein, nur solange klar ist, was die Ausgabe ist
Blue

9
Dies erinnert mich an eine XKCD: xkcd.com/917
ETHproductions


4
ABCDE: Ein weiteres klar definiertes Beispiel.
John Dvorak

Antworten:


10

Pyth, 19 18

&pqJrz0hCKcrw0)}JK

Dies gibt das Ergebnis in ein ziemlich seltsam Format, wie: TrueFalse.

Sie können es online ausprobieren oder die Test Suite ausführen .

Erläuterung:

&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

Dank SOPython wurden viele Bytes gespeichert.

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

Der komplizierteste Teil dieser Lösung ist h=tuple(a)==next(zip(*d)).
Dies entpackt die Liste din zip und ruft dann nextauf, ein Tupel des ersten Elements jeder übergebenen Iterationsdatei zurückzugeben, zipdas dann mit einem Tupel jedes Buchstabens in a ( tuple(a)) verglichen wird .


Sie können 7 Bytes speichern durch Substitution [0]==l für .startswith(l).
Skyler

7

CJam, 21 20 Bytes

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

Probieren Sie diese Geige im CJam-Interpreter aus oder überprüfen Sie alle Testfälle auf einmal.

Wie es funktioniert

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 Bytes

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

Das Ausgabeformat ist nicht streng definiert, daher gebe ich zwei Boolesche Werte zurück, z . B. p "Aha\na huge arm"-> (True,False).


Heute habe ich von Pattern Guards ( <-) erfahren - danke!
Wchargin

4

Scala, 135 110 108 Bytes

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

Sparte ein paar Bytes mit Kommandozeilenargumenten (danke an J Atkin für den Hinweis), wobei die Booleschen Werte als Tupel ausgegeben wurden, mkStringanstatt mitnew String and print instead of println.

EDIT: Misinterpreted the question, and had to reimplement the solution


3

Python 3, 106 bytes

Well, at least it beat Scala ;)

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 Possibly more explanation of each examples would prevent this from happening to other people.
Beta Decay

Would more time in the sandbox have helped? In my (obviously rather limited) experience of it, you only get responses whilst it's nearly at the top
Blue

@muddyfish Well I don't know how long you left it so, I don't know
Beta Decay

I left it there for about a day
Blue

@muddyfish A week is the recommended norm
Beta Decay

3

AppleScript, 302 301 297 293 Bytes

Aw, hell yeah. Not even bothered that I lose, this is competitive for AppleScript.

set x to(display dialog""default answer"")'s text returned
set y to(display dialog""default answer"")'s text returned's words
set n to y's items's number
repeat n
try
if not y's item n's character 1=(x as text)'s character n then return{false,false}
end
set n to n-1
end
return{true,x is in y}

Outputs as:

{true, false}

Or whatever the answer happens to be.


2

PHP, 120 bytes

Not being case sensitive is a lot of weight (26 bytes). Passed all test cases:

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

Outputs two bool values in this form:

bool(true)
bool(false)

Reads two arguments from the command line, like:

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

Ruby, 77 74 bytes

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

1

Ruby, 52 bytes

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

Example:

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

1

Matlab, 90 bytes

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

Example (note that Matlab displays true/ false as 1/ 0):

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

1

JavaScript ES6, 95 92 bytes

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

Input both strings as parameters. Outputs an array with two values: one for each boolean.


1
I wouldn't have thought of using a regex in place of .indexOf. Nice work! Perhaps r=eval(`/^${a}$/i`) would work in place of your current r setup.
ETHproductions

@ETHproductions And I in turn wouldn't have thought of eval as a RegExp object shortener. Thanks for the tip!
Mwr247

0

GNU sed, 118 bytes

Requires -r flag, included in score as +1. Note that I'm using \b for a word-boundary match, even though I can't find this documented in GNU sed. It Works For Me...

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 bytes

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

Output format is [bool, bool].This takes it's input from the command line args.


0

Lua 5.3, 182 bytes

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 bytes

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

Usage:

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

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)}'
  • Initialize T="True";F="False" to simplify output.
  • NR*NF<2{a=tolower($1)}: set a only if the first line only has one field.
  • END{...}: assuming only two lines...
    • for(i=1;i<=NF;i++)b=b substr(tolower($i),1,1): construct recursive acronym.
    • print(a==b?T:F)"\n"(a==tolower($1)?T:F): print the output of both comparisons, a==b and a==tolower($1).

If anyone knows how to optimize the recursive acronym construction, feel free to suggest.


0

SpecBAS - 144 Bytes

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

Das Konvertieren der 2 x-Eingaben in Großbuchstaben spart Zeichen gegenüber der Kleinbuchstabenkonvertierung. Es können jetzt mehrere Zuweisungen in einer LETAnweisung ausgeführt werden, was ebenfalls hilfreich ist. Und TEXTspeichert ein Zeichen vorbeiPRINT.

Verwendet 1/0, um true / false anzuzeigen (das Apostroph verschiebt die Ausgabe nur in die nächste Zeile).


0

Perl5, 90 Bytes

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

ein bisschen schummeln: 0 = alles falsch, 1 = eins wahr, 2 = beides wahr. Ich bin kein Golfer, aber verärgert, dass Perl beim Surfen fehlt!

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

Testen Sie das folgende Snippet in einem beliebigen EcmaScript 6-kompatiblen Browser

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 Bytes

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

Shucks ... Ich dachte, ich hätte alles geklärt, aber anscheinend habe ich mich geirrt.

Dies definiert eine anonyme Funktion, die Eingaben als zwei Zeichenfolgen akzeptiert und ein Array von zwei booleschen Elementen zurückgibt. Das erste Element wird berechnet, indem die erste Zeichenfolge in Kleinbuchstaben mit dem ersten Zeichen jedes Wortes in der zweiten Zeichenfolge verglichen wird. Das zweite Element wird einfach berechnet, indem überprüft wird, ob der zweite String den ersten enthält.

Hier ist eine andere Lösung für den zweiten Punkt; 2 Bytes kürzer, aber nur sehr wenige Browser unterstützen dies:

p&&c.includes(a)

Die Überprüfung, ob die zweite Zeichenfolge die erste enthält, schlägt fürGNU: Gnus nettle unicorns
edc65

Bitte nochmal prüfen: probiert es und funktioniert nicht mal: ReferenceError: l is not defined(fehlt l=vorher toLowerCase)
edc65

... diesen Fehler behoben, der fehlschlägt, da 'GNU','GNU is not unix'(Testfall 4) falsch sein sollte, false
edc65 21.10.15

@ edc65 Shucks, ich habe das l=beim Suchen nach einem Bug gelöscht und vergessen, es wieder einzulegen . Danke, dass du das angesprochen hast! Der andere Testfall sollte ebenfalls behoben werden.
ETHproductions

0

Pyke (bei Veröffentlichung ohne Titel), (nicht wettbewerbsfähig), 20 Byte

l1c"jFh)J"iQl1qDji{&

Den Quellcode finden Sie hier . Die Sprache ist vollständig instabil (erste Testanforderung). Erwarten Sie also nicht, dass sie in Zukunft funktioniert (Commit 8).

Oder 18 Bytes (stabil)

l1idcmhsRl1jqDji{&

Probieren Sie es hier aus!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.