Yazılmış seri numaralarını sıralama


17

İki veya daha fazla eşit uzunlukta iki veya daha fazla hecelenmiş seri numarasının bir listesi verildiğinde, ör.

[[ "three" , "one"  , "four"  ],
 [ "one"   , "five" , "nine"  ],
 [ "two"   , "six"  , "five"  ],
 [ "three" , "five" , "eight" ]]

listeyi kelimelerin temsil ettiği rakamlara göre sıralayın:

[[ "one"   , "five" , "nine"  ],
 [ "two"   , "six"  , "five"  ],
 [ "three" , "one"  , "four"  ],
 [ "three" , "five" , "eight" ]]

Sayıların altta veya üstte yazılmasını, ancak karışık olmamasını isteyebilirsiniz.

Test senaryoları

[["three","one","four"],["one","five","nine"],["two","six","five"],["three","five","eight"]]
verir
[["one","five","nine"],["two","six","five"],["three","one","four"],["three","five","eight"]]

[["two","seven"],["one","eight"],["two","eight"],["one","eight"],["two","eight"],["four","five"]]
verir
[["one","eight"],["one","eight"],["two","seven"],["two","eight"],["two","eight"],["four","five"]]

[["one","four","one","four","two"],["one","three","five","six","two"],["three","seven","three","zero","nine"]]
verir
[["one","three","five","six","two"],["one","four","one","four","two"],["three","seven","three","zero","nine"]]

[["zero","six","one"],["eight","zero","three"],["three","nine","eight"],["eight","seven","four"],["nine","eight","nine"],["four","eight","four"]]
verir
[["zero","six","one"],["three","nine","eight"],["four","eight","four"],["eight","zero","three"],["eight","seven","four"],["nine","eight","nine"]]


Bunu doğru anladığımdan emin değilim, değil ["three","one","four"] === 314mi?
Nit

@Nit Evet, doğru.
Adám

@Nit Yazdıkları sayılarla. Ör. [314,159,265,358][159,265,314,358].
Adám

Rakamların belirli bir şekilde büyük harf kullanımını varsayabilir miyiz?
dylnan

@dylnanYou may require the numbers to be spelled in lower or upper, but not mixed, case.
totallyhuman

Yanıtlar:


14

Kabuk , 9 8 bayt

Ö†€¨tfṡn

Çevrimiçi deneyin!

Algoritma özyinelemenin Stax cevabından "ilham aldı" (sadece arama dizesini biraz değiştirdim), onu oylayın!

Hile, her harfi dizedeki konumuna eşler tfsen(bu programın sonunda sıkıştırılır). Husks listeleri 1 tabanlı ve eksik öğeler 0 döndürüyor, bu nedenle bu eşleştirmeyi alıyoruz:

"one"        [0,5,4]
"two"        [1,0,0]
"three"      [1,0,0,4,4]
"four"       [2,0,0,0]
"five"       [2,0,0,4]
"six"        [3,0,0]
"seven"      [3,4,0,4,5]
"eight"      [4,0,0,0,1]
"nine"       [5,0,5,4]

Gördüğünüz gibi, listeler mükemmel bir şekilde sıralanmıştır.


Net olmak için, liste karşılaştırması Husk'ta (ve diğer birçok dilde) şu şekilde çalışır:

  1. İki listeden biri boşsa, bu daha küçük olan listedir.
  2. İki listenin ilk öğeleri farklıysa, daha küçük ilk öğeye sahip olan öğe daha küçük listedir.
  3. Aksi takdirde, ilk öğeyi her iki listeden de atın ve 1. noktaya geri dönün.

Yanılmıyorsam, "w" de bırakılabilir, çünkü sadece "iki" ile "üç" karşılaştırması yararlıdır, ancak zaten "h" ye sahipsiniz. Bunun size yardımcı olup olmadığından emin değilim. Bu gerçeği henüz daha küçük olan bir stax programına nasıl entegre edeceğimi anlamadım.
özyinelemeli

