Özel alfabeye göre sırala


9

Zor olan kelime listesini sıralayan bir program yapmak, sadece kelimelerin rastgele verilen bir alfabe sırasına göre yapılmasıdır.

Programınız bir dizi virgülle ayrılmış kelime ve yeni bir alfabe kabul edecektir.
Programınız her kelimeyi yeni sıralanmış sırada aynı şekilde çıkarır.

Misal:

Giriş:

home,oval,cat,egg,network,green bcdfghijklmnpqrstvwxzaeiouy

Çıktı:

cat,green,home,network,egg,oval

Bu bir , kazanan en kısa programa sahip olan kişidir.

Bu benim ilk görevim, bu yüzden soru / zorluktaki herhangi bir gelişme takdir ediliyor.


1. Örneğinizden, alfabenin kelimelerden bir boşlukla ayrıldığını alıyorum. Bu doğru mu? 2. Kelimeler her zaman küçük olacak mı?
Dennis

@Dennis her ikisi için evet
Mathetic

1
Bu bir hatadır. Bunu ben düzenleyeceğim.
Matematik

+1 OK soru (ilk denemede ;-)). Ama başlığın alaka düzeyini görmüyorum - belki de adını Sort by custom alphabetdaha yaratıcı veya daha yaratıcı bir şekilde yeniden adlandırabilirsiniz ?
Dijital Travma

@DigitalTrauma Evet, bu daha iyi olabilir. Kelimelerle biraz oynamaya çalıştım. Ascii ve utf-8 ve benzerlerine bir referans almayı amaçladım. Ama bu başarısız oldu. Daha iyi olan önerinizle değiştireceğim.
Matematik

Yanıtlar:


2

CJam, 26 19 17 bayt

rr:A;',/{Af#}$',*

Çevrimiçi deneyin.

Test durumu

$ cjam sort.cjam <<< 'home,oval,cat,egg,network,green bcdfghjklmnpqrstvwxzaeiouy'
cat,green,home,network,egg,oval

Nasıl çalışır

rr                    " Read two whitespace-separated tokens from STDIN. ";
  :A;                 " Save the second token (the alphabet) in A.       ";
     ',/              " Split the remaining token at commas.             ";
        {Af#}$        " Sort by the chunks' characters' indexes in A.    ";
               ',*    " Join, separating by commas.                      ";

Aynı yaklaşımı kullandığınız için, artık benim için gerçekten bir anlam ifade etmiyor.
Doktor

@Optimizer: Beni sekiz saniye dövüyorsun. Cevabınızı geri alırsanız, benimkini geri alırım.
Dennis

Hayır, bence önemsiz ve çok obv bir değişiklik. Cevabımı ilk etapta göndermeden önce güncellemelerinize bakmalıydım :)
Optimizer

4

Bash + coreutils, 37 bayt

tr ,$2 \\na-z<<<$1|sort|tr \\na-z ,$2

Çıktı:

$ ./alphasort.sh home,oval,cat,egg,network,green bcdfghijklmnpqrstvwxyzaeiouy
cat,green,home,network,egg,oval, $ 

1
Virgüllerle uğraşmanın güzel yolu!
Dennis

2

Pyth , 19 karakter

j\,o_mx_zdNchczd\,

Ölçek:

$ pyth -c "j\,o_mx_zdNchczd\," <<< 'home,oval,cat,egg,network,green bcdfghjklmnpqrstvwxzaeiouy'
cat,green,home,network,egg,oval

Açıklama:

                            Implicit: d=" "
                            Implicit: z=input()
j\,                         ",".join(
   o                                 order_by(lambda N:
    _                                                  rev(
     m                                                     map(lambda d:
      x_zd                                                              rev(z).index(d),
      N                                                                 N),
    chczd\,                                            z.split(" "[0].split(",")

Esasen, dizgideki karakterlerin dizin listesinin bir anahtarıyla parçaları sıralar, ardından virgülle birleştirir. Ters kayıt işlemleri dizeyi tekrar ayırmaktan daha kısadır.


18 bayt:j\,_omx_zdNchczd\,
Dennis

@Dennis çok zeki, teşekkür ederim.
isaacg

1

Yakut, 53 50 bayt

a,b=$*
$><<a.split(?,).sort_by{|w|w.tr b,'a-z'}*?,

Sıralamadan önce trözel alfabeyi değiştirmek için Ruby'yi kullanıyorum a-z. Girdi, komut satırı argümanıyla yapılır.


$><<Ekrana yazdırmak için bir baytı tıraş edebilirsiniz (o zaman alanı kaldırabilirsiniz). Bunun $*gibi değişkenlere atayarak a,b=$*ve #sort_byyerine yerine iki bayt daha kaldırabilirsiniz #sort_by!.
britishtea

@britishtea Teşekkürler. İhtiyacım olacağını düşündüm *$*(ilk başta sahip olduğum ve aynı uzunlukta olan).
Martin Ender

0

Python, 131

w,a=input().split()
print(",".join(sorted(w.split(","),key=lambda s:"".join(["abcdefghijklmnopqrstuvwxyz"[a.find(c)]for c in s]))))

İyileştirmek için bolca yer olmalı.


Sıralama işlevi olarak bir anahtar kullanmak zorunda değilsiniz - a.find(c)doğrudan listesini kullanın.
isaacg

0

JavaScript (E6) 102119

'A' değişkenindeki alfabeye göre 'M' eşleme işleviyle sıralama Açılır pencereyi kullanarak G /
Ç ile

x=prompt().split(/[ ,]/),
a=x.pop(),
M=w=>[10+a.search(c)for(c of w)]+'',
alert(x.sort((a,b)=>M(a)>M(b)))

1 dize parametresi ile (test edilebilir) işlevi olarak dize dizisi döndürme (92)

F=x=>(
  M=w=>[10+a.search(c)for(c of w)],
  x=x.split(/[ ,]/),
  a=x.pop(),
  x.sort((a,b)=>M(a)>M(b))
)

FireFox / FireBug konsolunda test et

F('home,oval,cat,egg,network,green zyxwvtsrqpnmlkjhgfdcbaeiou')

Çıktı

["network", "home", "green", "cat", "egg", "oval"]

1
-4 sıralama işlevinizi değiştirirseniz(M(a)>M(b))-(M(a)<M(b))
DocMax

@DocMax çok hoş. Bundan daha da basit olduğu ortaya çıktı ( stackoverflow.com/a/7232172/3640407 )
edc65

Giriş ve çıkış ve diğer ad için istemi yeniden kullanırsanız, girişleri ayrı ayrı alarak bölünmüş çağrıdan kaçınabilirsiniz. Bence bu birkaç karakterden tasarruf etmeli.
Ingo Bürk

Ayrıca şu an sadece telefonumdayım ama neden M bu kadar karmaşık? Kullanmak işe yaramaz M=w=>[...a].indexOf(w)mı? Maalesef şu anda test edemiyorum.
Ingo Bürk

@ IngoBürk w bir kelimedir, bir karakter değildir. M, w'deki her karakteri a'daki konumu ile değiştirir.
edc65

0

Clojure, 115 bayt

#(apply str(butlast(interleave(sort-by(fn[w](apply str(map(zipmap(sort %2)%2)w)))(re-seq #"[a-z]+"%))(repeat \,))))

Vay canına, bu iyi başladı (sort-by(fn[w](mapv(zipmap(sort %2)%2)w)))ama sonra ben vecdizeleri aynı şekilde sıralanmış almadım ve bu virgül araya ekleme de önemli miktarda kod alır.

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.