Gli acronimi possono ovviamente restringere i sensori dei messaggi


36

Per questo motivo, hai bisogno di un modo migliore per capire se una frase è l'acronimo di una parola. Pensi anche che varrebbe la pena vedere se la frase e la parola in questione sono acronimi ricorsivi.

Il tuo compito:

Dato una parola e poi una frase separate da una riga, vengono emessi se la frase è un acronimo e quindi se si tratta di un acronimo ricorsivo . (La frase contiene ciò che rappresenta)

  • L'input sarà composto da caratteri alfabetici e spazi.
  • Il tuo programma non dovrebbe fare distinzione tra maiuscole e minuscole.

Esempio di input / output:

Caso 1:

Ingresso:

Acronyms
Acronyms can really obviously narrow your message sensors

Produzione:

True 
True

Caso 2:

Ingresso:

FAQ
frequently asked questions

Produzione:

True 
False

Caso 3:

Ingresso:

foo
bar baz

Produzione:

False
False

Caso 4:

Ingresso:

GNU
GNU is not Unix

Produzione:

False
False

Caso 5:

Ingresso:

Aha
A huge Aha

Produzione:

True
True

69
Gli acronimi possono ricorrere? Oh! Ora stai dando un senso.
Geobits,

2
No, purché sia ​​chiaro quale sia l'output
Blue

9
Questo mi ricorda un XKCD: xkcd.com/917
ETHproductions


4
ABCDE: un altro esempio di base chiaramente definito.
John Dvorak,

Risposte:


10

Pyth, 19 18

&pqJrz0hCKcrw0)}JK

Questo stampa il risultato in un formato piuttosto strana, come: TrueFalse.

Puoi provarlo online o eseguire Test Suite .

Spiegazione:

&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

Ho salvato un sacco di byte grazie a SOPython.

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

La parte più complicata di questa soluzione è h=tuple(a)==next(zip(*d)).
Questo decomprime l'elenco din zip e quindi chiama nextper restituire una tupla del primo elemento di ogni iterabile passato in zipcui viene quindi confrontato con una tupla di ogni lettera in un ( tuple(a)).


È possibile salvare 7 byte sostituendo [0]==l per .startswith(l).
Skyler,

7

CJam, 21 20 byte

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

Prova questo violino nell'interprete CJam o verifica tutti i casi di test contemporaneamente.

Come funziona

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 byte

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

Il formato di output non è definito in modo rigoroso, quindi restituisco un paio di booleani, ad es. p "Aha\na huge arm"-> (True,False).


Oggi ho appreso dei pattern guards ( <-), grazie!
wchargin,

4

Scala, 135 110 108 byte

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

Salvato alcuni byte usando gli argomenti della riga di comando (grazie a J Atkin per il suggerimento), mettendo i booleani come tupel, usando mkStringinvece dinew String e print invece di println.

EDIT: interpretato male la domanda e ha dovuto reimplementare la soluzione


3

Python 3, 106 byte

Beh, almeno ha battuto la 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 Forse ulteriori spiegazioni di ogni esempio impedirebbero che ciò accada ad altre persone.
Decadimento beta

Sarebbe stato utile più tempo nella sandbox? Nella mia (ovviamente piuttosto limitata) esperienza, ricevi risposte solo quando è quasi al top
Blue

@muddyfish Beh, non so per quanto tempo l'hai lasciato così, non lo so
Decadimento beta

L'ho lasciato lì per circa un giorno
Blue

@muddyfish Una settimana è la norma consigliata
Decadimento beta

3

AppleScript, 302 301 297 293 byte

Ah, diavolo sì. Non mi preoccupo nemmeno di perdere, questo è competitivo per AppleScript.

imposta x su (visualizza la finestra di dialogo "" risposta predefinita "") il testo restituito
imposta y su (visualizza la finestra di dialogo "" risposta predefinita "") il testo restituito dalle parole
imposta n sul numero di articoli di y
ripetere n
provare
in caso contrario, il carattere n di y dell'articolo 1 = il carattere n (x come testo) quindi restituisce {false, false}
fine
imposta n su n-1
fine
return {vero, x è in y}

Uscite come:

{vero falso}

O qualunque sia la risposta.


2

PHP, 120 byte

