Tamsayıları Alfabele


19

Tamsayıları Alfabele

Belirli bir sayı kümesi için, yazıldıklarında alfabetik olarak sıralayın (örn. 1: bir, 2: iki, 90: doksan, 19: on dokuz). Kodunuz aralık için çalışmalıdır [-999999, 999999]. Çıktıda sayılar arasında bir sınırlayıcı bulunmalıdır. Bir boşluk ve aşağıdaki örneklerde gösterildiği gibi bir boşluk ve virgül işe yarayacaktır. Girdi bir tamsayılar dizisi, sınırlandırılmış sayılar dizisi olabilir ya da uygun görürsünüz. Tüm tamsayıların benzersiz olduğu varsayılır.

Sayılar bu meydan okuma amacıyla tirelenmez ve boşluklar diğer karakterlerden önce alfabetik olarak sıralanır. Negatif sayıların kelime kullanılarak ifade edildiği varsayılır minus. Örneğin, fourönce gelir four thousandve sayı -40dize kullanılarak sıralanır minus forty. Tüm sayıların yalnızca sayı sözcüklerinden oluşacağını ve hiçbir bağlaç içermeyeceğini varsayın (örneğin, two thousand forty twoyerine kullanın two thousand and forty two).


Test Durumları

Tek Haneli Tam Sayılar:

Giriş:

1, 2, 3, 4, 5

Çıktı:

5, 4, 1, 3, 2

Çok Haneli Tamsayılar:

Giriş:

-1002, 5, 435012, 4, 23, 81, 82

Çıktı:

81, 82, 5, 4, 435012, -1002, 23

Kelimeler arasındaki boşluklar, tire, virgül veya "ve" yok:

Giriş:

6, 16, 60, 64, 600, 6000, 60000, 60004, 60008, 60204, 60804

Çıktı:

6, 600, 6000, 16, 60, 64, 60000, 60008, 60804, 60004, 60204

Unutmayın, bu , bu yüzden en az baytlık kod kazanır. Boşluğa izin verilmez!


İlgili ilgili korumalı alanın bağlantısı .
wubs

Girdi hiç tek bir tamsayıdan daha fazlasını içerecek mi?
ETHproductions

@ETHproductions Hayır, olmayacak. Bunu soruda belirteceğim.
wubs

8
PPCG'ye hoş geldiniz. Guzel profil resmi. : D Güzel bir ilk soru.
AdmBorkBork

@TimmyD Teşekkürler! Burada yapabileceğim her şeyi PowerShell-ing'i dört gözle bekliyorum.
wubs

Yanıtlar:


5

JavaScript (ES6), 189 179 186 bayt

let f =

a=>a.sort((x,y)=>!x-!y||(X=q(x),Y=q(y),X>Y)-(X<Y),q=n=>n<0?"L"+q(-n):n>999?q(n/1e3)+"Z"+q(n%1e3):n>99?q(n/100)+"K"+q(n%100):n>19?"  cYHFVSCO"[n/10|0]+q(n%10):"0PdaIGTQAMWDbXJEURBN"[n|0])

let g = a => console.log(`[${f(a)}]`)

g([1,2,3,4,5])
g([-1002,5,435012,4,23,81,82])
g([0,1000,1100])
<input id=I value="1 2 3 4 5"><button onclick="g(I.value.match(/\d+/g)||[])">Run</button>

