Determina se le stringhe sono anagrammi


85

Sfida

Dato due stringhe, risolvi se entrambi hanno esattamente gli stessi caratteri.

Esempio

Ingresso

parola, wrdo

Questo ritorna trueperché sono gli stessi ma sono semplicemente criptati.

Ingresso

parola, wwro

Questo ritorna false.

Ingresso

barca, toba

Questo ritorna true

Regole

Ecco le regole!

  • Supponiamo che l'input abbia una lunghezza di almeno 1 carattere e non più di 8 caratteri.
  • Nessun carattere speciale, solo a-z
  • Tutti gli ingressi possono essere considerati in minuscolo

Casi test

boat, boat = true
toab, boat = true
oabt, toab = true
a, aa = false
zzz, zzzzzzzz = false
zyyyzzzz, yyzzzzzy = true
sleepy, pyels = false
p,p = true

10
9 risposte in 13 visite ... wow!
Tom Gullen,

@Tom, perché tutti volevano dimostrare che il tuo commento sull'uso di un numero intero a 64 bit puntava nella direzione sbagliata: P
Peter Taylor

5
Richiesta titolo: Cod Elf, Go!

5
"Falcon Rage, impazzisci!"
Geobits il

7
Il mio suggerimento per il nome: "sono anagrammi" → "gestisci gli array"
Esolanging Fruit

Risposte:


39

Python, 32 byte

f=lambda a,b,S=sorted:S(a)==S(b)

3
@Debanjan, Questo è lo stesso di def f(a,b):return sorted(a)==sorted(b)Il compromesso è che puoi sostituire def + return con lambda in cambio del mancato utilizzo di dichiarazioni
gnibbler

1
@Debanjan, penso che ti salvi solo un personaggio. Ho usato una variante qui, ma ha la stessa lunghezza della tua perché cambio una nuova riga con una virgola
gnibbler

4
@Tomas, sciocchezze. La questione non specifica programma completo, in modo sia una funzione o un programma completo sono accettabili.
Gnibbler,

2
@Tomas, la maggior parte delle risposte qui non riesce a superare i tuoi criteri. Perché non dare un voto a tutti quelli che lo fanno?
Gnibbler,

4
@Tomas, non è un abuso di regole. Alcune domande sono deliberatamente aperte come questa sembra essere. Confronta con una domanda ben specificata come questa . Se non ti piacciono queste risposte, ti lamenti alla domanda asker
gnibbler,

27

Golfscript, 3 caratteri?

$$=

utilizzo:

'boat'$'baot'$=
1

'toab'$'boat'$=
1

'oabt'$'toab'$=
1

'a'$'aa'$=
0

'zzz'$'zzzzzzzz'$=
0

'zyyyzzzz'$'yyzzzzzy'$=
1

'sleepy'$'pyels'$=
0

'p'$'p'$=
1

23
Questa è un'interpretazione interessante di come fornire l'input :)
gnibbler

4
Spiegazione per favore :(
st0le

10
@ st0le, sul serio? Non conosco golfscript, ma è ovviamente $ (ordina), $ (ordina), = (confronta)
Peter Taylor

11
Questo barare non è un po '? Voglio dire, non è un input variabile. Deve essere codificato. In ogni caso, aggiungerei 4 al conteggio dei caratteri per i caratteri quote ( ').
Thomas Eding,

6
Questo non è valido secondo le nostre regole attuali. È possibile, tuttavia, modificarlo nella funzione a 4 byte di @ JanDvorak, che accetterebbe l'input tramite un formato di input valido .
Maniglia della porta

20

J, 8

-:&(/:~)

Literaly, match ( -:) on ( &) sort up ( /:~)

Esempio di utilizzo:

   'boat' -:&(/:~) 'boat'
1
   'toab' -:&(/:~) 'boat'
1
   'oabt' -:&(/:~) 'toab'
1
   'a' -:&(/:~) 'aa'
0
   'zzz' -:&(/:~) 'zzzzzzzz'
0
   'zyyyzzzz' -:&(/:~) 'yyzzzzzy'
1
   'sleepy' -:&(/:~) 'pyels'
0
   'p' -:&(/:~) 'p'
1

Dove entrano in gioco gli interi a 64 bit?


Non è possibile scrivere funzioni / subroutine in J?

