Zarządzaj koszem Tak


35

W PPCG stało się tradycją, że niektórzy użytkownicy tymczasowo zmieniają swoje nazwy za pomocą anagramu (nowa nazwa utworzona przez zmianę kolejności starych liter).

Czasami trudno jest ustalić, kto jest kim. Mógłbym użyć programu lub funkcji, aby stwierdzić, czy dwie frazy są względem siebie anagramami.

Wyzwanie

Program lub funkcja powinna wziąć dwa ciągi znaków i dać prawdziwy wynik, jeśli są one wzajemnymi anagramami, a fałszem w przeciwnym razie.

Zasady

  • Dane wejściowe będą zawierać tylko litery (ASCII 65 do 90 i 97 do 122), cyfry (ASCII 48 do 57) lub spację (ASCII 32).
  • Relacja anagramowa jest niezależna od wielkości liter. Zatem „Uzbrojenie” i „RAM” to anagramy.
  • Miejsca też się nie liczą. Tak więc „klawiatura” i „Barked Yo” to anagramy
  • Wszystkie wbudowane dozwolone
  • Format wejściowy jest elastyczny (dwa ciągi, tablica dwóch ciągów, ciąg zawierający obie frazy z odpowiednim separatorem ...)

Kod golfa. Wygrywa najmniej bajtów.

Przypadki testowe

Prawda:

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
Powiązane, ale różne (tylko litery, bez liter, bez spacji)
Luis Mendo,

4
Tytuł tego pytania jest bardzo kłopotliwy dla kogoś, kto nie ma dość kawy. +1: D
kot

1
@DonMuesli Argumentowałbym, że to wciąż dupe. Niewielkie zmiany są bardzo trywialne.
Mego

15
Manage Trash So, Those anagrams. Miły.
mbomb007

3
So, the anagrams...
Leaky Nun

Odpowiedzi:



15

Siatkówka, 25

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

Wypróbuj online! Dodatkowo możesz uruchomić zmodyfikowaną wersję wieloliniową .

Usuń litery przed przecinkiem oraz ich dopasowania po przecinku. Jeśli nie pozostały nam żadne litery, był to anagram.


W przypadku Retiny, jeśli liczbę dodatnią można uznać za awarię, a zero za sukces, może to być trzy bajty krótsze, jeśli zostanie użyty \wjako ostatni etap.
FryAmTheEggman


@ dev-null "Dane wejściowe będą zawierać tylko litery (ASCII 65 do 90 i 97 do 122), cyfry (ASCII 48 do 57) lub spację (ASCII 32)"
FryAmTheEggman

11

Pyth 11 10 bajtów

Dzięki @FryAmTheEggman za nauczenie mnie mocy ;!

qFmSr-d;0Q

Wypróbuj tutaj!

Pobiera na wejściu listę dwóch ciągów.

Wyjaśnienie

qFmSr-d; 0Q # Q = wejście

  m Q # mapa Q z d jak zmienna lambda
     -re; # odfiltruj spacje z ciągu
    r 0 # konwersja na małe litery
   S # sortuj wszystkie znaki w ciągu
qF # Rozłóż wynikową listę i sprawdź równość

10

Python 2, 63 61 bajtów

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

Anonimowa funkcja, która w rzeczywistości bierze n argumentów i określa, czy wszystkie n są wzajemnymi palindromami! f("Lynn", "Nyl N")zwraca True.

Ta sztuczka polegająca na zrozumieniu zestawu została opracowana przez xnor. Zaoszczędził dwa bajty, ale stare podejście wyglądało bardzo schludnie:

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

`sorted(input().lower())`.strip(" [',")ma taką samą długość: /
Sp3000,

execRzeczą jest mądry, ale wydaje się zbyt skomplikowane. Z tym możesz zrobić lepiej lambda*l:len({`sorted(s.lower())`[2::5].strip()for s in l})<2.
xnor

2
Dzięki! Jestem trochę rozczarowany - wyglądało to bardzo fajnie. W każdym razie trzymanie go w poście.
Lynn,

