Les acronymes peuvent bien évidemment limiter vos capteurs de messages


36

Pour cette raison, vous avez besoin d'un meilleur moyen de déterminer si une phrase est l'acronyme d'un mot. Vous pensez également qu'il serait utile de voir si la phrase et le mot en question sont des acronymes récursifs.

Ta tâche:

Soit un mot puis une phrase séparée par une ligne, sortie si la phrase est un acronyme et ensuite s'il s'agit d' un acronyme récursif . (La phrase contient ce qu'elle signifie)

  • L'entrée composera des caractères alphabétiques ainsi que des espaces.
  • Votre programme ne devrait pas être sensible à la casse.

Exemple d'entrée / sortie:

Cas 1:

Contribution:

Acronyms
Acronyms can really obviously narrow your message sensors

Sortie:

True 
True

Cas 2:

Contribution:

FAQ
frequently asked questions

Sortie:

True 
False

Cas 3:

Contribution:

foo
bar baz

Sortie:

False
False

Cas 4:

Contribution:

GNU
GNU is not Unix

Sortie:

False
False

Cas 5:

Contribution:

Aha
A huge Aha

Sortie:

True
True

69
Les acronymes peuvent recurse? Oh! Maintenant, vous faites sens.
Geobits

2
Non, tant que la sortie sera claire
Bleu

9
Cela me rappelle un XKCD: xkcd.com/917
ETHproductions


4
ABCDE: Un autre exemple de base clairement défini.
John Dvorak

Réponses:


10

Pyth, 19 18

&pqJrz0hCKcrw0)}JK

Cette affiche le résultat dans un format assez bizarre, comme: TrueFalse.

Vous pouvez l' essayer en ligne ou exécuter la suite de tests .

Explication:

&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

Sauvegardé un tas d'octets grâce à SOPython.

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

La partie la plus compliquée de cette solution est h=tuple(a)==next(zip(*d)).
Cela décompresse la liste den zip et appelle ensuite nextpour renvoyer un tuple du premier élément de chaque itérable passé dans ziplequel est ensuite comparé un tuple de chaque lettre d'un ( tuple(a)).


Vous pouvez économiser 7 octets en remplaçant [0]==l par .startswith(l).
Skyler

7

CJam, 21 à 20 octets

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

Essayez ce violon dans l’interprète CJam ou vérifiez tous les tests en même temps.

Comment ça marche

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 octets

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

Le format de sortie n'est pas strictement défini, je renvoie donc une paire de booléens, par exemple p "Aha\na huge arm"-> (True,False).


Aujourd'hui, j'ai entendu parler des patrons de modèle ( <-) - merci!
wchargin

4

Scala, 135 110 108 octets

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

Sauvegardé quelques octets en utilisant des arguments en ligne de commande (merci à J Atkin pour le conseil), en mettant les booléens en tant que tupel, en utilisant mkStringplutôt que new Stringet print au lieu de println.

EDIT: a mal interprété la question et a dû réimplémenter la solution


3

Python 3, 106 octets

Au moins, ça a battu 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 Peut-être une explication plus détaillée de chaque exemple empêcherait-elle que cela se produise à d'autres personnes.
Beta Decay

Plus de temps dans le bac à sable aurait-il aidé? D'après mon expérience (évidemment assez limitée), vous n'obtenez que des réponses alors que c'est presque au sommet
Blue

@muddyfish Eh bien, je ne sais pas combien de temps tu l'as laissé, donc, je ne sais pas
Beta Decay,

Je l'ai laissé là pendant une journée environ
Bleu

@muddyfish Une semaine est la norme recommandée
Beta Decay

3

AppleScript, 302 301 297 293 octets

Aw, putain ouais. Pas même dérangé que je perds, c'est compétitif pour AppleScript.