2
@Tim Nordenfur: sono chiamati "verbi", e prendono un argomento alla loro destra come in v arg(monadi) o due su entrambi i lati come in arg1 v arg2(diade). Quello che ho presentato è ovviamente una diade. Non mi sono preoccupato di nominarlo, dal momento che non è stato richiesto ed è più breve in questo modo. Se davvero dovessi dargli un nome, lo faresti in questo modo: is_anagram_of =: -:&(/:~)e poi userai come 'a' is_anagram_of 'aa'.
JB

È stato un po 'economico sostituire gli argomenti nel codice, ma ora vedo che è essenzialmente una diade. Non importa.

29
J sembra sempre i resti di un'esplosione di una fabbrica di emoticon.
via

19

Javascript, 192 157 152 147 125 byte

Ok alcune di queste lingue sono molto più flessibili di quanto pensassi! Comunque questo è il modo più lungo immagino, ma almeno una tecnica diversa.

compressa

Grazie a Peter e David per aver spremuto più caratteri!

for(a=[j=p=2];j<123;)a[j]?p%a[++j]<1&&p++&&(j=0):(a[j]=p,j=0);function b(c,i){return c[i=i||0]?a[c.charCodeAt(i)]*b(c,++i):1}

Quindi fa:

alert(b("hello")==b("elloh"));

Codice espanso

Il compresso ha avuto molti cambiamenti, ma questa è la teoria di base:

// Define dictionary of primes
a = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101];

// Returns the unique ID of the word (order irrelevant)
function b(c) {
    r = 1;
    for (i = 0; i < c.length; i++)
        r *= a[c[i].charCodeAt(0) - 97];
    return r
}

alert(b("hello") == b("hlleo"));

Ottima idea usando i numeri primi.

@Tim grazie! Adesso ho 157.
Tom Gullen,

2
Puoi eliminare un paio di caratteri dall'inizializzazione del dizionario usando il setaccio. a=[2];for(p=3,j=0;j<26;)if(a[j]){if(p%a[j++]==0){p++;j=0}}else{a[j]=p;j=0}
Peter Taylor,

1
@ Tom, dipende da quanto sono ottimizzate le routine di ordinamento, dato che hai limitato input a 8 caratteri: P
Peter Taylor

1
125 caratteri . Ricorsione e ternari FTW:for(a=[j=p=2];j<123;)a[j]?p%a[++j]<1&&p++&&(j=0):(a[j]=p,j=0);function b(c,i){return c[i=i||0]?a[c.charCodeAt(i)]*b(c,++i):1}
David Murdoch,

15

Golfscript, 8 byte

Questo definisce una funzione chiamata A

{$\$=}:A

Casi test

;
'boat' 'boat' A
'toab' 'boat' A
'oabt' 'toab' A
'a' 'aa' A
'zzz' 'zzzzzzzz' A
'zyyyzzzz' 'yyzzzzzy' A
'sleepy' 'pyels' A
'p' 'p' A

11

Haskell, 31 byte

funzione - 31

import List
f=(.sort).(==).sort

programma - 81 58 55

import List
g=sort`fmap`getLine
main=(`fmap`g).(==)=<<g

Uso:

$ runghc anagram.hs
boat
boat
True
$ runghc anagram.hs
toab
boat
True
$ runghc anagram.hs
a
aa
False

Complimenti per Lambdabot e il suo refactoring inutile .


Il codice Haskell che fa solo ciò che si desidera in Runghc, ma non quando viene compilato, può ancora essere chiamato "programma"?
JB

3
@JB: Il codice Perl che fa solo ciò che si desidera è perlancora può essere chiamato un "programma"? :-)
Joey Adams

JB: I linguaggi funzionali odierni alterano il significato di un programma rendendolo un'astrazione di ordine superiore. Piuttosto che un semplice elenco di istruzioni da eseguire, poiché il programma haskell può essere visto solo come una raccolta di funzioni, anche se non vengono chiamate.
Callum Rogers,

@Callum Rogers: il mio punto è: il suo codice si comporta diversamente se eseguito sotto runghc o compilato, in un'area sensibile ai problemi. La "funzione" va bene. Il "programma" non risolve il problema con nient'altro che runghc, e runghc non è l'unico modo legittimo per eseguire programmi Haskell. In quel contesto, ciò rende lo snippet uno "script runghc", non un "programma Haskell". --Non ritengo che il problema sia importante, come ho detto, la funzione va bene comunque ed è più breve.
JB

2
x#y=sort x==sort yè più corto di 1 personaggio
Rotsor

10

C #, 129 caratteri

namespace System.Linq{class X{static void Main(string[]a){Console.Write(a[0].OrderBy(_=>_).SequenceEqual(a[1].OrderBy(_=>_)));}}}