7

Galaretka, 12 bajtów

ḟ€⁶O&95Ṣ€QLḂ

Wypróbuj online!

Jak to działa

ḟ€⁶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).

Alternatywna wersja, niekonkurująca (9 bajtów)

Atom wielkiej litery Jelly miał błąd, a Jelly wciąż nie miała wbudowanego testowania list pod kątem równości ...

ḟ⁶ŒuṢµ€⁼/

Wypróbuj online!

Jak to działa

ḟ⁶Œ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 bajtów

3 2 bajty usunięte dzięki @FryAmTheEggman

{lelS-$}2*=

Wypróbuj 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 Dziękujemy!
Luis Mendo,

@FryAmTheEggman Jeszcze raz dziękuję! Nadal muszę się wiele nauczyć o CJam :-)
Luis Mendo,

3
Twój kod potajemnie się śmieje. lel.
Cyoce

Czy to jest jeden? lel==> 1e1Nikt nie wie. To jest tajemnica.
user48538,

6

JavaScript, 69 61 60 59 bajtów

1 bajt off dzięki @ ӍѲꝆΛҐӍΛПҒЦꝆ . 1 bajt off z curry ( wskazane przez @apsillers )

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


2
Bardzo fajnie, odfiltrowując spacje i jednocześnie konwertując na tablicę!
Neil,

2
Bardzo dobrze. Możesz zaoszczędzić jeden bajt, używając curry, które społeczność uznała za akceptowalną formę argumentów :n=>m=>...
apsillers

Spróbować n=>m=>(G=s=>[]+s.toLowerCase().split(/\S/).sort())(n)==G(m). Użycie podziału zamiast dopasowania powinno zaoszczędzić bajt.
Mama Fun Roll

@ ӍѲꝆΛҐӍΛПҒЦꝆ. Nie, ponieważ przypuśćmy, że s='db cz'... Teraz skutkuje ... i powodujes.match(/\S/g).sort()['b','c','d','z']s.split(/\s/).sort()['cz','db']
usunięto

@ ӍѲꝆΛҐӍΛПҒЦꝆ. Ale ... patrząc na twój pomysł, trochę go zmieniłem i zaoszczędziłem jeden bajt ... dzięki!
usunięto

6

MATL , 11 bajtów

2:"jkXvS]X=

EDYCJA (20 maja 2016 r.) Kod w linku używa Xzzamiast, z Xvpowodu ostatnich zmian w języku.

Wypróbuj 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
Czy właśnie zmieniłeś nazwę dla tego wyzwania?
Denker

3
@DenkerAffe Myślałem o tym od jakiegoś czasu. Właśnie to zbiegło się z wyzwaniem :-)
Luis Mendo,

1
Don Muesli lol. Więc jesteś Panem Musli Luisa !? Czy w ten sposób utrzymujesz zdrową cerę?
rayryeng - Przywróć Monikę

@rayryeng Heyyy! Miło cię tu widzieć, Ray! Wróć do gry w golfa!
Luis Mendo,

Obiecuję, że to zrobię :) kiedy kurs się skończy ... Widzę, że uczysz się teraz CJam. Bardzo dobrze!
rayryeng - Przywróć Monikę

4

Poważnie, 11 9 bajtów

2`,ùSô`n=

Wypróbuj online!

Wydaje się, że wszyscy używają tego samego algorytmu. Oto jeszcze raz.

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

Edycja: zrealizowane sortowanie działa poprawnie na ciągach znaków i sortuje spacje do przodu, dzięki czemu strip () będzie działać.


4

C, 165 bajtów

#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);}

Czytelny iw kontekście roboczym,

#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 bajtów

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

Dane wejściowe jako argumenty wiersza poleceń, dane wyjściowe jako kod powrotu.

forSkładni czyni ten atakujących niekompatybilny.