mettre x à (le dialogue d'affichage "" la réponse par défaut "") est retourné
mettre y à (dialogue d'affichage "" réponse par défaut "") les mots retournés
mettre n au nombre d'éléments de y
répéter n
essayer
sinon, le caractère n de l'élément de y 1 = le caractère n de (x en tant que texte) alors retourne {false, false}
fin
mettre n à n-1
fin
return {true, x est dans y}

Sorties en tant que:

{vrai faux}

Ou quelle que soit la réponse qui se trouve être.


2

PHP, 120 octets

Ne pas être sensible à la casse fait beaucoup de poids (26 octets). A réussi tous les cas de test:

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

Affiche deux valeurs bool sous cette forme:

bool(true)
bool(false)

Lit deux arguments depuis la ligne de commande, comme:

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

Rubis, 77 74 octets

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

1

Ruby, 52 octets

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

Exemple:

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

1

Matlab, 90 octets

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

Exemple (notez que Matlab affiche true/ falseas 1/ 0):

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

1

JavaScript ES6, 95 92 octets

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

Entrez les deux chaînes en tant que paramètres. Affiche un tableau avec deux valeurs: une pour chaque booléen.


1
Je n'aurais pas pensé à utiliser un regex à la place de .indexOf. Bon travail! Cela r=eval(`/^${a}$/i`)fonctionnerait peut - être à la place de votre rconfiguration actuelle .
ETHproductions

@ETHproductions Et moi, je n'aurais pas pensé evalà un RegExpraccourcisseur d'objets. Merci pour le conseil!
Mwr247

0

GNU sed, 118 bytes

Nécessite un -rdrapeau, inclus dans le score en tant que +1. Notez que j'utilise \bune correspondance de limite de mot, même si je ne trouve pas cela documenté dans GNU sed. Ça marche pour moi ...

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

Étendu:

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

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

Le format de sortie est [bool, bool]. Ceci est pris à partir des arguments de la ligne de commande.


0

Lua 5.3, 182 octets

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 octets

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 octets

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)}'
  • Initialiser T="True";F="False"pour simplifier la sortie.
  • NR*NF<2{a=tolower($1)}: défini auniquement si la première ligne n'a qu'un seul champ.
  • END{...}: en supposant que deux lignes ...
    • for(i=1;i<=NF;i++)b=b substr(tolower($i),1,1): construit un acronyme récursif.
    • print(a==b?T:F)"\n"(a==tolower($1)?T:F): affiche le résultat des deux comparaisons, a==bet a==tolower($1).

Si quelqu'un sait comment optimiser la construction d'un acronyme récursif, n'hésitez pas à le suggérer.


0

SpecBAS - 144 octets

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

La conversion des 2 entrées en majuscules enregistre les caractères par rapport à la conversion en minuscules. Peut maintenant avoir plusieurs affectations effectuées dans une seule LETdéclaration, ce qui aide également. Et TEXTsauve un personnage surPRINT .

Utilise 1/0 pour montrer vrai / faux (l'apostrophe déplace simplement la sortie vers la ligne suivante).


0

Perl5, 90 octets

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

tricher un peu: 0 = tout faux, 1 = un vrai, 2 = tous les deux. Je ne suis pas un golfeur, mais je suis contrarié, mais Perl manque lors de la navigation!

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

Testez l'exécution de l'extrait de code ci-dessous dans tout navigateur compatible 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 octets

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

Shucks ... Je pensais avoir tout réglé, mais apparemment, je me suis trompé.

Ceci définit une fonction anonyme qui prend en entrée deux chaînes, et retourne un tableau de deux éléments booléens. Le premier élément est calculé en comparant la première chaîne en minuscule au premier caractère de chaque mot de la deuxième chaîne. Le deuxième élément est calculé simplement en vérifiant si la deuxième chaîne contient le premier.

Voici une autre solution pour le deuxième élément; 2 octets plus courts, mais très peu de navigateurs le supportent:

p&&c.includes(a)

Vérifier si la deuxième chaîne contient la première échoue pourGNU: Gnus nettle unicorns
edc65

Veuillez vérifier à nouveau: essayé et ne fonctionne même pas: ReferenceError: l is not defined(manquant l=avant toLowerCase)
edc65

... corrigé ce bogue, il échoue pour 'GNU','GNU is not unix'(test 4) devrait être false, false
edc65

@ edc65 Shucks, j'ai effacé le l=tout en recherchant un bogue et j'ai oublié de le remettre. Merci de mentionner cela! L'autre cas de test doit également être corrigé.
ETHproductions

0

Pyke (sans titre lors de la publication), (non compétitif), 20 octets

l1c"jFh)J"iQl1qDji{&

Vous pouvez trouver le code source ici , la langue est complètement instable (premier test de test pour celui-ci) alors ne vous attendez pas à ce qu'il fonctionne à l'avenir (commit 8)

Ou 18 octets (stable)

l1idcmhsRl1jqDji{&

Essayez-le ici!

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.