Управление мусором Так

35

В PPCG стало традицией, что некоторые пользователи временно меняют свои имена анаграммой (новое имя формируется путем изменения порядка букв старых).

Иногда бывает сложно выяснить, кто есть кто. Я мог бы использовать программу или функцию, чтобы сказать, являются ли две фразы анаграммами друг друга.

Соревнование

Программа или функция должны принимать две строки и давать достоверный результат, если они являются анаграммами друг друга, и ложно в противном случае.

правила

  • Входные данные будут содержать только буквы (ASCII 65–90 и 97–122), цифры (ASCII 48–57) или пробел (ASCII 32).
  • Отношение анаграммы не зависит от регистра. Таким образом, «рука» и «RAM» являются анаграммами.
  • Пробелы тоже не в счет. Таким образом, «клавиатура» и «Лай Йо» анаграммы
  • Все встроенные разрешены
  • Формат ввода гибкий (две строки, массив из двух строк, строка, содержащая обе фразы с подходящим разделителем ...)

Код гольф. Побеждает несколько байтов.

Контрольные примеры

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
Связанные, но разные (только буквы, без регистра, без пробелов)
Луис Мендо
4
Заголовок этого вопроса очень озадачивает того, кому не хватает кофе. +1: D
кошка
1
@ DonMuesli Я бы сказал, что это все еще обман. Небольшие изменения очень тривиальны.
Mego
15
Manage Trash So, Those anagrams, Ницца.
mbomb007
3
So, the anagrams...
Дрянная Монахиня

Ответы:

13

05AB1E , 9 8 байт

Код:

lvyð-{}Q

Объяснение:

l         # Lowercase the strings
 vy   }   # Map over the list, for each...
   ð-     #   remove spaces
     {    #   and sort
       Q  # Check equality

Попробуйте онлайн!

Аднан
источник
... но на 2 байта меньше! Отлично сработано!
Луис Мендо
Это lvyðK{}Qсейчас.
Волшебная Урна Осьминога
15

Сетчатка, 25

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

Попробуйте онлайн! Кроме того, вы можете запустить измененную многострочную версию .

Удалите буквы до запятой и их совпадения после запятой. Если у нас не осталось букв, то это была анаграмма.

FryAmTheEggman
источник
Для Retina, если положительное число можно считать неудачным, а нулевое - успешным, это может быть на три байта короче, если использовать \wв качестве последнего этапа.
FryAmTheEggman
@ dev-null «Входные данные будут содержать только буквы (от ASCII 65 до 90 и от 97 до 122), цифры (ASCII от 48 до 57) или пробел (ASCII 32)»
FryAmTheEggman
11

Pyth, 11 10 байт

Спасибо @FryAmTheEggman за то, что научил меня силе ;!

qFmSr-d;0Q

Попробуй это здесь!

Принимает список из двух строк в качестве входных данных.

объяснение

qFmSr-d; 0Q # Q = вход

  m Q # map Q с d в качестве лямбда-переменной
     -d; # фильтровать пробелы из строки
    r 0 # преобразовать в нижний регистр
   S # сортировать все символы в строке
qF # Развернуть полученный список и проверить на равенство
Denker
источник
10

Python 2, 63 61 байт

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

Анонимная функция, которая фактически принимает n аргументов и определяет, являются ли все n из них взаимными палиндромами! f("Lynn", "Nyl N")возвращается True.

Этот трюк с пониманием поставлен Xnor. Это сэкономило два байта, но старый подход выглядел очень аккуратно:

exec"a=`sorted(input().lower())`[2::5].strip();a"*2;print a==aa
Линн
источник
`sorted(input().lower())`.strip(" [',")такой же длины: /
Sp3000
execВещь умна , но кажется слишком сложным. Вы можете сделать лучше с lambda*l:len({`sorted(s.lower())`[2::5].strip()for s in l})<2.
xnor
2
Благодарность! Я немного разочарован - это выглядело очень круто. В любом случае, оставив это на почте.
Линн
7

Желе, 12 байт

ḟ€⁶O&95Ṣ€QLḂ

Попробуйте онлайн!

Как это работает

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

Альтернативная версия, не конкурирующая (9 байт)

В верхнем регистре атома Jelly была ошибка, а у Jelly до сих пор не было встроенного для проверки списков на равенство ...

ḟ⁶ŒuṢµ€⁼/

Попробуйте онлайн!

Как это работает

ḟ⁶Œ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 байтов

3 2 байта удалены благодаря @FryAmTheEggman

{lelS-$}2*=

Попробуйте онлайн!

{      }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 Спасибо!
Луис Мендо
@FryAmTheEggman Еще раз спасибо! Мне еще многое предстоит узнать о CJam :-)
Луис Мендо
3
Ваш код тайно смеется. lel,
Cyoce
Или это один? lel==> 1e1Никто не знает. Это загадка
user48538
6

Javascript, 69 61 60 59 байт

Спасибо за 1 байт @ ӍѲꝆΛҐӍΛПҒЦꝆ . 1 байт прочь с выделки ( указывал на @apsillers )

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