Temel fikir, her bir giriş numarasını, diğer tüm sayı dizesi çiftlerine kıyasla doğru sözlüksel konumda olan kısa bir dizgeye dönüştürmektir. Kullanılan sözlük şöyledir: (Snippet'i çalıştırmayın; sadece uzun listeyi gizlemek için kullanılır.)

Bu, her sayıyı sözlüksel olarak doğru konumuna eşlemek için çok özlü bir yol oluşturur. Özyinelemeli qişlev bunu yapar:

q(-X)        => "L" + q(X)
q(XYYY)      => q(X) + "Z" + q(YYY)
q(XYY)       => q(X) + "K" + q(YY)
q(XY >= 20)` => "  cYHFVSCO"[X] + q(Y)
q(X)         => "0PdaIGTQAMWDbXJEURBN"[X]

0Dizesinin başında 100 (karakteristiği gibi sağlamaktır one hundreddönüştürülür PK0önce sıralanır) 101( one hundred onedönüştürülür PKP). Bu, 0 ( zero) dizinin önüne sıralanan garip bir senaryo oluşturur , bu nedenle bu sorunu aşmak için, sıralama işlevinde önce sağdaki sıfırları sıralarız !x-!y||(....


Görünüşe göre işe yaramıyor [1100, 1000]. Çıktının olmasını beklerdim 1000 (one thousand), 1100 (one thousand one hundred), ancak çıktı girdiyle aynı sıradadır.
süt

@milk Hmm ... Bunun neden olduğundan emin değilim, ama içine bakacağım.
ETHproductions

@milk Ah, 1000olarak ayrıştırılıyor one thousand zero; Bunu bir an için çözeceğim. 0Yine de tek başına desteklemeli miyiz ? Bu, koduma 15 bayt veya daha fazla ekleyecek benzersiz bir durum.
ETHproductions

11

7 Inform 214 201 118 bayt

Inform 7 golf için kesinlikle korkunç bir dildir, bu yüzden burada bir şans vermek istedim.

Girinti tab ( \t) karakterlerini kullanmalıdır , ancak HTML bunlardan hoşlanmamaktadır. Tersine, Inform girinti için boşlukları sevmez, bu nedenle kodu test etmek için buradan kopyalayıp yapıştırırsanız boşlukları sekmelerle değiştirmeniz gerekir. Ya da bunun yerine Markdown kaynağından kopyalayıp yapıştırın.

golfed:

X'e:
    Tablo 1'de tekrarlayın:
        şimdi Q girişi "[R kelimesi girişi]";
    Tablo 1'i Q sırasına göre sıralayın;
    "[Tablo 1'de R]" deyin.

Giriş bir Inform tablosu olmalı, şöyle olmalıdır ( \tsütunlar arasında):

tablo 1
R (sayı) Q (metin)
-1002
5
435012
4
23
81
82

Çıktı:

81, 82, 5, 4, 435012, -1002, 23

Bu işlev, yeni bir sütuna her sayının metinsel bir gösterimini ekleyerek tablodan bir kez geçer. Sonra tablo satırlarını metin sütununa göre sıralar; Inform'de dizeler sözlükbilimsel olarak sıralanır. Son olarak, orijinal sütunu yeni sırayla yazdırır. Uygun bir şekilde, tablo 7'yi yazdırmak için Inform 7'nin "ham ama bazen yararlı" formatı, tam olarak istendiği gibi virgülle ayrılır.

Ungolfed, kazan plakası işlevi nasıl arayacağınızı gösteriyor:

Sayıları alfabetik sırada yazdırmak için:
    Sıralanabilir Sayılar Tablosunda tekrarlayın:
        şimdi ad girişi "[kelimelerdeki dizin girişi]" dir;
    Sıralanabilir Sayılar Tablosunu ad sırasıyla sıralayın;
    "[Sıralanabilir Sayılar Tablosundaki dizin sütunu]" deyin.

Sıralanabilir Sayılar Tablosu
dizin (sayı) adı (metin)
-1002
5
435012
4
23
81
82

Bir oda var.
Oynatma başladığında: sayıları alfabetik sırada yazdırın.

1
Biraz kafam karıştı. wordsBilgilendirme 7'de yerleşik sayıların hecelenmiş sürümlerine başvuru var mı ?
Pavel

1
@Pavel Gerçekten! "(sayı) kelimelerde", sayının metinsel olarak temsil edildiği bir dize döndürür. Negatif sayılar için uygun şekilde "eksi" kullanır ve kelimeler arasında tireler koyarken, tutarlı bir şekilde yapar ve tüm harflerden önce tireleri alfabetik hale getirir (böylece sonuç aynıdır).
Draconis

2
Dil seçimi için +1. Kontrol etmeliydim, ama yine de bazı golf fırsatları kaldığından şüpheleniyorum; örneğin, ayrıştırıcı gerçekten tüm bu "the" makalelerini gerektiriyor mu? Ve OP'ye sormanız gerekir, ancak "ve" nin geçerli bir sınırlayıcı olmamasının açık bir sebebini görmüyorum. Olmasa bile, tek bir alana açıkça izin verilir, bu yüzden say "[R entry] "yeterlidir.
Ilmari Karonen

Sonunda "ve" iyi olduğunu söyleyebilirim. Sınırlayıcıların tek tip olması gerektiğini söylemedim, bu yüzden bu kabul edilebilir bir cevap. En ilginç cevap için puan verebilirsem, sana verirdim. Bu dilin okunabilirliğinden gerçekten zevk alıyorum, hatta golf oynuyorum. İyi iş!
wubs

Sonunda Inform7 ile biraz oynama şansım oldu ve girişinizi sadece 118 bayta indirmeyi başardım. Yorumlarda Bilgi kodu yayınlamak çok iyi çalışmadığından, devam edip doğrudan cevabınızda düzenledim. Umarım aldırmazsanız, düzenlemelerimi istediğiniz gibi geri döndürmekten ve / veya düzeltmekten çekinmeyin.
Ilmari Karonen

4

Mathematica, 67 bayt

SortBy[#,#~IntegerName~"Words"~StringReplace~{","->"","-"->""}&]&

Adsız fonksiyon, argüman olarak bir tamsayı listesi alır ve değer olarak bir tamsayı listesi döndürür. #~IntegerName~"Words", tamsayısını İngilizce olarak değiştiren bir yerleşiktir. IntegerNamebazen çıktısında virgül ve kısa çizgi bulunur, bu nedenle StringReplaceçağrı bunlardan kurtulur. (Ne yazık ki kısa çizgi aslında UTF-8'deki 3 baytlık karakterdir, 8208'dir.) Ardından SortByorijinal listeyi değiştirilen tamsayı adının değerine göre alfabetik olarak sıralar.

Hoş bir tesadüf: çıktısı yerine IntegerNamekullanır - ancak izin verilen sayıların herhangi birinin adlarında görünen hiçbir kelime bu iki kelime arasında alfabetik değildir, bu yüzden değiştirmeye gerek yoktur!negativeminus

(Bana hatırlattığı için ngenise şapka ucu Sortby.)


Kudos! Bu çözümü almaya çok yaklaştım, ama bu çizgi bana baş ağrısı veriyordu!
ngenisis

Buradaki cevabınız gerçekten doğru kısa çizgi kullanıyor mu? Eğer sahip olduklarınızı Mathematica'ya kopyalarsam, kısa çizgilerin yerini almaz IntegerName. Wolfram belgeleri bunun unicode karakter 2010 olduğunu söylüyor .
ngenisis

Muhtemelen hayır, o zaman — Bu cevapta doğru tireyi almaya çalıştım, ancak başarılı olamadığım anlaşılıyor.
Greg Martin

Cevabınızı ikiye
J. Antonio Perez

Ve sonra ... dizede gereksiz değişiklikler yaparsınız.
J. Antonio Perez

4

Bash + GNU araçları + bsdgames, 52

  • @İzabera sayesinde 4 bayt kurtardı.
sed 's/.*/echo `echo &|number`:&/e'|sort|sed s/.*://

G / Ç, yeni satırla sınırlandırılmış satırlardır.

  • İlk sed ifadesi, her sayısal sayıyı, sayının sözcük biçimini veren bir kabuk komutuyla değiştirir ( bsdgamesnumber yardımcı programı ) ve ardından :numaranın sayısal biçimini .
  • Bu daha sonra sortdüzenlenir.
  • Daha sonra ikinci sedkarakter :, sayıları gerektiği gibi sıralanmış şekilde bırakarak, ve işaretlerini içeren satırları çıkarır.

number "eksi" yi doğru şekilde işler ve çıktısı, belirtilen biçime yeterince yakındır. sort gerektiği gibi çalıştığı belirtilen . "Kırk dört" yerine "kırk dört" üretir, ancak bu sıralama açısından önemli olmamalıdır.

Bsdgames paketinin yüklenmesi gerekebilir:

sudo apt-get install bsdgames

sedVe sortyardımcı programlar dağıtıma zaten neredeyse kesinlikle bulunmaktadır.


-t:işe yaramaz ve kullanabilirsiniznumber<<<&
izabera

@izabera Evet - teşekkürler - kaldırdım -t:. Ancak sed'in eval özelliği komutları kullanarak çalıştırır sh, bu nedenle bash özellikleri <<<çalışmaz.
Dijital Travma

sh bash olduğu sürece iyi çalışır: P
izabera

@izabera Hayır - bash, shPosix sh'i mümkün olduğunca taklit etmeye çalıştığı gibi başlarsa, bu gibi bashisms <<<kapalıdır. GNU sed'ın eval özelliği ile komutları başlar /bin/sh -c ...ve /bin/bash -c .... Bunu denedin mi?
Dijital Travma

Bash asla kapanmıyor <<<, posix modunda bile değil
izabera

1

Python + inflect, 97 91 89 bayt

from inflect import*
a={x:engine().number_to_words(x)for x in words}
sorted(a,key=a.get)

Kullandı inflectwordsTamsayı dizisini fonetik / dize gösterimlerine dönüştürmek kütüphaneyi kullandım . Anahtarların sayısal gösterimi ve değerlerin dize gösterimi olduğu k / v çiftleri sözlüğünde saklanır. Anahtarlar listesini değerlere göre sıralanmış olarak döndürdü.

EDIT: ETHproductions ve Alex.S sayesinde 5 ve 3 bayt kurtardı!


PPCG'ye Hoşgeldiniz! Boşlukları kaldırarak bunu golf oynayabilirsiniz ; örneğin, ikinci satır olabilir a={x:inflect.engine().number_to_words(x)for x in words}.
ETHproductions

İkinci satırı kullanarak from inflect import*ve dışarı atarak iki bayt kaydedebilirsiniz inflect..
Alex.S

Ne yazık ki, bu da 40, 44, 40000, 40804, 40004, 40204 (bu sırada kalmalıdır) listesini doğru bir şekilde sıralayamıyor gibi görünüyor.
Ilmari Karonen

0

Mathematica, 30 bayt

Aşağıdaki cevap, tamsayıların bir listesini girdi olarak alacak ve bunları alfabetik adlarına göre sıralayacak saf bir işlev çıkarır. Sadece doktorun emrettiği şey;)

SortBy[#~IntegerName~"Words"&]

İşte ungolfed sürümü:

SortBy[IntegerName[#, "Words"]&]

İşte bir örnek kullanım:

SortBy[#~IntegerName~"Words"&][{0,1,2,3,4,5,6,7,8,9,10}]

Ayrıca şu şekilde de yazılabilir

SortBy[#~IntegerName~"Words"&]@{0,1,2,3,4,5,6,7,8,9,10}

Aynı çıktıları üretirler - matematiksel olarak, buna f[x]eşdeğerdir f@x.

Outputs: {8, 5, 4, 9, 1, 7, 6, 10, 3, 2}

Mathematica'da başka bir kullanıcının yayınladığı çok daha uzun bir cevap var. Bu cevap, mathematica'nın sayıları alfalatize etme şekli ile OP tarafından belirtilen sayıların alkalize edilmesi gerektiğine daha iyi uyması arasındaki küçük farkları düzeltmeye çalışır, ancak düzelttikleri şeyler sıralama düzenini etkilemez ve cevabım onlarınkiyle aynı şekilde çıktı:

MyF = SortBy[#~IntegerName~"Words"&];
TheirF = SortBy[#, #~IntegerName~"Words"~ StringReplace~{"," -> "", "-" -> ""} &] &;
MyF[Range[-999999, 999999]] == TheirF[Range[-999999, 999999]]
(*Outputs True*)

Büyük bir soruşturma! - ne yazık ki, aslında aynı düzeni vermezler. TheirF888'i 880.000'den önce doğru sıralar, oysa doğru MyFdeğildir. Muhtemelen sorun garip tirenin kopyalanması ile ilgilidir: sürümünüz TheirFmuhtemelen normal tirelerin yerini alır (bunların hiçbiri yoktur), gerçek sürüm garip 3 bayt Unicode tiresinin yerini alır. (Virgül kaldırmanın gerekli olup olmadığını görmek yine de ilginç olacaktır.)
Greg Martin

[999999] Aralığı'nda test ettim. Virgüllerin kaldırılması gereksiz gibi görünüyor, ancak "[Hyphen]" yerine "" kullanılması kesinlikle gerekli.
ngenisis

0

Ortak Lisp, 113 bayt

Harici kütüphane gerekmez.

(print(mapcar #'cdr(sort(loop for i in x collect(cons(format()"~r"i)i))(lambda(y z)(string-lessp(car y)(car z))))))

Çıktı eğer xolduğunu '(1 2 3 4 5):

(5 4 1 3 2)
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.