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.