Acrônimos podem, obviamente, restringir seus sensores de mensagens


36

Por esse motivo, você precisa de uma maneira melhor de resolver se uma frase é um acrônimo de uma palavra. Você também acha que vale a pena ver se a frase e a palavra em questão são acrônimos recursivos.

Sua tarefa:

Dada uma palavra e, em seguida, uma frase separada por uma linha, produza se a frase for um acrônimo e, em seguida, se for um acrônimo recursivo . (A frase contém o que significa)

  • A entrada comporá caracteres alfabéticos, bem como espaços.
  • Seu programa não deve fazer distinção entre maiúsculas e minúsculas.

Exemplo de entrada / saída:

Caso 1:

Entrada:

Acronyms
Acronyms can really obviously narrow your message sensors

Saída:

True 
True

Caso 2:

Entrada:

FAQ
frequently asked questions

Saída:

True 
False

Caso 3:

Entrada:

foo
bar baz

Saída:

False
False

Caso 4:

Entrada:

GNU
GNU is not Unix

Saída:

False
False

Caso 5:

Entrada:

Aha
A huge Aha

Saída:

True
True

69
Acrônimos podem recorrer? Oh! Agora você está fazendo sentido.
Geobits 19/10/2015

2
Não, apenas contanto que é claro que a saída é
azul

9
Isso me lembra um XKCD: xkcd.com/917
ETHproductions


4
ABCDE: Outro exemplo básico claramente definido.
John Dvorak

Respostas:


10

Pitão, 19 18

&pqJrz0hCKcrw0)}JK

Este imprime o resultado em um formato bastante estranho, como: TrueFalse.

Você pode experimentá-lo online ou executar o Conjunto de Testes .

Explicação:

&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

Economizou um monte de bytes graças ao SOPython.

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

A parte mais complicada desta solução é h=tuple(a)==next(zip(*d)).
Isso descompacta a lista dno zip e, em seguida, chama nextpara retornar uma tupla do primeiro elemento de cada iterável passado para o zipqual é comparada com uma tupla de cada letra em um ( tuple(a)).


Você pode economizar 7 bytes, substituindo [0]==l para .startswith(l).
Skyler #

7

CJam, 21 20 bytes

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

Experimente este violino no intérprete CJam ou verifique todos os casos de teste de uma só vez.

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

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

O formato de saída não é estritamente definido, então retorno um par de booleanos, por exemplo p "Aha\na huge arm"- -> (True,False).


Hoje eu aprendi sobre guardas de padrões ( <-) - obrigado!
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))

Economizou alguns bytes usando argumentos de linha de comando (graças a J Atkin pela dica), colocando os booleanos como um tupel, usando em mkStringvez de new Stringe imprima em vez de println.

EDIT: interpretou mal a pergunta e teve que reimplementar a solução


3

Python 3, 106 bytes

Bem, pelo menos, venceu 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 Possivelmente mais explicações sobre cada exemplo impediriam que isso acontecesse com outras pessoas.
Beta Decay

Mais tempo na caixa de areia teria ajudado? Na minha experiência (obviamente bastante limitado) dele, você só obter respostas, enquanto é quase no topo
Azul

@muddyfish Bem, eu não sei quanto tempo você deixou assim, eu não sei #
Decay Beta

Eu deixei lá por cerca de um dia #
1919

@muddyfish Uma semana é a norma recomendada
Beta Decay

3

AppIeScript, 302 301 297 293 Bytes

Ah, inferno, sim. Nem mesmo incomodado com a perda, isso é competitivo para o AppleScript.

defina x como (texto da caixa de diálogo "" resposta padrão "") retornado
defina y para (exibir o texto da caixa de diálogo "" resposta padrão "")
defina n para o número de itens de y
repita n
experimentar
se não for o item de y, o caractere de n 1 = (x como texto) o caractere de n, retorne {false, false}
fim
defina n para n-1
fim
return {true, x está em y}

Saídas como:

{verdadeiro falso}

Ou qualquer que seja a resposta.


2

PHP, 120 bytes