Leggibile:

namespace System.Linq
{
    class X
    {
        static void Main(string[] a)
        {
            Console.Write(a[0].OrderBy(_ => _)
                  .SequenceEqual(a[1].OrderBy(_ => _)));
        }
    }
}

Penso che potresti giocare a golf con pochi byte using System.Linq;invece di spaziarlo tra i nomi?
Stackstuck,

10

Rubino, 34 byte

Utilizzando lo schema IO della soluzione Peter Taylors Perl:

p gets.chars.sort==gets.chars.sort

Emette un errore:-e:1:in '<main>': undefined method 'chars' for nil:NilClass (NoMethodError)
Tomas,

9

Programma C, 118

t[52],i;main(c){for(;i<52;)(c=getchar())<11?i+=26:t[i+c-97]++;
for(i=27;--i&&t[i-1]==t[i+25];);puts(i?"false":"true");}

1
Hai mai preso in considerazione la domanda di IOCCC ?
Mateen Ulhaq,

9
@muntoo: hai visto qualcosa nell'IOCCC? Questo è troppo leggibile per quello.
R. Martinho Fernandes,

@Martinho Sì, i codici sorgente IOCCC sono così belli. Sinfonie. Ma dovrebbe almeno provare a comporre un piccolo pezzo. :)
Mateen Ulhaq

@muntoo: non sapevo nemmeno che fossero ancora attivi.
Joey Adams,

1
Ho appena visto questo ... Molto bello. Ma può essere più breve: t[256],i;main(c){for(;c+3;)(i=getchar())>10?t[i]+=c:(c-=2);for(i=257;--i&&!t[i-1];);puts(i?"false":"true");}- sono 108 caratteri. Molto importante, il tuo ctrucco di inizializzazione è ancora impiegato.
ugoren,

7

Perl, 58 byte

