So çöpünü yönet


35

PPCG'de, bazı kullanıcıların isimlerini bir anagram (geçici olarak eski harfleri yeniden sıralayarak oluşturduğu yeni bir isim) ile geçici olarak değiştirmesi bir gelenek haline geldi.

Bazen kim olduğunu bulmak zorlaşır. İki ifadenin birbirinin anagramı olup olmadığını anlamak için bir program veya işlev kullanabilirim.

Meydan okuma

Program veya işlev iki dize almalı ve eğer birbirlerinin anagramlarıysa ve aksi takdirde sahte ise, gerçek olmayan bir sonuç üretmelidirler.

kurallar

  • Girdi yalnızca harfleri (ASCII 65 - 90 ve 97 - 122), rakamları (ASCII 48 - 57) veya boşluk (ASCII 32) içerecektir.
  • Anagram ilişkisi, durumdan bağımsızdır. Yani "Arm" ve "RAM" anagramlardır.
  • Boşluklar da sayılmaz. Yani "klavye" ve "Barked Yo" anagramlardır.
  • Tüm yapılara izin verilir
  • Giriş formatı esnektir (iki karakter, iki karakter dizisi, her iki ifadeyi de uygun bir ayırıcı içeren bir dize ...)

Kod golfü. En az bayt kazanır.

Test durumları

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
İlgili ama farklı (sadece harfler, dava yok, boşluk yok)
Luis Mendo

4
Bu sorunun başlığı, yeterince kahve içmeyen birine çok şaşırtıcı. +1: D
kedi

1
@DonMuesli Bu hala bir dupe olduğunu iddia ediyorum. Küçük değişiklikler çok önemsiz.
Mego

15
Manage Trash So, Those anagrams. Güzel.
mbomb007

3
So, the anagrams...
Sızdıran Rahibe

Yanıtlar:



15

Retina, 25

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

Çevrimiçi Deneyin! Ek olarak, değiştirilmiş çok hatlı bir sürümü çalıştırabilirsiniz .

Virgülten sonraki eşleşmeleri ile birlikte virgül öncesi gelen harfleri silin. Hiç mektup kalmadıysa, o zaman bir anagramdı.


Retina için, eğer pozitif bir sayı bir başarısızlık olarak kabul edilebilir ve sıfırın başarılı olduğu düşünülürse, bu \w, son aşama olarak kullanıldığında üç bayt daha kısa olabilir .
FryAmTheEggman


@ dev-null "Girdi yalnızca harfler (ASCII 65 - 90 ve 97 - 122), rakamlar (ASCII 48 - 57) veya boşluk (ASCII 32)
içerecektir

11

Pyth, 11 10 bayt

Bana gücünü öğrettiği için @FryAmTheEggman'a teşekkürler ;!

qFmSr-d;0Q

Burada dene!

Giriş olarak iki dizenin bir listesini alır.

açıklama

qFmSr-d; 0Q # Q = giriş

  m Q # d ile lambda değişkeni olarak d haritası
     -d; # dizge dışındaki boşlukları süz
    r 0 # küçük harfe dönüştür
   S # dizedeki tüm karakterleri sırala
qF # Sonuç listesini aç ve eşitliği kontrol et

10

Python 2, 63 61 bayt

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

Aslında, alır, o isimsiz işlev n tüm eğer argümanlar ve belirleyen n bunlardan karşılıklı palindromes vardır! f("Lynn", "Nyl N")döner True.

Bu set anlama numarası xnor'a aittir. İki bayt kurtardı, ancak eski yaklaşım çok düzenli görünüyordu:

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

`sorted(input().lower())`.strip(" [',")aynı uzunluk: /
Sp3000

Sorun execakıllı ama çok karmaşık görünüyor. İle daha iyisini yapabilirsin lambda*l:len({`sorted(s.lower())`[2::5].strip()for s in l})<2.
xnor

2
Teşekkürler! Biraz hayal kırıklığına uğradım - çok güzel görünüyordu. Zaten postada tutmak.
Lynn