... sadece mektuplar olsaydı tfrsenama sanırım withve senorada kelimeler olması sıkıştırmaya yardımcı olur.
Jonathan Allan

Teşekkürler çocuklar, daha da kısa bir dizi bulmam için bana ilham verdiniz: D
Leo

Yani, virgüllerin ilk virgülden sonra ondalık nokta ile değiştirilmesi gibi mi?
Çilek

@Strawberry Gerçekten değil, [1,0,0]daha küçük olarak kabul edilir [1,0,0,0](ancak bu program için bir fark yaratmaz )
Leo

10

Stax , 24 22 17 16 14 bayt

▄Ωφ▐╧Kìg▄↕ñ▼!█

Çalıştır ve hata ayıkla

Bu program, giriş için küçük harflerle yazılan rakam dizilerini alır. Çıktı satırsonu gibi ayrılmıştır.

one five nine
two six five
three one four
three five eight

Bu program, girişleri belirli bir dönüşüm altında elde edilen sıralamayı kullanarak sıralar. Her kelimedeki her karakter, dizedeki dizini ile değiştirilir"wo thif sen" . Orijinal diziler bu sıralamaya göre sıralanır. Daha sonra sonuçlar bir boşlukla birleştirildikten sonra yazdırılır.

Boşluklar hiçbir amaca hizmet etmez, ancak dizgi değişmezinde daha fazla sıkıştırmaya izin verir.


Stax hangi kodlamayı kullanır? Bu UTF-8'de 32 bayttır.
OldBunny2800

5
Değiştirilmiş CP437, "bayt" köprüsü gibi açıklar.
özyinelemeli

Böyle bir dize ile gelmek için bazı standart algoritma / yöntem var mı? Kavramın bir adı var mı?
Itai

@Itai: Öyle görünüyor, ama ne olduğunun farkında değilim.
özyinelemeli

6

Jöle , 12 bayt

OḌ%⁽Т%147µÞ

Monadik bir bağlantı.

Çevrimiçi deneyin! ... ya da test takımını görün

Nasıl?

Basamakları sıra sayılarına ve sonra taban 10'dan dönüştürmek ve daha sonra modülleri 4752'ye çevirmek 147, artan bir düzen verir:

 zero            , one         , two         , three               , four
[122,101,114,111],[111,110,101],[116,119,111],[116,104,114,101,101],[102,111,117,114]
 133351          , 12301       , 12901       , 1276511             , 114384
 295             , 2797        , 3397        , 2975                , 336
 1               , 4           , 16          , 35                  , 42

 five            , six         , seven               , eight               , nine
[102,105,118,101],[115,105,120],[115,101,118,101,110],[101,105,103,104,116],[110,105,110,101]
 113781          , 12670       , 1263920             , 1126456             , 121701
 4485            , 3166        , 4640                , 232                 , 2901
 75              , 79          , 83                  , 85                  , 108

Bu daha sonra aşağıdakileri sıralamak için bir anahtar işlev olarak kullanılabilir:

OḌ%⁽Т%147µÞ - Link: list of lists of lists of characters
          µÞ - sort (Þ) by the mondadic chain to the left (µ):
O            -   ordinals of the characters
 Ḍ           -   convert from base 10
   ⁽Т       -   literal 4752
  %          -   modulo
      %147   -   modulo by 147

Bu orada bulduğun bazı harika modüller, sanırım bu çok zordu.
Outgolfer Erik

Tüm bu özenli değil - Ben ilk önce olsa ikili baktım.
Jonathan Allan

Modülleri kaba şekilde zorladın, değil mi?
Outgolfer Erik

Evet, ama çabuk oldu.
Jonathan Allan

6

Python , 62 bayt

lambda m:sorted(m,key=lambda r:[int(s,36)%6779%531for s in r])

