PronunciationSort ™


24

Farklı fantezi sıralama algoritmalarını hepimiz biliyoruz, ancak bunların hiçbiri bize telaffuzu kolay bir şekilde sayılar vermiyor. Bunu düzeltmek için, sayı listelerini sıralamanın en doğal yolu olan TelaffuzSort ™ 'u kullanmayı öneriyorum.

Telaffuz

Sayıların okunması için resmi kurallar (bu zorlukla), rakamların birer birer telaffuz edilmesi ve sonuçta elde edilen dizgenin leksikografik sıraya göre sıralanmasıdır. Örnek olarak, bu sayının 845belirgin "eight four five"olduğu ve buna göre sıralanması gerektiği anlamına gelir .

Olumsuz sayılar

Negatif sayılar sözcüğü hazırlayarak telaffuz edilir "minus". Böylece, -23olarak telaffuz edilir "minus two three". Bunun negatif sayının çıktının ortasında 4(dört) ve 9(dokuz) ile başlayan sayılar arasında bitmesine neden olduğunu unutmayın .

Bir kılavuz olarak, TelaffuzSort ™ 'un resmi kelime sırası şudur:

  • sekiz
  • beş
  • dört
  • eksi
  • dokuz
  • bir
  • Yedi
  • altı
  • üç
  • iki
  • sıfır

Yani,

8, 5, 4, -, 9, 1, 7, 6, 3, 2, 0

Giriş

aralığında en çok 100 öğe içeren bir tam sayı listesi . Dizelerin listesi olarak giriş yapılmasına izin verilmez. Diliniz liste olarak girişi desteklemiyorsa, girişi ayrı tamsayılar olarak vermenize izin verilir.[999,999]

Giriş geçersiz sayılar veya 0 ile başlayan sayıları içermez (0 sayısının kendisi hariç). Giriş genellikle sıralanmayacak, herhangi bir sırayla verilebilir.

Çıktı

Aynı tamsayılar, Telaffuz sırasına göre. Sayıların yalnızca sıralama elde etmek için telaffuzlarına dönüştürülmesi gerektiğini, çıktıların herhangi bir dize içermemesi gerektiğini unutmayın.

Örnekler

Örnekler için, orta adım (parantez içinde sarılmış) sadece bir kılavuz görevi görür ve çıktının bir parçası değildir.

[1, 2, 3] -> (['one', 'two', 'three']) -> [1, 3, 2]
[-1, 0, 1, 2] -> (['minus one', 'zero', 'one', 'two']) -> [-1, 1, 2, 0]
[-100, 45, 96] -> (['minus one zero zero', 'four five', 'nine six']) -> [45, -100, 96]
[11, 12, 13, 134, 135] -> (['one one', 'one two', 'one three', 'one three four', 'one three five']) -> [11, 13, 135, 134, 12]

Sonuçlarınızı doğrulamak için bir komut dosyası da var .


5
Neden "bir" ("kazanan" olarak telaffuz edilir) ikiden sonra ve sıfırdan önce gelmiyor?
Ben Miller - Monica

3
@BenMiller Sanal alana yorum yapan siz miydiniz hatırlayamıyorum, ancak bu yorum bana deja vu verdi. Burada cevaplamak için düşündüm, ancak heceleme tartışmalarından kaçınmak için hecelemeye başladım (örneğin, "iki" vs "de", "kazandı" veya "wan")
maxb

17
Bu yüzden aslında "
erteleme

3
serseri. Telaffuz etmenin ne kadar zor olduğuna göre sıralanacağını umuyordum ...
NH.