7

Jöle, 12 bayt

ḟ€⁶O&95Ṣ€QLḂ

Çevrimiçi deneyin!

Nasıl çalışır

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

Alternatif sürüm, rekabetçi olmayan (9 bayt)

Jöle'nin büyük harfli atomunda bir böcek vardı ve Jöle hala eşitlik için listeleri test edecek dahili bir ...

ḟ⁶ŒuṢµ€⁼/

Çevrimiçi deneyin!

Nasıl çalışır

ḟ⁶Œ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 bayt

@FryAmTheEggman sayesinde 3 2 bayt kaldırıldı

{lelS-$}2*=

Çevrimiçi deneyin!

{      }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 Teşekkürler!
Luis Mendo

@FryAmTheEggman Tekrar teşekkürler! Hala CJam :-) hakkında daha fazla şey öğreneceğim var
Luis Mendo

3
Kodun gizlice gülüyor. lel.
Cyoce

Yoksa bir tane mi? lel==> 1e1Kimse bilmiyor. O bir gizem.
user48538

6

Javascript, 69 61 60 59 bayt

1 bayt kapalı teşekkür @ ӍѲꝆΛҐӍΛПҒЦꝆ . -İşlemden ile kapalı 1 bayt ( işaret ile @apsillers )

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


2
Çok güzel, boşlukları filtrelemek ve aynı zamanda bir diziye dönüştürmek!
Neil,

2
Çok hoş. Sen Currying kullanarak bir bayt kaydedebilirsiniz karar verdi topluluk argümanları kabul edilebilir bir şeklidir :n=>m=>...
apsillers

Dene n=>m=>(G=s=>[]+s.toLowerCase().split(/\S/).sort())(n)==G(m). Eşleşme yerine bölme kullanmak size bir bayt kazandırmalıdır.
Mama Fun Roll

@ ӍѲꝆΛҐӍΛПҒЦꝆ. Hayır, çünkü farz edin s='db cz'... Şimdi sonuçlandı ... ve sonuçlandıs.match(/\S/g).sort()['b','c','d','z']s.split(/\s/).sort()['cz','db']
kaldırıldı

@ ӍѲꝆΛҐӍΛПҒЦꝆ. Ama ... fikrinize bakarken, biraz değiştirdim ve bir bayt kurtardım ... teşekkürler!
kaldırıldı

6

MATL , 11 bayt

2:"jkXvS]X=

EDIT (20 Mayıs 2016) Bağlantıdaki kod , dilde yapılan son değişiklikler nedeniyle Xzyerine kullanılır Xv.

Çevrimiçi deneyin!

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
Bu meydan okuma için adınızı değiştirdiniz mi?
Denker

3
@DenkerAffe Bir süredir bunu düşünüyordum. Ben sadece :-) ile mücadeleye denk geldim :-)
Luis Mendo

1
Don Müsli lol. Demek Müsli'nin Efendisisin Luis? Sağlıklı teninizi böyle mi koruyorsunuz?
rayryeng - Monica

@rayryeng Heyyy! Seni burada görmek güzel, Ray! Golfe geri dön!
Luis Mendo

Söz veriyorum :) bu kurs sona erdiğinde ... Ben de şimdi CJam'ı öğrendiğini görüyorum. Çok hoş!
rayryeng - Monica

4

Cidden, 11 9 bayt

2`,ùSô`n=

Çevrimiçi Deneyin!

Herkes aynı algoritmayı kullanıyor gibi görünüyor. İşte yine geldi.

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

Düzenleme: gerçekleştirilen sıralama, dizelerde düzgün çalışır ve ön tarafa boşluklar düzenleyerek strip () çalışacaktır.


4

C, 165 bayt

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

Okunabilir ve çalışma bağlamında,

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

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

Komut satırı argümanları olarak giriş, dönüş kodu olarak çıkış.

forSözdizimi bu Bash-uyumsuz hale getirir.