[               # 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 bajtów

N®v ¬n ¬xÃä¥

Przetestuj online!

Jak to działa

        // 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 bajty

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

Wymaga -nflagi i darmowego -M5.010| -E:

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

Jak to działa:

                                   # '-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

Dzięki msh210 za sugerowanie użycia operatorów trójskładnikowych w celu zaoszczędzenia jednego bajtu


3

Baloch Gyr , 9 bajtów

{ṇ₁cḷ}ᵐpᵈ

Wypróbuj online!

Prawda / fałsz uzyskuje się poprzez predykat powodzenia / niepowodzenia, czyli Brachylog.

Wcześniej zapisywałem bajt, cṇ₁cḷḍzamiast {ṇ₁cḷ}ᵐprzy założeniu, że dwa ciągi wejściowe będą miały tę samą długość minus białe znaki, ale zdałem sobie sprawę, że odniesie sukces tam, gdzie powinien się zawieść 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 bajty

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

Blech, ta dwójka function/returnmnie tutaj zabija.

Zwraca różnicę między dwoma stringwejściami jako liczbą arrayznaków. PHP uważa []fałsz, spełniając returnwymagania.


3
function($x,$y){$S=str_split;return array_diff($S(trim($x)),$S(trim($y)));}-> 75 bajtów. Tworzy anonimową funkcję, która zwraca wynik. Usunąłem tę długą funkcję i zastąpiłem wywołania str_splitzmienną przypisaną, aby ją skrócić.
Ismael Miguel

Miły. Poprawiałem go, aby zredukować do jednej funkcji, to dwa kroki przed tym, dobrze zrobione.
ricdesi

2

Narzędzia Bash + GNU, 51

f()(fold -1<<<${@^^}|sort)
f $1|diff -qBw - <(f $2)
  • Zdefiniuj funkcję, f()która:
    • ${@^^} konwertuje wszystkie parametry na wielkie litery
    • fold -1 dzieli znaki - jeden na linię
    • sorts linie
  • Wywołaj za diffpomocą, -qaby ukryć pełne wyjście różnicowe i -Bwzignorować zmiany białych znaków

2

Pyke (zatwierdzenie 30, niekonkurencyjne), 9 bajtów

Fl1dk:S)q

Wyjaśnienie:

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

2

Mathematica, 77 76 bajtów

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

Pierwsza część jest właściwie jedną z moich odpowiedzi na inne pytanie!


2

Szczupak, 54 112 109 109 96 bajtów

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

mixedbywa krótszy niż array(string).

szwraca, 1jeśli jego argumentami są anagramy.


2

Q, 25 bajtów

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

UWAGA. - zliczanie obejmuje nazwę funkcji f: w celu ułatwienia testów (jako lambda możemy zmniejszyć 2 bajty)

Wersja do odczytu

dopasuj do {rosnąco nie zerowy niższy x} każdy 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")    

generuje (1b = prawda, 0b = fałsz)

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

O Q

Język ogólnego przeznaczenia (pochodna APL, specjalizująca się w przetwarzaniu danych) opracowany przez kx.com. Darmowa pełna funkcjonalna wersja ewaluacyjna dla Windows / Linux / MacOS.


Co masz na myśli mówiąc, że inne języki nie są poważne? :-P
Luis Mendo

Jeśli fjest to wymagane do poprawnej oceny kodu, należy go policzyć. W przeciwnym razie po prostu zostaw go w swoim kodzie przesyłania i użyj go tylko w przykładach, aby pokazać, jak przypisać funkcję.
Mego

Oczywiście inne języki są równie poważne, jak Q. Błagam słabo po angielsku. Ale niektóre języki poświęcają czytelność lub są wyposażone w biblioteki ad hoc dla tego typu konkursów. Q jest „językiem ogólnego przeznaczenia”, mimo że kod nie jest bardzo czytelny.
J. Sendra

Musisz tylko raz przypisać x, jeśli obniżysz później, a więc k)~/{x@<x:_x@&~^x}'dla 17 bajtów .. ale powiedziałbym, że to 19, ponieważ potrzebujesz k)nawiasu, ponieważ jest to Kkod, a nie Q...
streetster