Não fazer distinção entre maiúsculas e minúsculas é muito pesado (26 bytes). Passou em todos os casos de teste:

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

Gera dois valores booleanos neste formulário:

bool(true)
bool(false)

Lê dois argumentos da linha de comando, como:

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

Rubi, 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

Exemplo:

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

Exemplo (observe que o Matlab exibe true/ falsecomo 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))]

Insira as duas strings como parâmetros. Gera uma matriz com dois valores: um para cada booleano.


1
Eu não teria pensado em usar uma regex no lugar de .indexOf. Bom trabalho! Talvez r=eval(`/^${a}$/i`)funcione no lugar da sua rconfiguração atual .
ETHproductions

@ETHproductions E eu, por sua vez, não consideraria evalum RegExpencurtador de objeto. Obrigado pela dica!
Mwr247

0

GNU sed, 118 bytes

Requer -rsinalizador, incluído na pontuação como +1. Observe que estou usando \bpara uma correspondência de limite de palavras, mesmo que não possa encontrar isso documentado no GNU sed. Ele funciona para mim ...

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

0

Groovy, 91 bytes

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

O formato de saída é [bool, bool]. Isso recebe sua entrada da linha de comando 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=""))

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

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)}'
  • Inicialize T="True";F="False"para simplificar a saída.
  • NR*NF<2{a=tolower($1)}: definido aapenas se a primeira linha tiver apenas um campo.
  • END{...}: assumindo apenas duas linhas ...
    • for(i=1;i<=NF;i++)b=b substr(tolower($i),1,1): constrói acrônimo recursivo.
    • print(a==b?T:F)"\n"(a==tolower($1)?T:F): imprime a saída das duas comparações a==be a==tolower($1).

Se alguém souber otimizar a construção da sigla recursiva, fique à vontade para sugerir.


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

A conversão das 2 x entradas em maiúsculas salva caracteres vs. conversão em minúsculas. Agora pode ter várias atribuições feitas em uma LETdeclaração, o que também ajuda. E TEXTsalva um personagem PRINT.

Usa 1/0 para mostrar verdadeiro / falso (o apóstrofo apenas move a saída para a próxima linha).


0

Perl5, 90 bytes

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

trapaceando um pouco: 0 = tudo falso, 1 = um verdadeiro, 2 = ambos verdadeiros. Eu não sou um jogador de golfe, mas estou chateado porque o perl está ausente enquanto navega!

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

Teste a execução do snippet abaixo em qualquer navegador compatível com 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 bytes

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

Shucks ... Eu pensei que tinha tudo resolvido, mas aparentemente eu estava errado.

Isso define uma função anônima que recebe entrada como duas cadeias e retorna e matriz de dois itens booleanos. O primeiro item é calculado comparando a primeira string em todas as minúsculas com o primeiro caractere de cada palavra na segunda string. O segundo item é calculado simplesmente verificando se a segunda string contém a primeira.

Aqui está outra solução para o segundo item; 2 bytes mais curtos, mas poucos navegadores suportam:

p&&c.includes(a)

Verificando se a segunda string contém a primeira falhaGNU: Gnus nettle unicorns
edc65

Por favor, verifique novamente: tentei e nem sequer trabalho: ReferenceError: l is not defined(faltando l=antes toLowerCase)
edc65

... fixo que bug, ele falha para 'GNU','GNU is not unix'(caso de teste 4) deve ser falso, falsa
edc65

@ edc65 Shucks, apaguei o l=tempo procurando um bug e esqueci de colocá-lo de volta. Obrigado por trazer isso à tona! O outro caso de teste também deve ser corrigido.
ETHproductions

0

Pyke (sem título quando publicado), (não competitivo), 20 bytes

l1c"jFh)J"iQl1qDji{&

Você pode encontrar o código fonte aqui , a linguagem é completamente instável (primeiro desafio de teste), portanto, não espere que ela funcione no futuro (commit 8)

Ou 18 bytes (estável)

l1idcmhsRl1jqDji{&

Experimente aqui!

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.