[               # 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 bayt

N®v ¬n ¬xÃä¥

Çevrimiçi test edin!

Nasıl çalışır

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

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

-nBayrak ve ücretsiz gerektirir -M5.010| -E:

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

Nasıl çalışır:

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

Bir bayttan tasarruf etmek için üçlü operatör kullanmanızı öneren msh210'a teşekkürler


3

Baloch Gyr , 9 bayt

{ṇ₁cḷ}ᵐpᵈ

Çevrimiçi deneyin!

Truthy / falsy çıktısı, Brachylog olan başarı / başarısızlık kestirimi ile elde edilir.

Daha önce iki giriş dizesinin aynı uzunluk eksi beyaz boşluk olacağı varsayımı cṇ₁cḷḍyerine bir bayt kullanmıştı {ṇ₁cḷ}ᵐ, ancak başarısız olması durumunda başarılı olacağını fark ettim 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 bayt

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

Blech, ikisi function/returnbeni burada öldürüyor.

İki stringgiriş arasındaki farkı arraykarakter olarak döndürür . PHP [], returngereklilikleri yerine getirerek sahte sayılır .


3
function($x,$y){$S=str_split;return array_diff($S(trim($x)),$S(trim($y)));}-> 75 bayt. Sonucu döndüren adsız bir işlev oluşturur. Bu uzun işlevi kaldırdım ve aramaları str_splitkısaltmak için atanmış bir değişkenle değiştirdim .
Ismael Miguel,

Güzel. Bir fonksiyona indirgemek için onu ince ayarlamıştım, bu iki adım ileride, aferin.
ricdesi

2

Bash + GNU yardımcı programları, 51

f()(fold -1<<<${@^^}|sort)
f $1|diff -qBw - <(f $2)
  • Bir işlevi tanımlayın f():
    • ${@^^} tüm parametreleri büyük harfe dönüştürür
    • fold -1 karakterleri böler - her satıra bir tane
    • sorts çizgileri
  • tam fark çıktıyı bastırmak ve boşluk değişimlerini göz ardı diffetmek -qiçin çağrı yap-Bw

2

Pyke (30, rekabetçi olmayan), 9 bayt

Fl1dk:S)q

Açıklama:

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

2

Mathematica, 77 76 bayt

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

İlk bölüm aslında başka bir soruya verdiğim cevaplardan biri!


2

Pike, 54 112 109 109 96 bayt

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

mixeddaha kısa olur array(string).

s1Argümanları anagram ise döner .


2

Q, 25 Bayt

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

NOT: - sayma f fonksiyon ismini içerir: testleri kolaylaştırmak için (lambda olarak 2 Bayt azaltabiliriz )

Okunabilir sürüm

{artan x boş değil x her x} üzerinde eşleşir

{.. 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)

Ölçek

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

oluşturur (1b = doğru, 0b = yanlış)

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

Q hakkında

Kx.com tarafından geliştirilen, genel amaçlı dil (APL türevi, veri işlemede uzman). Windows / Linux / MacOS için ücretsiz tam fonksiyonel değerlendirme sürümü.


Ne demek istiyorsun, diğer diller ciddi değil mi? :-P
Luis Mendo

Eğer fdüzgün değerlendirmek için kodu için gereklidir, o zaman sayılmalıdır. Aksi takdirde, gönderim kodunuzdan çıkın ve sadece işlevi nasıl atayacağınızı göstermek için örneklerde kullanın.
Mego

Tabii ki, diğer diller Q kadar ciddi. Fakir ingilizcem için yalvarıyorum. Ancak bazı diller okunabilirliği feda eder veya bu tür yarışmalar için geçici olan kütüphanelerle donatılır. Q, kodun çok okunaklı olmamasına rağmen, 'genel amaçlı bir dildir'.
J. Sendra

Daha sonra alçalırsanız x'i bir kez atamanız yeterlidir, bu nedenle k)~/{x@<x:_x@&~^x}'17 byte için .. ama bu, 19 yerine k), Kkodun yerine kodun gerektiği gibi Q...
streetster

