Керуйте сміттям так


35

В PPCG стало традицією те, що деякі користувачі тимчасово змінюють свої імена за допомогою анаграми (нове ім’я, утворене за допомогою переупорядкування букв старих).

Іноді стає важко дізнатися, хто є хто. Я міг би скористатися програмою чи функцією, щоб визначити, чи є дві фрази анаграми один одного.

Змагання

Програма або функція повинна мати два рядки і створювати невідповідний результат, якщо вони є анаграмами один одного, а фальшиві в іншому випадку.

Правила

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

Код гольфу. Виграє найменше байт.

Тестові справи

Truthy:

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

Фальсі

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...
Лина монашка

Відповіді:



15

Сітківка, 25

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

Спробуйте в Інтернеті! Крім того, ви можете запустити модифіковану багаторядкову версію .

Видаліть літери перед комою, а також їх відповідність після коми. Якщо у нас не залишилося жодного листа, то це була анаграма.


Для 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 # карта Q з d як лямбда-змінна
     -d; # фільтр пробілів з рядка
    r 0 # перетворити в малі регістри
   S # сортувати всі символи в рядку
qF # Розгорніть отриманий список і перевірте рівність

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.
Кіос

Або це одна? 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
Дуже хороша. Ви можете зберегти один байт, використовуючи currying, що спільнотаn=>m=>...
визнала

Спробуйте n=>m=>(G=s=>[]+s.toLowerCase().split(/\S/).sort())(n)==G(m). Використання спліту замість відповідності повинно економити байт.
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=

EDIT (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 Heyyy! Рада бачити вас тут, Рей! Поверніться до гольфу!
Луїс Мендо

Обіцяю, що захочу :), як тільки цей курс закінчиться ... Я бачу, ви зараз навчаєтесь 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.

Редагувати: зрозуміла, сортування працює правильно на рядках, і сортує пробіли спереду, щоб смуга () спрацювала.


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

zsh, 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.


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 за пропозицію використовувати потрійні оператори, щоб зберегти один байт


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вимоги.


3
function($x,$y){$S=str_split;return array_diff($S(trim($x)),$S(trim($y)));}-> 75 байт. Створює анонімну функцію, яка повертає результат. Я видалив цю довгу функцію і замінив дзвінки на str_splitприсвоєну змінну, щоб скоротити її.
Ісмаїл Мігель

Приємно. Я налаштовував це, щоб звести його до однієї функції, це на два кроки до цього, молодець.
ricdesi

2

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

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

2

Пайк ( ввести 30, неконкурентоспроможний), 9 байт

Fl1dk:S)q

Пояснення:

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

2

Математика, 77 76 байт

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

Перша частина - це фактично одна з моїх відповідей на інше питання!


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 ..} 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.


Що ви маєте на увазі, інші мови несерйозні? :-P
Луїс Мендо

Якщо fкод необхідний для належної оцінки, то його необхідно підрахувати. В іншому випадку просто залиште його від коду подання та використовуйте його лише в прикладах, щоб показати, як призначити функцію.
Мего

Звичайно, інші мови такі ж серйозні, як і Q. Прошу мою погану англійську. Але деякі мови жертвують читабельністю або обладнані спеціальними бібліотеками для цього типу конкурсів. Q - "мова загального призначення", незважаючи на те, що код не дуже читабельний.
Дж. Сендра

Ви повинні призначити х лише один раз, якщо пізніше опуститеся, таким чином, k)~/{x@<x:_x@&~^x}'на 17 байт .. але я б сказав, що це 19, як вам потрібна k)дужка, оскільки це Kкод, а не Q...
streetter

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.
lstefano

2

Java, 218 байт

Перший раз, коли я коли-небудь писав Java ...

Гольф:

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

Безголівки:

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 байт ). Ось ТІО з тестовим кодом.
Kevin Cruijssen


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операцію з видалення пробілів, sorts (що їх сортує за алфавітом, а не за значенням ASCII), а потім -joinповертає їх назад у рядок. За -eqзамовчуванням PowerShell нечутливий до регістру, але тут він повинен виконуватись на рядках, як [char]'a'це не дорівнює [char]'A', отже, причина -join.


1

Perl, 35 байт

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

Дещо образливий, оскільки це залежить від програми, наданої в командному рядку.

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

Потім наведіть рядки у вигляді двох послідовних рядків на STDIN

Дуже образливе рішення - 30 байт:

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

Це руйнується, якщо рядки не є анаграмами, і тому дає помилковий код виходу з точки зору оболонки. Це також дає сміття на STDERR для цього випадку. Якщо рядки - це анаграми, програма мовчить і дає "справжній" код виходу



1

Excel VBA, 122 байти

Пряме вікно анонімного 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
Ласкаво просимо до головоломки програмування та коду для гольфу! Загальне правило - скласти мову разом із кількістю байтів у заголовку допису. Це можна зробити, додавши ведучий #до першого рядка. Також для питань з кодом-гольфу потрібно гольф вашої програми. Для початку слід видалити непотрібні пробіли та використовувати одноіменні назви змінних. Також ви завжди можете використовувати функцію замість повної програми (якщо явно заборонено), щоб зберегти ще кілька байтів.
Денкер

@DenkerAffe ти мене ніндзя :)
кіт

1
Чому весь пробіл ??
CalculatorFeline
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.