удален
источник
2
Очень красиво, отфильтровывая пробелы и конвертируя в массив одновременно!
Нил
2
Очень хорошо. Вы можете сохранить один байт, используя карринг, который, поn=>m=>...
мнению
Попробуй n=>m=>(G=s=>[]+s.toLowerCase().split(/\S/).sort())(n)==G(m). Использование split вместо match должно сэкономить вам байт.
Mama Fun Roll
@ ӍѲꝆΛҐӍΛПҒЦꝆ. Нет, потому что предположим s='db cz'... Теперь результаты ... и результатыs.match(/\S/g).sort()['b','c','d','z']s.split(/\s/).sort()['cz','db']
удалены
@ ӍѲꝆΛҐӍΛПҒЦꝆ. Но ... глядя на вашу идею, я немного изменил ее и сохранил один байт ... спасибо!
удалено
6

MATL , 11 байт

2:"jkXvS]X=

РЕДАКТИРОВАТЬ (20 мая 2016 г.) Код в ссылке используется Xzвместо Xv, в связи с недавними изменениями в языке.

Попробуйте онлайн!

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
Вы только что изменили свое имя для этого вызова?
Денкер
3
@DenkerAffe Я думал об этом в течение некоторого времени. Я просто сделал так, чтобы это совпало с вызовом :-)
Луис Мендо
1
Дон Мюсли лол. Значит, вы лорд мюсли Луис !? Это как сохранить здоровый цвет лица?
rayryeng - Восстановить Монику
@rayryeng Привет! Рад видеть тебя здесь, Рэй! Вернись в гольф!
Луис Мендо
Я обещаю, что сделаю :), как только этот курс закончится ... Я вижу, вы тоже изучаете CJam. Очень хорошо!
rayryeng - Восстановить Монику
4

Шутки в сторону, 11 9 байт

2`,ùSô`n=

Попробуйте онлайн!

Кажется, все используют один и тот же алгоритм. Здесь это еще раз.

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

Редактировать: реализованная сортировка работает правильно на строках и сортирует пробелы вперед, так что будет работать strip ().

quintopia
источник
4

C 165 байт

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

Читаемый и в рабочем контексте,

#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

зш, 85 байт

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

Ввод в качестве аргументов командной строки, вывод в виде кода возврата.

forСинтаксис делает Bash-несовместимыми.

[               # 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 байт

N®v ¬n ¬xÃä¥

Проверьте это онлайн!

Как это работает

        // 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.
ETHbot
источник
3

GNU Sed, 33

Оценка включает в себя +2 для -rnвариантов для sed.

Это почти прямой порт ответа Retina от @ FryAmTheEggman :

:
s/(\w)(.*,.*)\1/\2/i
t
/\w/Q1

Ideone.

Цифровая травма
источник
3

Perl, 34 33 + 1 = 34 байта

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

Требуется -nфлаг и свободный -M5.010| -E:

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

Как это работает:

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

Спасибо msh210 за предложение использовать троичные операторы для сохранения одного байта

andlrc
источник
3

Белудж Гыр , 9 байт

{ṇ₁cḷ}ᵐpᵈ

Попробуйте онлайн!

Выход «истина / ложь» достигается через предикат успеха / неудачи, это Брахилог.

Ранее сохранял байты, используя cṇ₁cḷḍвместо того, {ṇ₁cḷ}ᵐчтобы предполагать, что две входные строки будут одинаковой длины минус пробел, но я понял, что это будет успешно, где он должен произойти сбой 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 байта

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

Blech, эти двое function/returnубивают меня здесь.

Возвращает разницу между двумя stringвходами в виде arrayсимволов. PHP считает []фальшивкой, удовлетворяющей returnтребованиям.

ricdesi
источник
3
function($x,$y){$S=str_split;return array_diff($S(trim($x)),$S(trim($y)));}-> 75 байт. Создает анонимную функцию, которая возвращает результат. Я удалил эту длинную функцию и заменил вызовы str_splitназначенной переменной, чтобы сократить ее.
Исмаэль Мигель
Ницца. Я настраивал его, чтобы свести к одной функции, это на два шага впереди, молодец.
Рикдези
2

Утилиты Bash + GNU, 51

f()(fold -1<<<${@^^}|sort)
f $1|diff -qBw - <(f $2)
  • Определите функцию, f()которая:
    • ${@^^} преобразует все параметры в верхний регистр
    • fold -1 разбивает символы - по одному на строку
    • sortлинии
  • вызов diffс, -qчтобы подавить полный вывод различий и -Bwигнорировать изменения пробелов
Цифровая травма
источник
2

Пайк (коммит 30, неконкурентный), 9 байт

Fl1dk:S)q

Объяснение:

F      )  -  for _ in eval_or_not(input())
 l1       -     ^.lower()
   dk:    -    ^.replace(" ", "")
      S   -   sorted(^)
        q - ^==^
Синий
источник
2

Mathematica, 77 76 байтов

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

Первая часть на самом деле является одним из моих ответов на другой вопрос!

