Los acrónimos obviamente pueden reducir sus sensores de mensajes

36

Debido a esto, necesita una mejor manera de resolver si una frase es el acrónimo de una palabra. También cree que valdría la pena ver si la frase y la palabra en cuestión son siglas recursivas.

Tu tarea:

Dada una palabra y luego una frase separada por una línea, muestra si la frase es un acrónimo y luego si es un acrónimo recursivo . (La frase contiene lo que significa)

  • La entrada se compondrá de caracteres alfabéticos, así como espacios.
  • Su programa no debe ser sensible a mayúsculas y minúsculas.

Ejemplo de entrada / salida:

Caso 1:

Entrada:

Acronyms
Acronyms can really obviously narrow your message sensors

Salida:

True 
True

Caso 2:

Entrada:

FAQ
frequently asked questions

Salida:

True 
False

Caso 3:

Entrada:

foo
bar baz

Salida:

False
False

Caso 4:

Entrada:

GNU
GNU is not Unix

Salida:

False
False

Caso 5:

Entrada:

Aha
A huge Aha

Salida:

True
True
Azul
fuente
69
¿Pueden recurrirse las siglas? Oh! Ahora estás haciendo sentido.
Geobits
2
No, siempre y cuando esté claro cuál es el resultado
azul
99
Esto me recuerda a un XKCD: xkcd.com/917
ETHproductions
1
Relacionado.
Martin Ender
44
ABCDE: Otro ejemplo básico claramente definido.
John Dvorak

Respuestas:

10

Pyth, 19 18

&pqJrz0hCKcrw0)}JK

Esto imprime el resultado en un formato bastante extraño, como: TrueFalse.

Puede probarlo en línea o ejecutar Test Suite .

Explicación:

&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
FryAmTheEggman
fuente
15

Pitón 3, 89

Ahorré un montón de bytes gracias a SOPython.

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

La parte más complicada de esta solución es h=tuple(a)==next(zip(*d)).
Esto desempaqueta la lista den zip y luego llama nexta devolver una tupla del primer elemento de cada iterable pasado, zipque luego se compara con una tupla de cada letra en un ( tuple(a)).

Morgan Thrapp
fuente
Puede guardar 7 bytes sustituyendo [0]==l por .startswith(l).
Skyler
7

CJam, 21 20 bytes

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

Pruebe este violín en el intérprete de CJam o verifique todos los casos de prueba a la vez.

Cómo funciona

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).
Dennis
fuente
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

El formato de salida no está estrictamente definido, por lo que devuelvo un par de booleanos, por ejemplo, p "Aha\na huge arm"-> (True,False).

nimi
fuente
Hoy me enteré de los guardias de patrones ( <-), ¡gracias!
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))

Ahorré algunos bytes usando argumentos de línea de comando (gracias a J Atkin por la pista), colocando los booleanos como tupel, usando en mkStringlugar de new Stringprint en lugar de println.

EDITAR: malinterpretó la pregunta y tuve que volver a implementar la solución

wastl
fuente
3

Python 3, 106 bytes

Bueno, al menos venció a 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))
Decaimiento Beta
fuente
1
@muddyfish Posiblemente, una mayor explicación de cada ejemplo evitaría que esto le suceda a otras personas.
Beta Decay
¿Habría ayudado más tiempo en el sandbox? En mi experiencia (obviamente bastante limitada), solo obtienes respuestas mientras está casi en la cima
Azul
@muddyfish Bueno, no sé cuánto tiempo lo dejaste, así que no sé
Beta Decay
Lo dejé allí durante aproximadamente un día
Azul
@muddyfish Una semana es la norma recomendada
Beta Decay
3

AppleScript, 302 301 297 293 Bytes

Aw, demonios sí. Ni siquiera se molestó en perder, esto es competitivo para AppleScript.

establezca x en el texto de "diálogo de visualización" "respuesta predeterminada" ") devuelto
establecer y en (mostrar diálogo "" respuesta predeterminada "") el texto devuelto palabras
establecer n en el número de elementos de y
repetir n
tratar
si no es el elemento n de y el carácter 1 = (x como texto) el carácter n y luego devuelve {false, false}
fin
establecer n en n-1
fin
return {verdadero, x está en y}

Salidas como:

{verdadero Falso}

O cualquiera que sea la respuesta.

Addison Crump
fuente
2

PHP, 120 bytes

No ser sensible a mayúsculas y minúsculas es mucho peso (26 bytes). Pasó todos los casos de prueba:

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

Emite dos valores bool de esta forma:

