Gestisci Cestino Così


35

È diventato in qualche modo una tradizione in PPCG che alcuni utenti cambino temporaneamente i loro nomi con un anagramma (un nuovo nome formato riordinando le lettere del vecchio).

A volte diventa difficile scoprire chi è chi. Potrei usare un programma o una funzione per dire se due frasi sono anagrammi l'una dell'altra.

La sfida

Il programma o la funzione dovrebbero prendere due stringhe e produrre un risultato veritiero se sono anagrammi l'uno dell'altro, e falsare altrimenti.

Regole

  • L'input conterrà solo lettere (ASCII da 65 a 90 e da 97 a 122), cifre (ASCII da 48 a 57) o spazio (ASCII 32).
  • La relazione anagramma è indipendente dal caso. Quindi "Arm" e "RAM" sono anagrammi.
  • Neanche gli spazi contano. Quindi "tastiera" e "Barked Yo" sono anagrammi
  • Sono ammessi tutti i builtin
  • Il formato di input è flessibile (due stringhe, una matrice di due stringhe, una stringa contenente entrambe le frasi con un separatore adatto ...)

Codice golf. Vince il minor numero di byte.

Casi test

Truthy:

Lynn, Nyl N
Digital Trauma, Tau Digital Arm
Sp3000, P S 3000
Manage Trash So, Those anagrams

Falsy

Calvins Hobbies, Helka Homba
Android, rains odd
In between days, bayed entwine
Code golf, cod elf got

8
Correlati ma diversi (solo lettere, nessun caso, nessuno spazio)
Luis Mendo,

4
Il titolo di questa domanda è molto sconcertante per qualcuno che non ha avuto abbastanza caffè. +1: D
gatto,

1
@DonMuesli Direi che questo è ancora un inganno. I lievi cambiamenti sono molto banali.
Mego

15
Manage Trash So, Those anagrams. Bello.
mbomb007,

3
So, the anagrams...
Leaky Nun,

Risposte:



15

Retina, 25