CalculatorFeline
источник
2

Щука, 54 112 109 109 96 байт

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

mixedбывает короче array(string).

sвозвращает, 1если его аргументы анаграммы.

кот
источник
2

Q, 25 байт

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

ПРИМЕЧАНИЕ. - Подсчет включает имя функции f: для облегчения тестов (в качестве лямбды мы можем уменьшить 2 байта)

Читаемая версия

совпадать по {возрастанию, но не нулю x ниже каждого 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)

Тест

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

генерирует (1b = истина, 0b = ложь)

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

О Q

Язык общего назначения (производная APL, специализируется на обработке данных), разработанный kx.com. Бесплатная полнофункциональная ознакомительная версия для Windows / Linux / MacOS.

Дж. Сендра
источник
Что вы имеете в виду, другие языки не являются серьезными? :-П
Луис Мендо
Если fдля правильной оценки кода требуется, то он должен быть посчитан. В противном случае, просто оставьте его в коде отправки и используйте его только в примерах, чтобы показать, как назначить функцию.
Mego
Конечно, другие языки так же серьезны, как и Q. Я прошу свой плохой английский. Но некоторые языки жертвуют читабельностью или оснащены специальными библиотеками для такого рода конкурсов. Q - это «язык общего назначения», несмотря на то, что код не очень читабелен.
Дж. Сендра
Вам нужно назначить x только один раз, если вы уменьшите позже, таким образом, k)~/{x@<x:_x@&~^x}'для 17 байтов ... но я бы сказал, что это 19, так как вам нужна k)скобка, так как это Kкод, а не Q...
streetster
2

APL, 31 символ

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

Быть использованным так:

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

По-английски:

  • { ... }¨⍵: для каждого из двух элементов аргумента
  • x←('.'⎕R'\u0')⍵~' ': преобразовать в верхний регистр (используя регулярное выражение ...) строку без пробелов и назначить временный результат x
  • x[⍋x]: сортировать х
  • ≡/: сравнить два результата сортировки: если они совпадают, вернуть 1.
Стефано
источник
Можно ли попробовать это онлайн? Я пытался с этим, но я не знаю, как его использовать
Луис Мендо
Конечно. Здесь: определение, после которого вы можете просто набратьf 'first avatar' 'second avatar'
lstefano
Благодарность! Может быть, добавить это к ответу? Чтобы люди могли попробовать
Луис Мендо
–9:≡/{x[⍋x←0~⍨32|⎕UCS⍵]}¨
Адам
@ Adám: это не сработает, потому что ≡/{x[⍋x←0~⍨32|⎕UCS⍵]}¨'pp' '00'дает 1.
Истефано
2

Java, 218 байт

Впервые я написал 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);
   }
}

Тестирование:

    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"));
Пит Арден
источник
Я знаю, что это был почти год, но вы можете сыграть в гольф на 32 байта следующим образом: 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 байтов ) Или, если вы конвертируете его в лямбду Java 8, это может быть: 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 байтов ). Вот TIO с тестовым кодом.
Кевин Круйссен,
1

Рубин, 50 байтов

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

Писать f=->{...}и f[]==f[]так же долго. :(

Линн
источник
1

PowerShell, 81 байт

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

Небольшое переписывание моего ответа на связанный вызов Anagram.

Принимает ввод как char-массивы, выполняет -replaceоперацию по удалению пробелов, sortсортирует их по алфавиту, а не по значению ASCII, а затем -joinвозвращает их обратно в строку. В -eqPowerShell по умолчанию регистр не учитывается, но здесь он должен выполняться для строк, что [char]'a'не равно [char]'A', следовательно, причина -join.

AdmBorkBork
источник
1

Perl, 35 байт

Включить +1 для -p

Несколько оскорбительно, так как это зависит от программы, заданной в командной строке.

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

Затем укажите строки в виде 2 последовательных строк на STDIN.

Очень оскорбительное решение - 30 байт:

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

Это происходит сбой, если строки не являются анаграммами и, следовательно, дает ложный код выхода с точки зрения оболочки. Это также дает мусор на STDERR для этого случая. Если строки анаграммы, программа молчит и выдает «истинный» код выхода

Тон Хоспел
источник
1

Excel VBA, 122 байта

Anonymous VBE немедленное окно Функция, которая берет входные данные из диапазона [A1:B1]и выводит в непосредственное окно 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 байт

Мне нужен гандикап!

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
Добро пожаловать в Программирование Пазлов и Code Golf! Общее правило - указывать ваш язык вместе с количеством байтов в заголовке вашего сообщения. Вы можете сделать это, добавив ведущий #в первую строку. Также для вопросов по коду-гольфу необходимо сыграть в гольф в вашей программе. Для начала вы должны удалить ненужные пробелы и использовать односимвольные имена переменных. Также вы всегда можете использовать функцию вместо полной программы (если это явно не запрещено), чтобы сохранить еще несколько байтов.
Денкер
@DenkerAffe ты меня ниндзя :)
кошка
1
Почему все пробелы ??
CalculatorFeline