2
Buradaki zorluk gerçekten yeniden adlandırılmalıdır, çünkü buradaki sıralama neredeyse telaffuz ile ilgisi yoktur. O telaffuz tabanlı olsaydı gayet daha karmaşık olacağını (örneğin, dört önce gelebilir beş sıralama tek sesli ⟨ɔː⟩ diftong ⟨aɪ⟩, ama daha önce eğer beş önce dört sıralama o önce ⟨a⟩ bir türevi ise -deriliş ⟨ɔ⟩ - bildiğim kadarıyla, ne IPA'da ne de başka bir programda telaffuz için belirlenmiş bir sıralama düzeni yoktur).
Janus Bahs Jacquet

Yanıtlar:


8

05AB1E (eski) , 15 bayt

Σε•Koéa₃•'-3ǝsk

Çevrimiçi deneyin!

açıklama

Σ                 # sort by
 ε                # apply to each
             sk   # index of the element in
  •Koéa₃•         # "85409176320"
         '-3ǝ     # with "-" inserted at index 3

Sıkıştırılmış tamsayıda bir hata var gibi gözüküyor •ĆU‘•.. Her ne sebeple olursa olsun haritalama / sıralama sırasında yeni bir satır ekler. Σ•ĆU‘•"54-ÿ"sSküzerinde çalıştığım 15 baytlık bir alternatif olabilirdi, eğer o garip hata için olmasaydı .. •ĆU‘•9176320
Kelimenin

1
@KevinCruijssen: Bu garip. Sizinki …54-ìbile 14 olacak
Emigna 27:18

@KevinCruijssen: Σ•RT‹•Á…54-ìsSk15 için yapabilirsin
Emigna

•t∍ýJ•'-ìÁÁaynı zamanda çalışacak
Emigna 27:18


8

Jöle ,  15  13 bayt

ṾV€ị“Þ⁽3Z6»µÞ

Çevrimiçi deneyin!

Bir tamsayı listesini kabul eden bir monadik link.

Nasıl?

Tamsayıların basamağının sıra değerlerine göre sıralanır (burada --1'in bir "basamağı"), "murgeon lix" sihirli dizesindeki 1 tabanlı ve modüler dizinindeki karakterleri kullanarak dizgelere dönüştürülür.

Sıralama, bir boşluğun herhangi bir harften daha az olduğu düşünüldüğünde etkin biçimde alfabetiktir.

Sihirli dize "murgeon lix" Jelly'in sıkıştırmada kullanılan sözlüklerini inceleyerek bulundu. Gereklilikleri karşılayan 11 harften sözler yoktur (ve çoğaltmanın üzerine gelebilecek olanlardan hiçbiri yoktur). boşluklar harflerden önce sıralandığından bir sonraki en belirgin seçim, yedi uzunluğa ve ardından üç uzunluğa sahip olan bir kelimeden ibarettir. "murgeon" ve "lix" sadece tatmin edici bir kombinasyondur, ancak boşluk olmadan başkaları da mümkün olabilir (örneğin “£Py:ƥ», aynı bayt sayısı için çalışan "murgeonalix" dir)

ṾV€ị“Þ⁽3Z6»µÞ - Link: list of integers
            Þ - sort by:
           µ  -   the monadic link: -- i.e. do this for each integer, then sort by that
Ṿ             -     unevaluate  (e.g. -803 -> ['-','8','0','3'])
 V€           -     evaluate each as Jelly code  (e.g. ['-','8','0','3'] -> [-1,8,0,3])
    “Þ⁽3Z6»   -     "murgeon lix" (compression of words in Jelly's dictionary plus a space)
   ị          -     index into (1-indexed & modular) (e.g. [-1,8,0,3] -> "i xr")

Önceki @ 15 bayt :

ṾV€ị“¡Zo⁶’Œ?¤µÞ

Burada “¡Zo⁶’Œ?¤, sayıların tüm izinleri sözlükbilimsel olarak sıralandığında 21,340,635 endeksinde bulunacak olan doğal sayıların ilk permütasyonunu bulur - bu [6,10,9,3,2,8,7,1,5,4,11]. ( Hesaplama ve bu talimatları bir arada “¡Zo⁶’gruplandırırken, 21340635 no.lu temel 250 temsilidir )Œ?¤


Açıklamada bile, kendimi pek akıllı hissetmiyorum. Müthiş bir çözüm!
maksimum

Kısa versiyonun anlaşılması da daha kolay!
Jonathan Allan

7

Perl 6 , 30 bayt

*.sort:{TR/0..9-/a5982176043/}

Çevrimiçi deneyin!

GB'nin Ruby çözümü.

Orijinal 35 bayt sürümü

*.sort: (~*).uninames».&{S/\w*.//}

Çevrimiçi deneyin!

Her sayıyı bir dizgeye dönüştürün, her karakterin Unicode adını alın, ilk sözcüğü ("DIGIT" veya "HYPHEN") soyun, sonra sıralayın.



6

K (ngn / k) , 21 20 bayt

{x@<"54-9176320"?$x}

Çevrimiçi deneyin!

{ } argümanlı fonksiyon x

$ dizge olarak biçimlendir

""?-263"8"

< sıralama artan artan hesaplama

x@ bu endekslerdeki argüman


6

Python 3, 68 bayt 67 bayt 64 bayt

lambda x:sorted(x,key=lambda y:[*map('54-9176320'.find,str(y))])

sortedAnahtar için anonim bir lambda ile yerleşik işlevi kullanır . Sıralama düzenini kodlayın ve giriş listesindeki her değerdeki her basamağı sıralama düzeni listesindeki konumuna karşılaştırın.

Düzenleme: Parametre bulunmadığında geri dönme 8avantajından yararlanmak için sıralama listesinden çıkarılarak 1 bayt kaydedildi . Maxb için teşekkürler.str.find-1

Düzen2: Oluşturucu listyerine hazır bilgi dizisindeki yıldızlı açma paketinin sözdizimini kullanarak 3 bayt kaydedildilist

Çevrimiçi deneyin!


1
Dize ilk 8'i kaldırabilir misin? Alt dize bulunmazsa Python -1 döndürür.
maxb

@ maxb İyi yakala. Düzenlenen.
Mypetlion


5

Pyth, 17 16 bayt

oxL"54-9176320"`

Online Deneyin burada ya bir kerede tüm test durumları doğrulamak burada .

oxL"54-9176320"`NQ   Implicit: Q=eval(input())
                     Trailing N, Q inferred
o                Q   Order the elements of Q, as N, using...
               `N      Convert N to string
 xL                    Get the index of each character of that string...
   "54-9176320"        ... in the lookup ordering
                       (if character missing, returns -1, so 8 is still sorted before 5)

@Ngn ve K cevabı sayesinde 1 bayt kurtarıldı , sözlük dizgisinin başından 8'i çıkardı


4

Japt, 19 bayt

ñ_s ®n"54-9176320

Dene


Güzel çözüm! Dizelerin listesi olarak giriş yapmak ne yazık ki mümkün değil.
maksimum

Sen kötüye kullanarak bazı tasarruf edebilirsiniz S.n(s): ñ_s ®n"54-9176320(görünüşte S.n(s)tam aynıdır s.b(S)için Suzunluğu 1, Döndürdüğü dışında 0yerine -1)
ETHproductions

Güzel numara, @ETHproductions, teşekkürler :) Gelecek için bunu hatırlamak zorunda kalacağım.
Shaggy

3

Retina 0.8.2 , 36 bayt

T`-d`3:598217604
O`
T`3:598217604`-d

Çevrimiçi deneyin! Bağlantı test paketi içerir. Açıklama:

T`-d`3:598217604

:10. pozisyon için eksi işaretini ve rakamlarını telaffuz sırasına göre konumlarına çevirin.

O`

Telaffuz sırasına göre sırala.

T`3:598217604`-d

Siparişi orijinal eksi işaretine ve rakamlarına geri çevirin.



3

R , 58 bayt

function(x)x[order(mapply(chartr,"-0-9","dkfjicbhgae",x))]

Çevrimiçi deneyin!

Giriş, dolaylı olarak dize olarak dönüştürülen sayıların listesidir chartr. orderdaha sonra, orijinal listenin sıralanması gereken sırayı almak için sözcük sıralamasını kullanır.


3

Java (JDK 10) , 123 bayt

l->l.sort(java.util.Comparator.comparing(n->{var r="";for(var c:(""+n).split(""))r+=11+"54-9176320".indexOf(c);return r;}))

Çevrimiçi deneyin!

Bu saf bir Java uygulamasıdır. Çok golf oynanabilir olmalı.

Kredi


1
Değişen .chars-IntStream ve .reducedüzenli bir döngü 2 bayt kaydeder: n->{var r="";for(var c:(""+n).split(""))r+=10+"854-9176320".indexOf(c);return r;}. Ek olarak, bir rakam daha 10+"85geçerek kaydedilebilir 20+"5, çünkü .indexOffor rakamı 8-1 ile sonuçlanır. Çevrimiçi 123 bayt
Kevin Cruijssen


2

Kırmızı , 114 bayt

func[n][g: func[a][collect[foreach c form a[keep index? find"854-9176320"c]]]sort/compare n func[x y][(g x)< g y]]

Çevrimiçi deneyin!

Daha okunabilir:

f: func [ n ] [
    g: func [ a ] [
        collect [ 
            foreach c form a [ 
                keep index? find "854-9176320" c
            ]
        ]
    ]
    sort/compare n func [ x y ] [ (g x) < g y ]
]

2

C ++, 353 bayt

Bu bir komedi girişiydi, ama zaman harcıyordum ve yazıyordum, bu yüzden gönderemiyorum ... Bir kıkırdamın tadını çıkarın ve kaçırdığım bir yer koruyucusu varsa bana bildirin!

#include<algorithm>
#include<iostream>
#include<iterator>
#include<numeric>
#include<string>
using namespace std;auto f(int i){auto s=to_string(i);for(auto&c:s)c='A'+"854-9176320"s.find(c);return s;}int main(){int a[100];auto b=begin(a);auto e=end(a);iota(b,e,-50);sort(b,e,[](int l,int r){return f(l)<f(r);});copy(b,e,ostream_iterator<int>(cout," "));}

Çıktı:

8 5 4 48 45 44 49 41 47 46 43 42 40-8 -5 -50-4-48-45-44-49-41-47-46-43 -42 -42 -40 -9 -44-49 14 - 19 - 11 - 17 - 16 - 13 - 12 - 10 - 10 - 7 - 6 - - - - - - - - - - - - - (- - - (- - (-) (- (-) (- (-) (- (-) (- (-) - (- (()) (- (-) (- (-) (- (-) - (14) - (-) (14 -19 -11-17 -16-13-12-10-10-7 -6-3. 29 -21 -27 -26 -23 -22 -20 9 1 18 15 14 19 11 17 16 13 12 10 7 6 3 38 35 34 39 31 37 36 33 32 30 2 28 25 24 29 21 27 26 23 22 20 0


"Ben basın yok debug az çizgiler vardır girerseniz" Ben de sloganı ile canlı görmek
maxb

1
Hey, bu dilde anlamsız boşluk bırakamıyorum! Bunu yapmak zorunda olmak komik, zamanın geri kalanını görerek, çok az şey beni başkalarının kodunu açmak kadar sinirlendirir, görünüşe göre dehşet verici bir monolitik duvar yazmanın daha akıllı görünmesini sağlayacak ve / veya aktif bir şekilde ödeme yapmalarını sağlayacak yazdıkları her yeni satır için.
underscore_d

1
Merhaba! Çözümünüzü 195 karaktere kadar
sıktı

@MaxYekhlakov Cool, düşünmek için teşekkürler! Biraz daha okuduktan sonra anlıyorum; zorunlu olarak tam bir derlenebilir program sunmam gerekmiyor, bunun yerine sadece belirtilen girdi ve çıktıları işleyebilecek işlevlere ihtiyacım var. D'oh!
underscore_d

2

Mathematica, 68 bayt

SortBy[If[# < 0,"m ",""]<>StringRiffle@IntegerName@IntegerDigits@#&]

İşlev. Girdi olarak tam sayıların listesini alır ve sıralanmış listeyi çıktı olarak döndürür. Sadece her sayının rakamlarını ayırır IntegerDigits, her haneyi dönüştürür "zero", "one"ile, vb IntegerName, bir boşlukla ayrılmış dizeye dönüştüren StringRiffle, bir prepends "m "sayı negatifse ve sıralar bu dizeye dayalı. Gerçekten de, bulabildiğim en kısa yaklaşım buydu, çünkü Mathematica sadece aynı uzunluktaki listelerde doğal olarak sözlük kullanıyor; bu nedenle, 854-9176320dize işlevleri çok pahalı olduğundan, baytlara dayanan bir yaklaşım sona erer.


Yerleşiklerin bir kombinasyonu için her zaman matematiğe güvenin. Akıllıca bir çözüm!
maxb

1

05AB1E , 15 14 bayt

Σ•ĆU‘•…54-ìsSk

@Emigna sayesinde -1 bayt .

Çevrimiçi deneyin veya tüm test durumlarını doğrulayın .

Açıklama:

Σ                 # Sort by:
 •ĆU‘•            #  Push the compressed integer 9176320
      54-        #  Push the string "54-"
          ì       #  Prepend this string before the integer: "54-9176320"
           s      #  Swap so the current number to sort is at the top of the stack
            S     #  Convert it to a list of characters
             k    #  Check for each its index in the string (resulting in -1 for '8')

Madenin (bölümün bu 05AB1E ucunu bakın ne kadar büyük tamsayılar sıkıştırmak için anlamak için) •ĆU‘•olduğunu 9176320.

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.