Çevrimiçi deneyin! ... ya da test takımını görün

Not:

lambda m:sorted(m,key=lambda r:[map("trfsen".find,s)for s in r])

Python 2'de çalışan (ancak 3 değil) iki bayt daha uzun.


1
Sihirli sayıları nasıl buldunuz?
mbomb007

1
Sonuçlar üzerinde sıkı bir artış olup olmadığını kontrol etmek için sadece iç içe bir döngü. Her ne kadar dış verilen iç rakam uzunluğunu kısıtlamasına rağmen.
Jonathan Allan

5

APL (Dyalog Klasik) , 12 bayt

'nesft'∘⍒⌷¨⊂

Çevrimiçi deneyin!

Ben şöyle dyadic için uygun bir sol argüman buldum (denedim ve uzunluk 6 ilk):

A←⊖a←↑'zero' 'one' 'two' 'three' 'four' 'five' 'six' 'seven' 'eight' 'nine'
{(aa[⍵⍒a;])∧Aa[⍵⍒A;]:⎕←⍵}¨,⊃∘.,/5⍴⊂∪∊a

3

Perl 6 , 37 bayt

*.sort:{('digit 'X~$_)».parse-names}

Dene

Expanded:

*\     # WhateverCode lambda (this is the parameter)
.sort:
{  # block with implicit parameter 「$_」
  (
    'digit ' X~ $_  # concatenate 'digit ' to each named digit
  )».parse-names    # call .parse-names on each
}

Kod bloğu formun bir değerini alır ("three","one","four")ve onu kolayca kullanabilen ("3","1","4")bir değer olana çevirir .sort.


3

APL (Dyalog) , 38 bayt

{⍵[⍋(531∘⊥⍤1)(531|6779|369+⎕A⍳⊢)¨↑⍵]}

Çevrimiçi deneyin!

Jonathan Allan'ın müthiş çözümüne dayanıyor .


1
@JonathanAllan İlk değişiklik sırasında bir kredi düzenledim .. Neden değişmediği hakkında hiçbir fikrim yok. düzeltildi
Uriel

1
31: ⊂⌷¨⍨∘⍋(531⊥531|6779|36⊥9+⎕A⍳⊢)¨ancak mevcut bayt sayınızın yarısından daha azında bunu daha basit yapabilirsiniz.
Adám

@ Öyleyse, giriş ve çıkışları farklı biçimlerde (karışık ve karışık olmayan) tolere edebilir misiniz?
ngn

@ngn Elbette. Ancak aklımdaki çözüm tamamen karışık G / Ç'ye sahip.
Adám

3

Ruby, 48 bayt

->x{x.sort_by{|y|y.map{|s|s.to_i(35)**2%47394}}}

