Kelola Sampah Jadi


35

Sudah menjadi tradisi di PPCG bahwa beberapa pengguna mengubah nama mereka untuk sementara waktu dengan anagram (nama baru yang dibentuk dengan menata ulang huruf-huruf lama).

Terkadang sulit untuk mencari tahu siapa itu siapa. Saya bisa menggunakan program atau fungsi untuk mengetahui apakah dua frasa adalah anagram satu sama lain.

Tantangan

Program atau fungsi harus mengambil dua string dan menghasilkan hasil yang benar jika mereka adalah anagram satu sama lain, dan sebaliknya palsu.

Aturan

  • Input hanya akan berisi huruf (ASCII 65 hingga 90 dan 97 hingga 122), digit (ASCII 48 hingga 57) atau spasi (ASCII 32).
  • Relasi anagram independen dari kasus. Jadi "Arm" dan "RAM" adalah anagram.
  • Spasi juga tidak dihitung. Jadi "keyboard" dan "Barked Yo" adalah anagram
  • Semua bawaan diizinkan
  • Format input fleksibel (dua string, array dua string, string yang mengandung kedua frasa dengan pemisah yang sesuai ...)

Golf kode. Bytes paling sedikit menang.

Uji kasus

Benar:

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

Palsu

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

8
Terkait tetapi berbeda (hanya surat, tanpa kasing, tanpa spasi)
Luis Mendo

4
Judul pertanyaan ini sangat membingungkan bagi seseorang yang tidak memiliki cukup kopi. +1: D
cat

1
@ DonMuesli Saya berpendapat bahwa ini masih merupakan penipuan. Perubahan kecil itu sangat sepele.
Mego

15
Manage Trash So, Those anagrams. Bagus.
mbomb007

3
So, the anagrams...
Leaky Nun

Jawaban:



15

Retina, 25

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

Cobalah secara Online! Selain itu, Anda dapat menjalankan versi multisaluran yang dimodifikasi .

Hapus surat-surat dari sebelum koma bersama dengan korek api mereka setelah koma. Jika kita tidak punya surat lagi maka itu adalah anagram.


Untuk Retina, jika angka positif dapat dianggap gagal, dan nol dianggap sukses, ini bisa menjadi tiga byte lebih pendek dengan menggunakan \wsebagai tahap terakhir.
FryAmTheEggman


@ dev-null "Input hanya akan berisi huruf (ASCII 65 hingga 90 dan 97 hingga 122), digit (ASCII 48 hingga 57) atau spasi (ASCII 32)"
FryAmTheEggman

11

Pyth, 11 10 byte

Terima kasih kepada @FryAmTheEggman karena mengajari saya kekuatan ;!

qFmSr-d;0Q

Coba di sini!

Mengambil daftar dua string sebagai input.

Penjelasan

qFmSr-d; 0Q # Q = input

  m Q # map Q dengan d sebagai variabel lambda
     -d; # filter spasi dari string
    r 0 # dikonversi ke huruf kecil
   S # urutkan semua karakter dalam string
qF # Buka daftar yang dihasilkan dan periksa kesetaraan

10

Python 2, 63 61 byte

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

Fungsi anonim yang, pada kenyataannya, mengambil n argumen dan menentukan apakah semua n dari mereka adalah palindrom bersama! f("Lynn", "Nyl N")kembaliTrue .

Trik set pemahaman ini oleh xnor. Ini menghemat dua byte, tetapi pendekatan lama tampak sangat rapi:

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

`sorted(input().lower())`.strip(" [',")memiliki panjang yang sama: /
Sp3000

The exechal yang pintar tetapi tampaknya terlalu rumit. Anda dapat melakukannya dengan lebih baik lambda*l:len({`sorted(s.lower())`[2::5].strip()for s in l})<2.
xnor

2
Terima kasih! Saya sedikit kecewa - itu terlihat sangat keren. Tetap menyimpannya di pos.
Lynn

7

Jelly, 12 byte

ḟ€⁶O&95Ṣ€QLḂ

Cobalah online!

Bagaimana itu bekerja

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

Versi alternatif, non-bersaing (9 byte)

Atom huruf besar Jelly memiliki bug, dan Jelly masih belum memiliki built-in untuk menguji daftar kesetaraan ...

ḟ⁶ŒuṢµ€⁼/

Cobalah online!

Bagaimana itu bekerja

ḟ⁶Œ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 dihapus berkat @FryAmTheEggman

{lelS-$}2*=

Cobalah 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 Terima kasih!
Luis Mendo

@FryAmTheEggman Terima kasih lagi! Saya masih harus banyak belajar tentang CJam :-)
Luis Mendo

3
Kode Anda diam-diam tertawa. lel.
Cyoce

Atau itu satu? lel==> 1e1Tidak ada yang tahu. Ini sebuah misteri.
user48538

6

Javascript, 69 61 60 59 byte

1 byte off terima kasih @ ӍѲꝆΛҐӍΛПҒЦꝆ . Off 1 byte dengan currying ( ditunjukkan oleh @apsillers )

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