(programma completo, a differenza dell'altra risposta Perl che è solo una funzione)

($c,$d)=map{[sort split//]}<>;print"@$c"eq"@$d"?true:false

49 in funzione

sub f{($c,$d)=map{[sort split//]}<>;"@$c"eq"@$d"}

ovviamente puoi salvare 4 caratteri nel programma rimuovendo il "vero e il falso, dato che senza usare il rigoroso / avvertimento una parola nuda è una stringa.
Joel Berger,


Preferisco questo come ($c,$d)=map{[sort split//]}@ARGV;exit("@$c"ne"@$d")(51 caratteri) in modo che possa accettare argomenti da riga di comando e utilizzare i codici di uscita da riga di comando. Sarebbe trattenere 48 caratteri <>con un input multilinea.
Adam Katz,

6

Clojure - 23 caratteri

Come una funzione anonima:

#(apply = (map sort %))

Esempio di test case:

(#(apply = (map sort %)) ["boat" "boat"])
=> true

Fantastico, mi piace.
Chirone,

1
Bella risposta. Mi piacciono particolarmente le stringhe di test che hai scelto ;-)
coredump

6

JavaScript

Basato sulla soluzione di @ zzzzBov.

Confronto, 65 caratteri (40 senza funzione)

function f(a,b){return a.split('').sort()==b.split('').sort()+""}

Comparatore, 43 caratteri

function f(a){return a.split('').sort()+""}

Intelligente usando il +""per forzare alla stringa.
Casey Chu,

6

C ++ (104 caratteri non-ws)


Basato sul conteggio dell'ordinamento. Nota: presuppone stringhe della stessa lunghezza, che sembrano implicite (sebbene non dichiarate) dalla domanda.

int u[123], i;

int a(char **c) {
    for(; c[0][i]; ) {
        u[c[0][i]]++;
        u[c[1][i++]]--;
    }

    i=123;
    while(i && !u[--i]);
    return !i;
}

In C, se si dichiara una variabile nell'ambito globale, viene inizializzata su zero. Immagino che questo sia vero anche per C ++.
Joey Adams,

Le variabili locali, d'altra parte, non vengono inizializzate automaticamente su zero.
Joey Adams,

OK, ho rimosso il mio avvertimento poiché ho trovato il modo di farne a meno.
Matthew Leggi l'

1
Bzzzt. Passi i casi di test, ma "helle" e "hollo" sono apparentemente uguali. Soluzione semplice: cambia uno dei ++ in un -. Quindi solo se (u [i ++]) restituisce 0;
Dave Gamble,

1
Non l'ho provato, ma le ultime tre righe possono essere scritte comei=123;while(i&&u[--i]);return!i;
st

4

PHP (riga di comando, 87 caratteri)

function d($s){
    return array_count_values(str_split($s));
}

echo d($argv[1]) == d($argv[2]);

4

Javascript

Una versione (molto) leggermente più corta della soluzione di @ zzzzBov, che utilizza al .join()posto del boxe String:

function a(b,c){return b.split('').sort().join()==c.split('').sort().join()}
alert(a('abc','bca')); //true

Allo stesso modo:

function a(b){return b.split('').sort().join()}
alert(a('abc')==a('bca')); //true

3
questa è la risposta ID 1337. congratz
TheDoctor

4

Clojure REPL 41 caratteri

(= (sort (read-line)) (sort (read-line)))

Benvenuti nella rete Stack Exchange. Aiuto per la formattazione qui .
dmckee,

4

Giava

(apparentemente la lingua preferita di tutti!)

173 caratteri:

import java.util.*;class g{public static void main(String[]p){String[]a=p[0].split(""),b=p[1].split("");Arrays.sort(a);Arrays.sort(b);System.out.print(Arrays.equals(a,b));}}

(Non stampa il carattere newline per salvare 2 caratteri da println)

Compila ed esegui:

javac g.java
java -cp . g abcdef fedcba
true

Adoro vederne uno più corto ...


So che sono passati più di 6,5 anni (lol), ma puoi giocarlo a golf di 10 byte aggiungendo java.util.Arrays x=null;e usando x.invece di Arrays.: class g{public static void main(String[]p){java.util.Arrays x=null;String[]a=p[0].split(""),b=p[1].split("");x.sort(a);x.sort(b);System.out.print(x.equals(a,b));}}( 163 byte ) E convertendolo in Java 8, class g{public static void mainpotrebbe anche essere interface g{static void main, ma suppongo che Java 8 non lo fosse ancora in giro nel 2011, quindi anche la conservazione classva bene. ; p
Kevin Cruijssen,

4

sed, 45 caratteri

È persino possibile nel mio preferito - sed! Solo una espressione regolare per risolvere l'anagramma ! Continua a rimuovere le lettere corrispondenti:

:
s/(.)(.*,.*)\1/\2/
t
/\w/{i\false
d}
i\true

(da invocare con -nE)

Perl, 48

1while s/(.)(.*,.*)\1/\2/;$_=/\w/?"false":"true"

Da invocare con -p.

Funzione Perl, 39

sub f{$,while s/(.)(.*,.*)\1/\2/;!/\w/}

4

APL, 2 caratteri

≡⍦

Questa è la funzione Match multiset di Nars2000 , una delle implementazioni APL all'avanguardia. Quando applicato alle stringhe, calcola esattamente la funzione richiesta:

      'elvis' ≡⍦ 'lives'
1
      'alec guinness' ≡⍦ 'genuine class'
1

Solo curioso, quanti byte è questo? 4? 6?
Maltysen,

Dipende dalla codifica. 6 byte in UTF-8, 4 byte in UCS-2, 2 byte se uno qualsiasi dei set di caratteri APL a byte singolo legacy ha il simbolo, di cui dubito.
Tobia,

4

05AB1E , 6 4 byte (non concorrenti)

{I{Q

Provalo online!

Ciò ha richiesto del tempo a causa di difficoltà di input. Abbattuto a causa del pop.

Spiegazione:

{I{Q    Original code

{       Takes first input e.g. word and sorts -> 'dorw'
 I      Takes second input e.g. 'wrdo'
  {     Sorts second input -> 'dorw'
   Q    Compare if sorted 1 = sorted 2, then print result. 'dorw' = 'dorw', so prints 1.

1
Poiché 05AB1E è più recente di questa sfida, questa risposta non è competitiva.
Loovjo,

Scusa, non me ne sono accorto.
Geno Racklin Asher,

4

Perl, 77 75 caratteri

L'I / O del problema non è ben specificato; questo legge due righe da stdin e restituisce true o false a stdout.

sub p{join'',sort split'',$a}$a=<>;$x=p;$a=<>;print$x eq p()?"true":"false"

(Grazie a Tim per 77 -> 75)


Qualcosa è sbagliato. $a=;? Inoltre, puoi saltare le parentesi sorte lo spazio dopo print.

@Tim, il genio che ha sviluppato questa piattaforma per la condivisione del codice in rete ha deciso che nei blocchi di codice le persone avrebbero dovuto sfuggire a meno dei caratteri. Ma hey, non è un grosso problema: non è come se qualcuno li usasse nel codice, giusto? Continua a catturarmi.
Peter Taylor,

2
Ok, ho rimosso il downvote. Potresti voler utilizzare la formattazione del codice in futuro, ovvero un rientro con quattro spazi.

1
Ok, quindi ci sono tre modi per formattare il codice (uno in linea e due blocchi), ed entrambi i blocchi sono scomodi in modi diversi. Sospiro.
Peter Taylor,

4

Perl, 62 byte

Questa funzione accetta le stringhe come argomenti e restituisce vero o falso.

sub f{my@a;for$.(1,-1){$a[ord]+=$.for split//,pop}!grep{$_}@a}

Memorizza i valori ASCII in un array e verifica se uniforma. Incrementi per la prima parola e decrementi per la seconda parola.


4

Python 3, 107 97 76 64

s=sorted;a,b=input().split(', ')
print(str(s(a)==s(b)).lower())

Ovviamente questo può essere abbreviato se non prendiamo letteralmente le parole del PO e minuscole "vero" e "falso" ...


È possibile radere alcuni caratteri se si aggiunge ;s=sortedalla prima riga e quindi si sostituiscono le due istanze di sortedcon con snella seconda riga. Dovrebbe salvare ... 3 caratteri?
Alex Van Liew,

1
Infatti. Python 3 risparmia anche un po 'di spazio ed è probabilmente ragionevole usarlo ora, 5 anni dopo la pubblicazione di questa risposta. Inoltre, .strip () era ridondante, dati gli input specificati.
Wooble,

Si scusa. Non ho notato quanti anni aveva questa domanda quando ho commentato, solo che era in prima pagina. ^^;
Alex Van Liew,

4

Python, 32 byte

p=sorted
f=lambda a,b:p(a)==p(b)

Non fa nulla in Python. Sei sicuro che sia un programma completo che accetta l'input e produce l'output come richiesto?
Tomas,

1
@Tomas È una funzione
TuxCrafting

4

Bash, 88 caratteri

diff <(grep -o .<<<$1|sort) <(grep -o .<<<$2|sort)>/dev/null && echo true || echo false


3

Scala in REPL (32)

readLine.sorted==readLine.sorted

Scala (43)

def f(a:String,b:String)=a.sorted==b.sorted

Programma Scala (61)

object A extends App{println(args(0).sorted==args(1).sorted)}

Questi sfruttano una caratteristica ordinata di Scala in base alla quale una stringa può anche essere trattata come una sequenza di caratteri ( Seq), con tutte le operazioni Seqdisponibili.


3

APL - 13 caratteri

{(⍺[⍋⍺])≡⍵[⍋⍵]}

Chiama in questo modo:

      'boat' {(⍺[⍋⍺])≡⍵[⍋⍵]} 'baot'
1
      'baot' {(⍺[⍋⍺])≡⍵[⍋⍵]} 'boat'
1
      (,'a') {(⍺[⍋⍺])≡⍵[⍋⍵]} 'aa'
0

Nell'ultimo esempio, 'a'rappresenta un singolo carattere e il prefisso ,lo convertirà in una stringa.


3

Java (134 byte)

int[][]c=new int[2][26];
for(int i=0;i<2;i++)for(byte a:args[i].getBytes())c[i][a-97]++;
System.out.print(Arrays.equals(c[0],c[1]));`

Ciò crea un array per contare il numero di volte in cui appare ciascuna lettera, quindi confronta gli array per verificare che siano uguali.


1
Benvenuti in PPCG! Bel primo post! Ci sono 2 spazi che puoi rimuovere (c[0], c[1])e for (int i=0;.
Rɪᴋᴇʀ

3

JavaScript, 41

Funzione di confronto (41) :

a=b=>''+[...b].sort()
b=(c,d)=>a(c)==a(d)
alert(b('abc', 'cba')) // true

Funzione comparatore (21) :

a=b=>''+[...b].sort()
alert(a('abc') == a('bca')); //true

Funzione comparatore (48):

function a(b){return String(b.split('').sort())}
alert(a('abc')==a('bca')); //true

Funzione di confronto (78):

function a(b,c){return String(b.split('').sort())==String(c.split('').sort())}
alert(a('abc','bca')); //true

Presuppone Stringha splite Arrayha sort.


38 byte:c=>d=>(a=b=>''+[...b].sort())(c)==a(d)
Shieru Asakoto il
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.