Non distinguere tra maiuscole e minuscole è molto pesante (26 byte). Superati tutti i casi di 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));

Emette due valori bool in questo modulo:

bool(true)
bool(false)

Legge due argomenti dalla riga di comando, come:

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

Rubino, 77 74 byte

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

1

Rubino, 52 byte

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

Esempio:

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

1

Matlab, 90 byte

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

Esempio (nota che Matlab visualizza true/ falseas 1/ 0):

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

1

JavaScript ES6, 95 92 byte

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

Immettere entrambe le stringhe come parametri. Emette un array con due valori: uno per ogni valore booleano.


1
Non avrei pensato di usare una regex al posto di .indexOf. Bel lavoro! Forse r=eval(`/^${a}$/i`)funzionerebbe al posto della tua rconfigurazione attuale .
ETHproductions

@ETHproductions E a mia volta non avrei pensato evala un RegExpaccorciatore di oggetti. Grazie per il consiglio!
Mwr247,

0

GNU sed, 118 byte

Richiede la -rbandiera, inclusa nel punteggio come +1. Nota che sto usando \buna corrispondenza a confine di parole, anche se non riesco a trovarlo documentato in GNU sed. Esso funziona per 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

Allargato:

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

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

Il formato di output è [bool, bool]. Questo prende il suo input dagli args della riga di comando.


0

Lua 5.3, 182 byte

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 byte

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 byte

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)}'
  • Inizializza T="True";F="False"per semplificare l'output.
  • NR*NF<2{a=tolower($1)}: impostato asolo se la prima riga ha un solo campo.
  • END{...}: presupponendo solo due righe ...
    • for(i=1;i<=NF;i++)b=b substr(tolower($i),1,1): costruire acronimo ricorsivo.
    • print(a==b?T:F)"\n"(a==tolower($1)?T:F): stampa l'output di entrambi i confronti a==be a==tolower($1).

Se qualcuno sa come ottimizzare la costruzione di acronimi ricorsivi, sentiti libero di suggerire.


0

SpecBAS - 144 byte

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 conversione dei 2 ingressi in maiuscolo salva i caratteri rispetto alla conversione in minuscolo. Ora è possibile eseguire più assegnazioni in un'unica LETistruzione, il che aiuta anche. E TEXTsalva un personaggio sopra PRINT.

Usa 1/0 per mostrare vero / falso (l'apostrofo sposta l'output sulla riga successiva).


0

Perl5, 90 byte

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

barare un po ': 0 = tutto falso, 1 = uno vero, 2 = entrambi vero. Non sono un golfista, ma mi manca il perl mentre navigo!

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

Prova a eseguire lo snippet di seguito in qualsiasi browser compatibile 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>


0

JavaScript (ES6), 89 96 95 byte

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

Caspita ... Pensavo di aver risolto tutto, ma apparentemente mi sbagliavo.

Questo definisce una funzione anonima che accetta input come due stringhe e restituisce e array di due elementi booleani. Il primo elemento viene calcolato confrontando la prima stringa in tutte le lettere minuscole con il primo carattere di ogni parola nella seconda stringa. Il secondo elemento viene calcolato semplicemente controllando se la seconda stringa contiene il primo.

Ecco un'altra soluzione per il secondo elemento; 2 byte in meno, ma pochi browser lo supportano:

p&&c.includes(a)

Verifica se la seconda stringa contiene la prima non GNU: Gnus nettle unicorns
riuscita

Ricontrolla: provato e non funziona nemmeno: ReferenceError: l is not defined(mancante l=prima toLowerCase)
edc65

... risolto quel bug, fallisce perché 'GNU','GNU is not unix'(caso di test 4) dovrebbe essere falso, falso
edc65

@ edc65 Shucks, ho cancellato il l=tempo in cerca di un bug e ho dimenticato di rimetterlo. Grazie per averlo sollevato! Anche l'altro caso di test dovrebbe essere risolto.
ETHproductions

0

Pyke (senza titolo quando pubblicato), (non competitivo), 20 byte

l1c"jFh)J"iQl1qDji{&

Puoi trovare il codice sorgente qui , la lingua è completamente instabile (prima prova del test per esso) quindi non aspettarti che funzioni in futuro (commit 8)

O 18 byte (stabile)

l1idcmhsRl1jqDji{&

Provalo qui!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.