"zero".to_i(35)0 olduğu gerçeğini kötüye kullanır ('z', temel 35'te geçerli bir basamak olmadığından), diğer dokuz basamak için bir formülü kaba kuvvetle zorlamak çok daha kolaydır.





2

Python 2 , 85 81 80 bayt

Sayıyı belirlemek için her kelimenin ilk iki harfini kullanır, ardından anahtar olarak bu dizin oluşturma işlevini kullanarak her listeyi sıralar.

lambda _:sorted(_,key=lambda L:['zeontwthfofisiseeini'.find(s[:2])/2for s in L])

Çevrimiçi deneyin!

Jonathan Allan sayesinde 4 bayt kurtardı


Tuş işlevindeki döngü listesi anlama için 4 bayt daha kısadır.
Jonathan Allan



1

Haskell , 133 122 109 107 106 bayt

import Data.List
sortOn$abs.read.(>>=show.head.(`elemIndices`words"ze on tw th fo fi si se ei ni").take 2)

Ungolfed:

import Data.List

nums = ["ze","on","tw","th","fo","fi","si","se","ei","ni"]

lookup' :: Eq a => a -> [a] -> Int
lookup' v = head . elemIndices v

wordToInt :: String -> Int
wordToInt (x:y:_) = lookup' [x,y] nums

wordsToInt :: [String] -> Int
wordsToInt = read . concatMap (show . wordToInt)

sortN :: [[String]] -> [[String]]
sortN = sortOn wordsToInt





0

Retina 0.8.2 , 38 bayt

T`z\o\wit\hfsen`d
O`
T`d`z\o\wit\hfsen

Çevrimiçi deneyin! Bağlantı test paketini içerir. Harfleri geçici olarak bu dizgideki zowithfsenkonumlarıyla değiştirerek çalışır , bu da sayıların sözcük olarak sıralanmasını sağlar.


0

Jöle , 30 28 27 bayt

w@€“¡¦ẇṆb~ṇjṚØ%ĖġṘḥḞṾṇJḌ»µÞ

Çevrimiçi deneyin!

-1 Jonathan Allan sayesinde.

'Onetwo ... nine' dizesindeki her basamağın dizinini bulur ve bunu bir anahtar işlevi olarak kullanarak sıralar Þ. 'zero'Başlangıçta dahil etmeye gerek yoktur çünkü ilk iki karakterin aranması 'zero'başarısız olur ve sözlük 0yerine 'zero'"erken" yapan dizin yerine döndürülür .


'Bir iki ... dokuz' sıkıştırması kullanmak bir bayt daha azdır
Jonathan Allan

@JonathanAllan Ah, teşekkürler. Bunu kontrol etmeyi düşünmemiştim. Sıkıştırma 'zeontw...ni'daha uzun sürdü.
dylnan

... artık "... ilk iki harf" yok.
Jonathan Allan


0

C (clang) , 229 bayt

y,j,k,t[9];char *s="zeontwthfofisiseeini";r(char **x){for(j=y=k=0;k+1<strlen(*x);k+=j,y=y*10+(strstr(s,t)-s)/2)sscanf(*x+k,"%2[^,]%*[^,]%*[,]%n",t,&j);return y;}c(*x,*y){return r(x)-r(y);}f(*x[],l){qsort(&x[0],l,sizeof(x[0]),c);}

Çevrimiçi deneyin!

C işlevlerine dizeler dizisi göndermenin basit bir yolu yoktur, bu yüzden kod golf ruhunda, giriş biçiminde küçük bir özgürlük aldım.

f()dizelere işaretçi dizisini kabul eder, burada her dize bir sayıdır ve küçük harfle virgülle ayrılmış yazım basamaklarıyla gösterilir. Ayrıca, ikinci parametrede dizede dizi sayısı gerekir. Umarım bu kabul edilebilir.

f()kullanarak işaretçileri sıralı bir sırayla değiştirir qsort().
r()virgülle ayrılmış sayı dizesinden girdi numarasını okur. Sayıyı tanımlamak için yalnızca ilk iki karakteri karşılaştırır.
c()karşılaştırma işlevi



@ceilingcat Lütfen açıklayabilir strstr("i"-19,t)-"zeontwthfofisiseeini"misiniz? Derleyiciye özgü veya standart mı?
GPS

Bu, başka hiçbir .rodatagörünüme sahip olmamasına 0x69 0x00ve derleyicinin adresini adresin "i"sonuna yerleştirmesine "zeo..."
dayanır

diye düşündüm .. derleyicinin bunu yapmasını sağlamanın bir yolu var mı? Buradaki kuralların buna izin vereceğini biliyorum, ama buna gerçek anlamda dayanabilir miyim?
GPS

İçgüdüm "gerçek dünyada" bundan kaçınmaktır, ancak dize parçalarınız yeterince benzersizse bu muhtemelen işe yarayacaktır. Aslında yığın kanaryalar ile ilgili bazı meşru kullanım durumu olabilir ama ben de halüsinasyon görüyorum.
ceilingcat
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.