2

APL, 31 karakter

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

Kullanılacak:

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

İngilizcede:

  • { ... }¨⍵: Argümanın iki unsurunun her biri için
  • x←('.'⎕R'\u0')⍵~' ': büyük harfe dönüştürün (bir regex kullanarak ...) dizgiyi boşluksuz bırakın ve geçici sonucu atayın x
  • x[⍋x]: x sırala
  • ≡/: sıralamadaki iki sonucu karşılaştırın: eşleşirlerse, 1 döndür.

Çevrimiçi denemek mümkün mü? Birlikte çalıştığımız bu ama gerçekten nasıl kullanılacağını bilmiyorum
Luis Mendo

Emin. Burada: sonra f 'first avatar' 'second avatar'
yazabildiğiniz

Teşekkürler! Belki bunu cevaba ekleyebilirsin? Böylece insanlar deneyebilir
Luis Mendo

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

@ Adám: Bu işe yaramaz çünkü 1 ≡/{x[⍋x←0~⍨32|⎕UCS⍵]}¨'pp' '00'verir.
lstefano

2

Java, 218 Bayt

Java'yı ilk defa yazdım ...

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 yapmak:

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

Neredeyse bir yıl geçtiğini biliyorum, ancak bunun gibi 32 baytla golf oynayabilirsiniz: 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 bayt ) Veya bir Java 8 lambda'ya dönüştürürseniz, şöyle olabilir: 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 bayt ). İşte test kodlu bir TIO.
Kevin Cruijssen


1

Ruby, 50 bayt

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

Yazma f=->{...}ve f[]==f[]uzun süredir. :(


1

PowerShell, 81 bayt

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

Bağlantılı Anagram yarışması hakkındaki cevabımın küçük bir tekrarı.

Karakter dizisi olarak girdi alır, -replaceboşlukları kaldırmak için bir işlem yapar , sortbunlar (ASCII değerine göre değil, alfabetik olarak sıralar), sonra -jointekrar dizgeye geri döner. -eqPowerShell olduğu gibi varsayılan küçük harf duyarsız gereğidir, ama burada dizeleri üzerinde yapılmalıdır [char]'a'için eşit değildir [char]'A'için, dolayısıyla nedeni -join.


1

Perl, 35 bayt

İçin +1'i dahil et -p

Komut satırında verilen programa bağlı olduğundan biraz küfürlüdür.

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

Sonra dizeleri STDIN'de 2 ardışık çizgi olarak verin

Çok küfürlü bir çözüm 30 bayttır:

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

Dizeler anagram değilse bu nedenle çöker ve bu nedenle kabuk açısından yanlış bir çıkış kodu verir. Aynı zamanda STDERR'ye bu durum için çöp verir. Dizeler anagram ise program sessizdir ve "doğru" bir çıkış kodu verir



1

Excel VBA, 122 Bayt

Anonim VBE acil durum penceresi Aralıktan girdi alan [A1:B1]ve VBE acil durum penceresine çıkan işlev

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 bayt

Bir engele ihtiyacım var !!

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
Programlama Bulmacaları ve Kod Golf'üne Hoş Geldiniz! Genel kural, dilinizi, gönderinizin başlığında bayt sayınızla bir araya getirmektir. Bunu #, ilk satıra bir satır ekleyerek yapabilirsiniz . Ayrıca kod golf soruları için programınızın golf oynamak için gereklidir. Başlamak için gereksiz boşlukları silmeli ve tek karakterli değişken isimleri kullanmalısınız. Ayrıca, biraz daha bayttan tasarruf etmek için her zaman tam bir program yerine (açıkça yasaklanmadıkça) bir işlev kullanabilirsiniz.
Denker

@DenkerAffe sen bana ninja'd :)
kedi

1
Neden tüm boşluklar ??
Hesap MakinesiFeline
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.