2

APL, 31 znaków

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

Do użycia, więc:

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

Po angielsku:

  • { ... }¨⍵: dla każdego z dwóch elementów argumentu
  • x←('.'⎕R'\u0')⍵~' ': przekształć na wielkie litery (używając wyrażenia regularnego ...) ciąg bez spacji i przypisz wynik tymczasowy do x
  • x[⍋x]: sort x
  • ≡/: porównaj dwa wyniki sortowania: jeśli pasują, zwróć 1.

Czy można to wypróbować online? Próbowałem z tym, ale tak naprawdę nie wiem, jak go używać
Luis Mendo

Pewnie. Tutaj: definicja, po której można po prostu wpisaćf 'first avatar' 'second avatar'
lstefano

Dzięki! Może dodać to do odpowiedzi? Aby ludzie mogli spróbować
Luis Mendo

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

@ Adám: to nie zadziała, ponieważ ≡/{x[⍋x←0~⍨32|⎕UCS⍵]}¨'pp' '00'daje 1.
lstefano

2

Java, 218 bajtów

Pierwszy raz pisałem w Javie ...

Gra w golfa:

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);}

Nie golfowany:

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);
   }
}

Testowanie:

    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"));

Wiem, że minął prawie rok, ale możesz zagrać w golfa o 32 bajty w następujący sposób: 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 bajtów ) Lub jeśli przekonwertujesz go na Java 8 lambda, może to być: 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 bajtów ). Oto TIO z kodem testowym.
Kevin Cruijssen


1

Rubinowy, 50 bajtów

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

Pisanie f=->{...}i f[]==f[]jest tak samo długie. :(


1

PowerShell, 81 bajtów

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

Nieznaczne przepisanie mojej odpowiedzi dotyczącej powiązanego wyzwania Anagram.

Pobiera dane wejściowe jako tablice znaków, wykonuje -replaceoperację usuwania spacji, sorts je (sortuje alfabetycznie, a nie według wartości ASCII), a następnie -joins je z powrotem w ciąg znaków. W programie -eqPowerShell domyślnie nie jest rozróżniana wielkość liter, ale tutaj należy ją wykonać na ciągach, ponieważ [char]'a'nie jest ona równa [char]'A', stąd przyczyna -join.


1

Perl, 35 bajtów

Uwzględnij +1 dla -p

Nieco obelżywe, ponieważ zależy to od podania programu w wierszu poleceń.

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

Następnie podaj ciągi jako 2 kolejne linie na STDIN

Bardzo obraźliwe rozwiązanie to 30 bajtów:

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

To ulega awarii, jeśli ciągi nie są anagramami i dlatego podaje fałszywy kod wyjścia z punktu widzenia powłoki. W tym przypadku daje również śmieci na STDERR. Jeśli ciągi są anagramami, program milczy i podaje „prawdziwy” kod wyjścia



1

Excel VBA, 122 bajty

Anonimowe bezpośrednie okno VBE Funkcja, która przenosi dane wejściowe z zakresu [A1:B1]i wyjścia do bezpośredniego okna 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 bajtów

Potrzebuję handicapu !!

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
Witamy w Programowaniu Puzzle i Code Golf! Ogólną zasadą jest umieszczanie języka wraz z liczbą bajtów w nagłówku postu. Możesz to zrobić, dodając wiodącą #linię do pierwszego wiersza. Również w przypadku pytań związanych z golfem wymagana jest gra w golfa. Na początek powinieneś usunąć niepotrzebne białe znaki i użyć jednoznakowych nazw zmiennych. Zawsze możesz także użyć funkcji zamiast pełnego programu (chyba że jest to wyraźnie zabronione), aby zapisać więcej bajtów.
Denker

@DenkerAffe you ninja'd me :)
cat

1
Dlaczego wszystkie białe znaki?
CalculatorFeline
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.