2
Sangat bagus, memfilter spasi dan mengkonversi ke array pada saat yang sama!
Neil

2
Sangat bagus. Anda dapat menyimpan satu byte menggunakan currying, yang telah diputuskan oleh komunitas adalah bentuk argumen yang dapat diterima :n=>m=>...
apsillers

Coba n=>m=>(G=s=>[]+s.toLowerCase().split(/\S/).sort())(n)==G(m). Menggunakan split alih-alih pertandingan harus menghemat satu byte.
Mama Fun Roll

@ ӍѲꝆΛҐӍΛПҒЦꝆ. Tidak, karena misalkan s='db cz'... Sekarang menghasilkan ... dan menghasilkans.match(/\S/g).sort()['b','c','d','z']s.split(/\s/).sort()['cz','db']
dihapus

@ ӍѲꝆΛҐӍΛПҒЦꝆ. Tapi ... melihat ide Anda, saya mengubahnya sedikit dan menyelamatkan satu byte ... terima kasih!
dihapus

6

MATL , 11 byte

2:"jkXvS]X=

EDIT (20 Mei 2016) Kode dalam tautan menggunakan Xzalih-alih Xv, karena perubahan bahasa terbaru.

Cobalah 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
Apakah Anda baru saja mengubah nama Anda untuk tantangan itu?
Denker

3
@DenkerAffe Saya telah memikirkannya selama beberapa waktu. Saya baru saja membuatnya bertepatan dengan tantangan :-)
Luis Mendo

1
Don Muesli lol. Jadi Anda adalah Tuan Muesli Luis !? Apakah ini cara Anda menjaga warna kulit sehat?
rayryeng

@rayryeng Heyyy! Senang melihatmu di sini, Ray! Kembali ke golf!
Luis Mendo

Saya berjanji akan :) setelah kursus ini berakhir ... Saya melihat Anda juga belajar CJam. Sangat bagus!
rayryeng

4

Serius, 11 9 byte

2`,ùSô`n=

Cobalah secara Online!

Semua orang tampaknya menggunakan algoritma yang sama. Ini dia lagi.

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

Sunting: penyortiran menyadari tidak berfungsi dengan benar pada string, dan mengurutkan spasi ke depan sehingga strip () akan bekerja.


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

Dapat dibaca dan dalam konteks kerja,

#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 sebagai argumen baris perintah, output sebagai kode kembali.

The forsintaks membuat ini Bash-kompatibel.

[               # 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Ãä¥

Uji secara online!

Bagaimana itu bekerja

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

Membutuhkan -nbendera dan gratis -M5.010| -E:

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

Bagaimana itu bekerja:

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

Terima kasih kepada msh210 karena menyarankan menggunakan operator ternary untuk menghemat satu byte


3

Baloch Gyr , 9 byte

{ṇ₁cḷ}ᵐpᵈ

Cobalah online!

Keluaran yang benar / salah dicapai melalui keberhasilan / kegagalan predikat, ini adalah Brachylog.

Sebelumnya disimpan byte menggunakan cṇ₁cḷḍbukan {ṇ₁cḷ}ᵐdengan asumsi bahwa dua string input akan menjadi panjang yang sama dikurangi spasi kosong, tapi saya menyadari bahwa itu akan berhasil di mana ia harus gagal 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, keduanya function/returnmembunuhku di sini.

Mengembalikan perbedaan antara dua stringinput sebagai arraykarakter. PHP menganggap []falsy, memenuhi returnpersyaratan.


3
function($x,$y){$S=str_split;return array_diff($S(trim($x)),$S(trim($y)));}-> 75 byte. Membuat fungsi anonim yang mengembalikan hasilnya. Saya telah menghapus fungsi panjang itu dan mengganti panggilan str_splitdengan variabel yang ditugaskan, untuk mempersingkatnya.
Ismael Miguel

Bagus. Saya mengutak-atiknya untuk menguranginya menjadi satu fungsi, ini dua langkah di depan itu, dilakukan dengan baik.
ricdesi

2

Utilitas Bash + GNU, 51

f()(fold -1<<<${@^^}|sort)
f $1|diff -qBw - <(f $2)
  • Tetapkan fungsi f()yang:
    • ${@^^} mengubah semua parameter menjadi huruf besar
    • fold -1 membagi karakter - satu per baris
    • sortgaris
  • panggilan diffdengan -quntuk menekan output diff penuh dan -Bwmengabaikan perubahan spasi putih

2

Pyke (komit 30, tidak kompetitif), 9 byte

Fl1dk:S)q

Penjelasan:

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@#/." "->""]&/@{##})&

Bagian pertama sebenarnya adalah salah satu jawaban saya untuk pertanyaan lain!


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

mixedkebetulan lebih pendek dari array(string).

skembali 1jika argumennya adalah anagram.


2

Q, 25 Bytes

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

CATATAN.- penghitungan termasuk nama fungsi f: untuk memudahkan pengujian (seperti lambda kita dapat mengurangi 2 Bytes)

Versi yang mudah dibaca

cocokkan dengan {naik bukan nol lebih rendah x} setiap 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)