i+`(\w)(.*,.*)\1
$2
^\W*$

Provalo online! Inoltre, è possibile eseguire una versione multilinea modificata .

Elimina le lettere prima della virgola insieme alle loro corrispondenze dopo la virgola. Se non ci sono più lettere, allora era un anagramma.


Per Retina, se un numero positivo può essere considerato un errore e zero può essere considerato un successo, questo potrebbe essere più breve di tre byte utilizzando \wcome ultimo stadio.
FryAmTheEggman,


@ dev-null "L'input conterrà solo lettere (ASCII da 65 a 90 e da 97 a 122), cifre (ASCII da 48 a 57) o spazio (ASCII 32)"
FryAmTheEggman

11

Pyth, 11 10 byte

Grazie a @FryAmTheEggman per avermi insegnato il potere di ;!

qFmSr-d;0Q

Provalo qui!

Prende un elenco di due stringhe come input.

Spiegazione

qFmSr-d; 0Q # Q = input

  m Q # mappa Q con d come variabile lambda
     -d; # filtra gli spazi fuori dalla stringa
    r 0 # converti in minuscolo
   S # ordina tutti i caratteri nella stringa
qF # Spiega l'elenco risultante e verifica l'uguaglianza

10

Python 2, 63 61 byte

lambda*l:len({`sorted(s.lower())`[2::5].strip()for s in l})<2

Una funzione anonima che, di fatto, accetta n argomenti e determina se tutti e n sono palindromi reciproci! f("Lynn", "Nyl N")ritorna True.

Questo trucco di comprensione set è di xnor. Ha salvato due byte, ma il vecchio approccio sembrava molto pulito:

exec"a=`sorted(input().lower())`[2::5].strip();a"*2;print a==aa

`sorted(input().lower())`.strip(" [',")è della stessa lunghezza: /
Sp3000,

La execcosa è intelligente ma sembra troppo complessa. Puoi fare di meglio con lambda*l:len({`sorted(s.lower())`[2::5].strip()for s in l})<2.
xnor

2
Grazie! Sono un po 'deluso - sembrava molto bello. Mantenerlo comunque in posta.
Lynn,

7

Gelatina, 12 byte

ḟ€⁶O&95Ṣ€QLḂ

Provalo online!

Come funziona

ḟ€⁶O&95Ṣ€QLḂ  Main link. Input: A (list of strings)

  ⁶           Yield ' '.
ḟ€            Filter it from each string.
   O          Apply ordinal to all characters.
    &95       Take bitwise AND with 95 to make the ordinals case-insensitive.
       Ṣ€     Sort each list of ordinals.
         Q    Deduplicate the list.
          L   Get the length.
           Ḃ  Compute the length's parity (1 -> 1, 2 -> 0).

Versione alternativa, non competitiva (9 byte)

L'atomo maiuscolo di Jelly aveva un bug, e Jelly non aveva ancora incorporato per testare le liste per l'uguaglianza ...

ḟ⁶ŒuṢµ€⁼/

Provalo online!

Come funziona

ḟ⁶ŒuṢµ€⁼/     Main link. Input: A (list of strings)

     µ€       Map the chain to the left over A.
 ⁶            Yield ' '.
ḟ             Filter it from the string.
  Œu          Cast to uppercase.
    Ṣ         Sort.
       ⁼/     Reduce by equality.

6

CJam, 11 12 14 byte

3 2 byte rimossi grazie a @FryAmTheEggman

{lelS-$}2*=

Provalo online!

{      }2*       e# do this twice
 l               e# read line as a string
  el             e# make lowercase
    S-           e# remove spaces from string
      $          e# sort
          =      e# compare strings

@FryAmTheEggman Grazie!
Luis Mendo,

@FryAmTheEggman Grazie ancora! Ho ancora molto da imparare su CJam :-)
Luis Mendo,

3
Il tuo codice sta segretamente ridendo. lel.
Cyoce,

O è uno? lel==> 1e1Nessuno lo sa. È un mistero
user48538

6

Javascript, 69 61 60 59 byte

1 byte spento grazie @ ӍѲꝆΛҐӍΛПҒЦꝆ . 1 byte spento con curry ( indicato da @apsillers )

n=>m=>(G=s=>[]+s.toLowerCase().split(/ */).sort())(n)==G(m)


2
Molto bello, filtrando gli spazi e convertendoli in un array allo stesso tempo!
Neil,

2
Molto bella. Puoi salvare un byte usando il curry, che la community ha deciso è una forma accettabile di argomenti :n=>m=>...
apsillers

Prova n=>m=>(G=s=>[]+s.toLowerCase().split(/\S/).sort())(n)==G(m). L'uso di split anziché match dovrebbe farti risparmiare un byte.
Mama Fun Roll,

@ ӍѲꝆΛҐӍΛПҒЦꝆ. No, perché supponiamo s='db cz'... Ora il risultato è ... e il risultato ès.match(/\S/g).sort()['b','c','d','z']s.split(/\s/).sort()['cz','db']
rimosso il

@ ӍѲꝆΛҐӍΛПҒЦꝆ. Ma ... esaminando la tua idea, l'ho cambiata un po 'e ho salvato un byte ... grazie!
rimosso il

6

MATL , 11 byte

2:"jkXvS]X=

EDIT (20 maggio 2016) Il codice nel link utilizza Xzinvece di Xv, a causa di recenti cambiamenti nella lingua.

Provalo online!

2:"     ]       % do this twice
   j            % read input line as a string
    k           % convert to lowercase
     Xv         % remove spaces
       S        % sort
         X=     % are they equal?

3
Hai appena cambiato il tuo nome per quella sfida?
Denker,

3
@DenkerAffe Ci stavo pensando da tempo. Ho appena fatto coincidere con la sfida :-)
Luis Mendo,

1
Don Muesli lol. Quindi sei il signore di Muesli Luis !? È così che mantieni la tua carnagione sana?
rayryeng - Ripristina Monica il

@rayryeng Heyyy! Felice di vederti qui, Ray! Torna al golf!
Luis Mendo,

Prometto che lo farò :) una volta terminato questo corso ... Vedo che stai imparando anche CJam ora. Molto bella!
rayryeng - Ripristina Monica il

4

Scherzi a parte, 11 9 byte

2`,ùSô`n=

Provalo online!

Tutti sembrano usare lo stesso algoritmo. Eccolo di nuovo.

2`    `n          Do it twice
  ,               Read a string
   ù              Make it lowercase
    S             Sort
     ô            Strip spaces.
        =         Check equality.

Modifica: l'ordinamento realizzato funziona correttamente sulle stringhe e ordina gli spazi in primo piano, quindi strip () funzionerà.


4

C, 165 byte

#define d(x) int x(char*a,char*b){
d(q)return*a&224-*b&224;}
#define n(x) for(qsort(x,strlen(x),1,(__compar_fn_t)q);*x<33;x++);
d(s)n(a)n(b)return strcasecmp(a,b);}

Leggibile e in contesto lavorativo,

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

// start of comparison
int q(char *a, char *b){
     return ((*a)&0xdf)-((*b)&0xdf); // case-insensitive
}
int s(char *a, char *b){
    for(qsort(a,strlen(a),1,(__compar_fn_t)q); *a<33; a++) /**/;
    for(qsort(b,strlen(b),1,(__compar_fn_t)q); *b<33; b++) /**/;
    return strcasecmp(a,b);
}
// end of comparison

int main(int i, char **v){
    printf("'%s' '%s'", v[1], v[2]);
    printf("=> %d\n", s(v[1], v[2])); // 0 if equalish
    return 0;
}

3

zsh, 85 byte

[ $(for x in $@;{tr -d \ <<<$x|tr A-Z a-z|fold -1|sort|paste -sd x}|uniq|wc -l) = 1 ]

Input come argomenti della riga di comando, output come codice di ritorno.

La forsintassi rende questo Bash incompatibile.

[               # test...
$(for x in $@;  # map over arguments
{tr -d \ <<<$x  # remove spaces
|tr A-Z a-z     # lowercase
|fold -1        # put each character on its own line
|sort           # sort lines
|paste -sd x    # remove all newlines except last
}|uniq          # take only unique lines
|wc -l          # how many lines remain?
) = 1 ]         # if only 1 line left, it must have been an anagram

3

Japt, 12 byte

N®v ¬n ¬xÃä¥

Provalo online!

Come funziona

        // Implicit: N = array of input strings
N®    Ã // Take N, and map each item Z to:
v ¬n    //  Take Z.toLowerCase(), split into chars, and sort.
¬x      //  Join and trim off whitespace.
ä¥      // Reduce each pair of items (that's exactly one pair) X and Y to X == Y.


3

Perl, 34 33 + 1 = 34 byte

s/(.)(.*,.*)\1/$2/i?redo:say!/\w/

Richiede la -nbandiera e il libero -M5.010| -E:

$ perl -M5.010 -ne's/(.)(.*,.*)\1/$2/i?redo:say!/\w/' <<< 'hello, lloeh'
1

Come funziona:

                                   # '-n' make a implicit while loop around the code
 s/(.)(.*,.*)\1/$2/i               # Remove a letter that occurs on both sides of the comma.
                    ?
                     redo:         # Redo is a glorified goto statement that goes to the top of the while loop
                          say!/\w/ # Check to see if any letter is left

Grazie a msh210 per aver suggerito di usare operatori ternari per salvare un byte


3

Baloch Gyr , 9 byte

{ṇ₁cḷ}ᵐpᵈ

Provalo online!

L'output di verità / falsità si ottiene attraverso successo / fallimento predicato, essendo questo Brachylog.

Precedentemente ho salvato un byte usando cṇ₁cḷḍinvece {ṇ₁cḷ}ᵐche nell'ipotesi che le due stringhe di input fossero della stessa lunghezza meno gli spazi bianchi, ma mi sono reso conto che avrebbe avuto successo dove avrebbe dovuto fallire Ah Hass, haha.

{    }ᵐ      For both strings in the input,
 ṇ₁          split on spaces,
   c         concatenate,
    ḷ        and lowercase.
       pᵈ    The strings are permutations of each other.

2

PHP, 109 94 byte

function f($x){return str_split((trim($x));}function g($x,$y){return array_diff(f($x),f($y));}

Blech, i due function/returnmi stanno uccidendo qui.

Restituisce la differenza tra due stringinput come arraydi caratteri. PHP considera la []falsità, soddisfacendo i returnrequisiti.


3
function($x,$y){$S=str_split;return array_diff($S(trim($x)),$S(trim($y)));}-> 75 byte. Crea una funzione anonima che restituisce il risultato. Ho rimosso quella funzione lunga e sostituito le chiamate str_splitcon una variabile assegnata, per accorciarla.
Ismael Miguel,

Bello. Lo stavo modificando per ridurlo all'unica funzione, questo è due passi avanti, ben fatto.
ricdesi,

2

Utilità Bash + GNU, 51

f()(fold -1<<<${@^^}|sort)
f $1|diff -qBw - <(f $2)
  • Definire una funzione f()che:
    • ${@^^} converte tutti i parametri in maiuscolo
    • fold -1 divide i caratteri - uno per riga
    • sortlinee s
  • chiamare diffcon -qper eliminare l'output diff completo e -Bwignorare le modifiche agli spazi bianchi

2

Pyke (commit 30, non competitivo), 9 byte

Fl1dk:S)q

Spiegazione:

F      )  -  for _ in eval_or_not(input())
 l1       -     ^.lower()
   dk:    -    ^.replace(" ", "")
      S   -   sorted(^)
        q - ^==^

2

Mathematica, 77 76 byte

StringMatchQ[##,IgnoreCase->1>0]&@@(""<>Sort[Characters@#/." "->""]&/@{##})&

La prima parte è in realtà una delle mie risposte a un'altra domanda!


2

Pike, 54 112 109 109 96 byte

#define a(x) sort((array)replace(lower_case(x)," ",""))
int s(mixed i){return a(i[0])==a(i[1]);}

mixedsembra essere più corto di array(string).

sritorna 1se i suoi argomenti sono anagrammi.


2

Q, 25 byte

f:{~/{x@<x:x@&~^x:_x}'x}

NOTA.- il conteggio include il nome della funzione f: per facilitare i test (come lambda possiamo diminuire di 2 byte)

Versione leggibile

corrisponde sopra {crescente non null inferiore x} ogni x

{.. x ..} is an anonymous function with arg x
_x        lowers string x
&~^x      where not null x (space is considered null)
x@..      selects elements of x according to indexes .. 
<x        ascending indexes of x (not values). Ex <"cab" is 1 2 0
x@<x      ascending values of x (x at ascending indexes of x)
~         match (diad function). Ex "one"~"one" is true
f'..      applies function f for each argument ..
f/..      applies function f over elements of sequence (fold)

Test

f("Lynn";"Nyl N")                       
f("Digital Trauma";"Tau Digital Arm")   
f("Sp3000";"P S 3000")                  
f("Manage Trash So";"Those anagrams")   
f("Calvins Hobbies";"Helka Homba")      
f("Android";"rains odd")                
f("In between days";"bayed entwine")    
f("Code golf";"cod elf got")    

genera (1b = vero, 0b = falso)

1b
1b
1b
1b
0b
0b
0b
0b

A proposito di Q

Linguaggio di uso generale (derivato APL, specializzato nell'elaborazione dei dati) sviluppato da kx.com. Versione di valutazione funzionale completa gratuita per Windows / Linux / MacOS.


Cosa intendi con altre lingue non sono serie? :-P
Luis Mendo,

Se fè necessario per la corretta valutazione del codice, è necessario conteggiarlo. Altrimenti, lascialo fuori dal codice di invio e utilizzalo solo negli esempi per mostrare come assegnare la funzione.
Mego

Naturalmente, altre lingue sono serie quanto Q. Prego il mio povero inglese. Ma alcune lingue sacrificano la leggibilità o sono dotate di librerie ad hoc per questo tipo di concorsi. Q è un "linguaggio generico", nonostante il codice non sia molto leggibile.
J. Sendra,

Hai solo bisogno di x assegnare una volta, se si abbassa tardi, quindi k)~/{x@<x:_x@&~^x}'per 17 byte .. ma io direi che è 19, come è necessario il k)supporto in quanto questo è Kil codice, piuttosto che Q...
streetster

2

APL, 31 caratteri

{≡/{x[⍋x←('.'⎕R'\u0')⍵~' ']}¨⍵}

Da usare così:

    {≡/{x[⍋x←('.'⎕R'\u0')⍵~' ']}¨⍵}'Sp3000' 'P S 3000' 
1

In inglese:

  • { ... }¨⍵: per ciascuno dei due elementi dell'argomento
  • x←('.'⎕R'\u0')⍵~' ': trasforma in maiuscolo (usando un regex ...) la stringa senza spazi e assegna il risultato temporaneo a x
  • x[⍋x]: ordina x
  • ≡/: confronta i due risultati dell'ordinamento: se corrispondono, restituiscono 1.

È possibile provarlo online? Ho provato con questo, ma non so davvero come usarlo
Luis Mendo,

Sicuro. Qui: definizione dopo la quale puoi semplicemente digitaref 'first avatar' 'second avatar'
lstefano il

Grazie! Forse aggiungilo alla risposta? In modo che le persone possano provare
Luis Mendo,

–9:≡/{x[⍋x←0~⍨32|⎕UCS⍵]}¨
Adám,

@Adám: che non funzionerà perché ≡/{x[⍋x←0~⍨32|⎕UCS⍵]}¨'pp' '00'dà 1.
lstefano il

2

Java, 218 byte

Prima volta che ho mai scritto Java ...

golfed:

import java.util.Arrays;boolean M(String a,String b){char[]A=a.toUpperCase().replace(" ","").toCharArray();char[]B=b.toUpperCase().replace(" ","").toCharArray();Arrays.sort(A);Arrays.sort(B);return Arrays.equals(A,B);}

Ungolfed:

import java.util.Arrays;
public class ManageTrashSo {
    public boolean M(String a, String b) {
    char[] A = a.toUpperCase().replace(" ", "").toCharArray();
    char[] B = b.toUpperCase().replace(" ", "").toCharArray();
    Arrays.sort(A);
    Arrays.sort(B);
    return Arrays.equals(A, B);
   }
}

test:

    ManageTrashSo manageTrashSo = new ManageTrashSo();

    //True
    System.out.println(manageTrashSo.M("Lynn", "Nyl N"));
    System.out.println(manageTrashSo.M("Digital Trauma", "Tau Digital Arm"));

    //False
    System.out.println(manageTrashSo.M("Android", "rains odd"));
    System.out.println(manageTrashSo.M("In between days", "bayed entwine"));

So che è passato quasi un anno, ma puoi giocarlo a 32 byte in questo modo: boolean f(String...a){java.util.Arrays x=null;String[]A=g(a[0]),B=g(a[1]);x.sort(A);x.sort(B);return x.equals(A,B);}String[]g(String a){return a.replace(" ","").toUpperCase().split("");}( 186 byte ) O se lo converti in un lambda Java 8, può essere: a->b->{java.util.Arrays x=null;String[]A=g(a),B=g(b);x.sort(A);x.sort(B);return x.equals(A,B);};String[]g(String a){return a.replace(" ","").toUpperCase().split("");}( 167 byte ). Ecco un TIO con codice di prova.
Kevin Cruijssen,


1

Rubino, 50 byte

def f;gets.upcase.chars.sort.join.strip;end
p f==f

Scrivere f=->{...}ed f[]==f[]è altrettanto lungo. :(


1

PowerShell, 81 byte

param([char[]]$a,[char[]]$b)-join($a-replace' '|sort)-eq-join($b-replace' '|sort)

Una leggera riscrittura della mia risposta sulla sfida Anagram collegata.

Prende l'input come array di caratteri, esegue -replaceun'operazione per rimuovere gli spazi, sortli ordina (che ordina in ordine alfabetico, non in base al valore ASCII), quindi -joinli rimette in una stringa. In -eqPowerShell per impostazione predefinita non fa distinzione tra maiuscole e minuscole, ma qui deve essere eseguito su stringhe, poiché [char]'a'non è uguale a [char]'A', quindi il motivo di -join.


1

Perl, 35 byte

Includi +1 per -p

Un po 'offensivo poiché dipende dal programma dato dalla riga di comando.

perl -pe'<>=~s%\S%*_=s/$&//i?_:0%reg;$_=!//'

Quindi dare le stringhe come 2 righe consecutive su STDIN

Una soluzione molto offensiva è di 30 byte:

perl -ne'<>=~s%\w%1/!s/$&//i%reg;1/!//'

Questo si arresta in modo anomalo se le stringhe non sono anagrammi e quindi fornisce un falso codice di uscita dal punto di vista della shell. Dà anche spazzatura su STDERR per quel caso. Se le stringhe sono anagrammi, il programma è silenzioso e fornisce un codice di uscita "vero"



1

Excel VBA, 122 byte

Finestra immediata VBE anonima Funzione che accetta l'input dall'intervallo [A1:B1]e le uscite alla finestra immediata VBE

a=Replace([A1]," ",""):b=Replace([B1]," ",""):For i=1To Len(a):b=Replace(b,Mid(a,i,1),"|",,1,1):Next:?b=String(len(a),"|")

0

C #, 378 byte

Ho bisogno di un handicap !!

https://dotnetfiddle.net/FNDt0E

using System;
using System.Linq;
using System.Text;

public class Program
{

    public static void Main()
    {
        var l = "Hello World";

        var r = "Red Who Loll";

        var y = new Func<string,string>(s => new String(s.ToLower().Replace(" ","").OrderBy(v => v).ToArray()));
        var z = new Func<string,string,Func<string,string>,bool>((w,x,f) => f(w) == f(x));
        var o = z(l, r, y);


        Console.WriteLine("{0} & {1} are anagram: {2}",l, r, o);


                Console.WriteLine("C#, {0} bytes", Encoding.Unicode.GetByteCount(@"var y = new Func<string,string>(s => new String(s.ToLower().Replace("" "","""").OrderBy(v => v).ToArray()));
    var z = new Func<string,string,Func<string,string>,bool>((w,x,f) => f(w) == f(x));"));

    }

}

4
Benvenuto in Programmazione di puzzle e codice golf! La regola generale è di mettere la tua lingua insieme al conteggio dei byte nel titolo del tuo post. Puoi farlo aggiungendo un lead #alla prima riga. Anche per le domande sul code-golf è necessario il golf del programma. Per iniziare, è necessario rimuovere gli spazi bianchi non necessari e utilizzare nomi di variabili a carattere singolo. Inoltre è sempre possibile utilizzare una funzione anziché un programma completo (a meno che non sia esplicitamente vietato) per salvare qualche altro byte.
Denker,

@DenkerAffe mi hai ninja :)
gatto

1
Perché tutto lo spazio bianco ??
Calcolatrice
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.