bool(true)
bool(false)

Lee dos argumentos de la línea de comando, como:

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

Sin golf

$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)
);
insertusernamehere
fuente
2

Rubí, 77 74 bytes

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

Ruby, 52 bytes

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

Ejemplo:

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

Matlab, 90 bytes

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

Ejemplo (tenga en cuenta que Matlab muestra true/ falseas 1/ 0):

>> f('Aha', 'A huge Aha')
ans =
     1     1
Luis Mendo
fuente
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))]

Ingrese ambas cadenas como parámetros. Emite una matriz con dos valores: uno para cada booleano.

Mwr247
fuente
1
No habría pensado en usar una expresión regular en lugar de .indexOf. ¡Buen trabajo! Quizás r=eval(`/^${a}$/i`)funcionaría en lugar de su rconfiguración actual .
ETHproductions
@ETHproductions Y, a su vez, no habría pensado evalen RegExpacortar objetos. ¡Gracias por el consejo!
Mwr247
0

GNU sed, 118 bytes

Requiere -rbandera, incluida en el puntaje como +1. Tenga en cuenta que estoy usando\b para una coincidencia de límites de palabras, aunque no puedo encontrar esto documentado en GNU sed. Que funciona para mí ...

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

Expandido:

#!/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
Toby Speight
fuente
0

Groovy, 91 bytes

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

El formato de salida es [bool, bool]. Esto toma su entrada de los argumentos de la línea de comando.

J Atkin
fuente
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)
MeepDarknessMeep
fuente
0

R, 93 bytes

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

Uso:

> 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
plannapus
fuente
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)}'
  • Inicializar T="True";F="False"para simplificar la salida.
  • NR*NF<2{a=tolower($1)}: se establece asolo si la primera línea solo tiene un campo.
  • END{...}: suponiendo solo dos líneas ...
    • for(i=1;i<=NF;i++)b=b substr(tolower($i),1,1): construir acrónimo recursivo.
    • print(a==b?T:F)"\n"(a==tolower($1)?T:F): imprime el resultado de ambas comparaciones a==by a==tolower($1).

Si alguien sabe cómo optimizar la construcción de siglas recursivas, no dude en sugerir.

hjk
fuente
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

La conversión de las 2 entradas x a mayúsculas guarda los caracteres frente a la conversión en minúsculas. Ahora se pueden realizar múltiples tareas en una sola LETdeclaración, lo que también ayuda. YTEXT salva un personaje sobrePRINT .

Utiliza 1/0 para mostrar verdadero / falso (el apóstrofe simplemente mueve la salida a la siguiente línea).

Brian
fuente
0

Perl5, 90 bytes

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

engañando un poco: 0 = todo falso, 1 = uno verdadero, 2 = ambos verdaderos. No soy un jugador de golf, pero estoy molesto porque ¡Perl falta mientras navego!

($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 
Será
fuente
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]

Pruebe a ejecutar el fragmento a continuación en cualquier navegador compatible con 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>

edc65
fuente
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 ... pensé que tenía todo resuelto, pero aparentemente estaba equivocado.

Esto define una función anónima que toma la entrada como dos cadenas y devuelve una matriz de dos elementos booleanos. El primer elemento se calcula comparando la primera cadena en minúsculas con el primer carácter de cada palabra en la segunda cadena. El segundo elemento se calcula simplemente comprobando si la segunda cadena contiene el primero.

Aquí hay otra solución para el segundo elemento; 2 bytes más cortos, pero muy pocos navegadores lo admiten:

p&&c.includes(a)
ETHproducciones
fuente
Comprobando si la segunda cadena contiene la primera falla paraGNU: Gnus nettle unicorns
edc65
Por favor verifique nuevamente: lo intentó y ni siquiera funciona: ReferenceError: l is not defined(falta l=antes toLowerCase)
edc65
... solucionó ese error, falla porque 'GNU','GNU is not unix'(caso de prueba 4) debería ser falso, falso
edc65
@ edc65 Shucks, borré l=mientras buscaba un error y olvidé volver a colocarlo. ¡Gracias por mencionar eso! El otro caso de prueba también debe arreglarse.
ETHproductions
0

Pyke (no tenía título cuando se publicó), (no competitivo), 20 bytes

l1c"jFh)J"iQl1qDji{&

Puedes encontrar el código fuente aquí , el idioma es completamente inestable (primer desafío de prueba para él), así que no espere que funcione en el futuro (commit 8)

O 18 bytes (estable)

l1idcmhsRl1jqDji{&

Pruébalo aquí!

Azul
fuente