Uji

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

menghasilkan (1b = benar, 0b = salah)

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

Tentang Q

Bahasa tujuan umum (APL turunan, khusus dalam pemrosesan data) dikembangkan oleh kx.com. Versi evaluasi fungsional lengkap gratis untuk Windows / Linux / MacOS.


Apa maksud Anda, bahasa lain tidak serius? :-P
Luis Mendo

Jika fdiperlukan untuk kode untuk mengevaluasi dengan benar, maka itu harus dihitung. Jika tidak, tinggalkan saja kode kiriman Anda, dan gunakan saja dalam contoh untuk menunjukkan cara menetapkan fungsi.
Mego

Tentu saja, bahasa lain sama seriusnya dengan Q. Saya mohon bahasa Inggris saya yang buruk. Tetapi beberapa bahasa mengorbankan keterbacaan atau dilengkapi dengan perpustakaan ad-hoc untuk jenis kontes ini. Q adalah 'bahasa tujuan umum', terlepas dari kenyataan bahwa kode tidak dapat dibaca.
J. Sendra

Anda hanya perlu menetapkan x sekali jika Anda menurunkannya nanti, dengan demikian k)~/{x@<x:_x@&~^x}'untuk 17 byte .. tapi saya katakan itu 19 karena Anda memerlukan k)braket karena ini adalah Kkode daripada Q...
streetster

2

APL, 31 karakter

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

Untuk digunakan demikian:

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

Dalam Bahasa Inggris:

  • { ... }¨⍵: untuk masing-masing dari dua elemen argumen
  • x←('.'⎕R'\u0')⍵~' ': mentransformasikan ke huruf besar (menggunakan regex ...) string tanpa spasi dan menetapkan hasil sementara untuk x
  • x[⍋x]: sort x
  • ≡/: bandingkan dua hasil penyortiran: jika cocok, kembalikan 1.

Apakah mungkin untuk mencobanya secara online? Saya mencoba dengan ini tetapi saya tidak benar-benar tahu bagaimana menggunakannya
Luis Mendo

Yakin. Di sini: definisi setelah itu Anda cukup mengetikf 'first avatar' 'second avatar'
lstefano

Terima kasih! Mungkin menambahkan itu ke jawabannya? Sehingga orang dapat mencoba
Luis Mendo

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

@ Adám: itu tidak akan berhasil karena ≡/{x[⍋x←0~⍨32|⎕UCS⍵]}¨'pp' '00'memberi 1.
lstefano

2

Java, 218 Bytes

Pertama kali saya pernah menulis Java ...

Golf:

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

Tidak Disatukan:

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

Pengujian:

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

Saya tahu ini sudah hampir setahun, tetapi Anda dapat golf dengan 32 byte seperti ini: 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 ) Atau jika Anda mengubahnya menjadi lambda Java 8, bisa jadi: 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 ). Berikut ini adalah TIO dengan kode uji.
Kevin Cruijssen


1

Ruby, 50 byte

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

Menulis f=->{...}dan f[]==f[]panjang. :(


1

PowerShell, 81 byte

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

Menulis ulang sedikit jawaban saya pada tantangan Anagram yang ditautkan.

Mengambil input sebagai array-ar, melakukan -replaceoperasi untuk menghapus spasi, sorts mereka (yang mengurutkan menurut abjad, bukan dengan nilai ASCII), lalu -joins kembali ke string. Dalam -eqPowerShell secara default case-insensitive, tetapi di sini harus dilakukan pada string, karena [char]'a'tidak sama dengan [char]'A', maka alasannya -join.


1

Perl, 35 byte

Sertakan +1 untuk -p

Agak kasar karena tergantung pada program yang diberikan pada commandline.

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

Kemudian berikan string sebagai 2 baris berturut-turut pada STDIN

Solusi yang sangat kasar adalah 30 byte:

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

Ini macet jika string bukan anagram dan karena itu memberikan kode keluar palsu dari sudut pandang shell. Ini juga memberi sampah pada STDERR untuk kasus itu. Jika string adalah anagram, program tidak bersuara dan memberikan kode keluar "benar"



1

Excel VBA, 122 Bytes

Jendela langsung VBE anonim Fungsi yang mengambil input dari rentang [A1:B1]dan keluaran ke jendela langsung 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

Saya butuh cacat !!

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
Selamat Datang di Programming Puzzles & Code Golf! Aturan umum adalah untuk menempatkan bahasa Anda bersama dengan jumlah byte Anda di judul posting Anda. Anda dapat melakukannya dengan menambahkan sebuah tuntunan #ke baris pertama. Juga untuk pertanyaan kode-golf diperlukan untuk golf program Anda. Sebagai permulaan, Anda harus menghapus spasi putih yang tidak perlu dan menggunakan nama variabel satu karakter. Anda juga selalu dapat menggunakan fungsi alih-alih program penuh (kecuali dilarang secara eksplisit) untuk menyimpan lebih banyak byte.
Denker

@DenkerAffe you ninja'd me :)
cat

1
Kenapa semua spasi putih ??
CalculatorFeline
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.