Orijinal Sayı


36

Kuralları

senaryo

John'un önemli bir numarası var ve başkalarının görmesini istemiyor.

Aşağıdaki adımları kullanarak numarayı şifrelemeye karar verdi:

Onun numarası her zaman azalan olmayan bir dizidir (yani. "1123")

Her basamağı İngilizce kelimelere çevirdi. (yani. "123" -> "ONETWOTHREE")

Ve sonra, rastgele harfleri yeniden düzenleyin. (yani. "ONETWOTHREE" -> "ENOWTOHEETR")

John numarasının böyle güvende olduğunu hissetti. Aslında, bu şifreleme kolayca deşifre edilebilir :(


Görev

Şifreli dize s göz önüne alındığında, göreviniz şifresini çözmek ve orijinal numarasını geri vermektir.


kurallar

  • Bu kod golf, yani bayt cinsinden en kısa cevap kazanır.
  • Giriş dizesinin her zaman geçerli olduğunu varsayabilirsin
  • Giriş dizesi sadece büyük harflerden oluşur.
  • Orijinal numaralar her zaman artan düzende düzenlenir
  • Numarayı dizge veya tamsayı biçiminde döndürebilirsiniz
  • Harfler, tüm dize arasında değil, yalnızca bir kelime arasında karıştırılır.
  • Sayılar sadece 1 ila 9 Anin olacaktır ( ONEiçin NINE)

Olası Şifrelenmemiş Dize

Dizelerin numaralardan bir dizgeye çevrilmesinden hemen sonra:

 1 -> ONE 
 2 -> TWO
 3 -> THREE
 4 -> FOUR
 5 -> FIVE
 6 -> SIX
 7 -> SEVEN
 8 -> EIGHT
 9 -> NINE

Örnekler

"NEO" -> 1

"ENOWOT" -> 12

"EONOTWHTERE" -> 123

"SNVEEGHEITNEIN" -> 789

"ENOOWTEERHTRUOFEVIFXISNEVESTHGIEENIN" -> 123456789

"NOEWOTTOWHEERT" -> 1223


5
Tüm test durumlarında, kelimeler arasındaki harfler değil, yalnızca bir sözcük içindeki harfler karıştırılır. Bu her zaman böyle olacak mı?
xnor

1
@xnor Bu her zaman böyle olacak. Soruyu değiştirdim.
Amorris

1
o zaman bunu değiştirmelisin ".... (yani," ONETWOTHREE "->" TTONWOHREEE ")"
J42161217

2
@ TessellatingHeckler: Kesin olmayan bir artış, bir sonraki sayının önceki örnek ile aynı olabileceği zamandır. 1-1-1-2-2-3 (kesinlikle artan) 1-2-3-4-5 (kesinlikle artan)
koita_pisw_sou

1
Teknik olarak konuşursak, bu bir şifreleme değil, şifreleme değil, çünkü anahtar yok.
Patrick Roberts

Yanıtlar:


5

Jöle ,  38  37 bayt

ḟ“RGS”O“OX‘,“¢©“¢¢¤‘yF×4/%74ị⁽Gל?9¤Ḍ

Karakter listesini (dize) alan ve bir tamsayı döndüren tek renkli bir bağlantı.

Çevrimiçi deneyin!

Kullanımları bir çok farklı yöntem Pietu1998 en Jelly cevap , henüz aynı byte sayısına sahip ( Gerçekten düşündüm o did az olarak sona)!

Orjinal sayının monotonikliğine dayanmaz (bu nedenle HTREEWTONOEörneğin bir girdi işe yarar).

Nasıl?

İlk olarak, kelimelerin kendilerinin (ve dolayısıyla anagramlarının) uzunluğu, Rs, Gs ve S'lerin kaldırılması ve herhangi bir Os'un iki karakterle değiştirilmesi ("12" deyin) ve X'lerin üç karakterle değiştirilmesiyle (4 ") değişebilir. "345" deyin).

letters  -> -RGS  -> O:12, X:345
ONE         ONE      12NE
TWO         TWO      TW12
THREE       THEE     THEE
FOUR        FOU      F12U
FIVE        FIVE     FIVE
SIX         IX       I345
SEVEN       EVEN     EVEN
EIGHT       EIHT     EIHT
NINE        NINE     NINE

Daha sonra, bu karakterlerin sıralarının ürününü, tercihimize bağlı olarak ("12345") modulo aritmetik kullanarak 1'den 9'a kadar olan rakamlarla eşleyebilir, daha sonra bunları yeniden sıralananlar listesinde bulabilirsiniz. Kod ilk önce karakterlere basar ve sonra sıraları değiştirir, ancak 37 baytta karakterlerle de mümkündür, örneğin "DIAAE" ( deneyin ).

ḟ“RGS”O“OX‘,“¢©“¢¢¤‘yF×4/%74ị⁽Gל?9¤Ḍ - link: list of characters
 “RGS”                                - literal ['R','G','S']
ḟ                                     - filter discard
      O                               - convert to ordinals
       “OX‘                           - code-page indices list = [79,88]
            “¢©“¢¢¤‘                  - code-page indices lists = [[1,6],[1,1,3]]
           ,                          - pair -> [[79,88],[[1,6],[1,1,3]]]
                    y                 - translate (replace 79s (Os) with [1,6]
                                                       and 88s (Xs) with [1,1,3])
                     F                - flatten into a single list
                       4/             - 4-wise reduce by:
                      ×               -   multiplication (product of each window of four)
                         %74          - modulo 74
                                   ¤  - nilad followed by link(s) as a nilad:
                             ⁽G×      -   base 250 literal = 18768
                                œ?9   -   permutation of [1,2,3,4,5,6,7,8,9] at that
                                      -   index in a lexicographically sorted list of
                                      -   all such permutations -> [1,5,8,2,4,9,7,6,3]
                            ị         - index into
                                    Ḍ - convert from decimal digits to an integer

Cevabınız kelimenin tam anlamıyla bu sayfada: için doğru bir değer döndüren tek cevaptır NINEONENIENOENNNIENOENNEINEONEINEONNENIENOINNEINENINNEINENIENNIENNNNIENNEININENIENNENINEINENINENNIEINNEINNENNIENIN.
Magic Octopus Urn

+ Sonsuzluk puanları.
Magic Octopus Urn

Teşekkürler! (bu beni fırlattı çünkü yorumdaki kod bloğuna sıfır genişlik boşlukları vardı, ancak (whew) işe yarıyor )
Jonathan Allan,

Zaten geçerli bir girdi değil;).
Magic Octopus Urn,

Vay canına, bir ödül geleceğini bilmiyordum - teşekkürler! Evet, istenen şartnamenin bir parçası değildi, sadece sıralanmamış girdiyle çalışacak bir yöntem yaptım.
Jonathan Allan,

10

Python 2, 121 117 115 bayt

def g(s,a=0,f=''):
 for c in s:
    a+=34**ord(c)%43;r='P!\x83u\x8eI\x92|Z'.find(chr(a))+1
    if r:f,a=f+`r`,0
 return f

-4 bayt: O kadar golf oynadıktan sonra, tek kullanımlık bir değişkeni satır içi yapmayı unuttum. Beyin osuruğu.
-2 bayt: Çift aralıklı girinti → tek sekmeli girinti (Coty Johnathan Saxman sayesinde); Bunun cevapta doğru şekilde görünmediğine dikkat edin.

Ungolfed (python 3 ile uyumlu):

nums = [80, 33, 131, 117, 142, 73, 146, 124, 90]

def decode(str):
    acc = 0
    final = ''
    for c in str:
        acc += (34**ord(c))%43
        if acc in nums:
            final += str(1+nums.index(acc))
            acc=0
    return final

Sihirli numara bulucu:

#!/usr/bin/env python3
from itertools import count, permutations

def cumul(x):
    s = 0
    for v in x:
        s += v
        yield s

all_words = 'ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE'.split()

for modulo in range(1, 1000):
    for power in range(1, 300):
        combinations = []
        for word in all_words:
            my_combination = []
            for perm in permutations(word):
                my_combination += cumul(power**(ord(x)) % modulo for x in perm)
            combinations.append(my_combination)

        past_combinations = set(())
        past_intermediates = set(())
        collision = False
        for combination in combinations:
            final = combination[-1]
            if final in past_intermediates or any(intermediate in past_combinations for intermediate in combination):
                collision = True
                break
            past_combinations.add(final)
            past_intermediates.update(combination)

        if not collision:
            print("Good params:", power, modulo)
            print("Results:", ", ".join(str(x[-1]) for x in combinations))

Açıklama:

ASCII parçalarını birlikte parçalayabileceğimi ve ne zaman tam bir söz aldığımı belirlemek için bir şekilde özetleyebileceğimi hissettim. Başlangıçta karışıklık yaratmayı 3**ord(letter)ve beklenen sonuçları karşılaştırmayı denedim , ancak bazı çok büyük rakamlarla sonuçlandı. Bazı parametreleri kaba kuvvetle zorlamak biraz, yani modülün (sayıların küçük olmasını sağlamak için) ve sayıları modülün aralığına göre farklı şekilde dağıtmak için uygun olacaktır.

Çarpan değişkenini gücün kendisini etkileyen bir değişkene dönüştürdüm, çünkü (deneme yanılma) bir şekilde bana biraz daha kısa golf yanıtı vermeyi başardı.

Yukarıda, kaba kabadayılık ve küçük bir el golfünün sonuçlarını görüyorsunuz.

Asıl seçmenin nedeni, 3**xorada her sayıyı temsil edebileceğinizi biliyordum. Herhangi bir numaranın sahip olduğu en fazla tekrarlanan rakam iki (thrEE, sEvEn, NiNe, vb.), Bu yüzden her girişi bir baz-3 numarası olarak düşünmeye karar verdim. I (zihinsel) gibi bir şey olarak temsil edebilir Bu şekilde 10100000000010020000(; bir 1 üç tyuvaya, bir 1 ryuvasına, bir 1 hyuvasına ve bir 2 eyuvası). Bu şekilde her sayı, ipi yineleyerek ve bazı sayıları toplayarak kolayca bir araya getirilebilecek benzersiz bir ifade alır ve harflerin gerçek sırasından bağımsız olarak biter. Tabii ki, bu ideal bir çözüm olmadı, ancak mevcut çözüm hala bu düşünce ile yazılmıştır.


Nedir Py3K? ...
CalculatorFeline

Özür dilerim, düzeltildi (python 3'ün eski adı)
Score_Under

1
Ucuzdur, ancak ikinci girinti seviyenizi (iki boşluk) tek bir sekmeye dokunarak 2 byte tasarruf edebilirsiniz (bu python 2'dir). [ tio.run/##NU7NCoJAGDy7T/… Çevrimiçi deneyin!]
Coty Johnathan Saxman

Ayrıca, literal kullanarak 6 bayt kaydetmek mümkün olabilir \x83, \x8eve \x92dizede.
CalculatorFeline

@CalculatorFeline Ne yazık ki benim tercüman böyle değil yapar: SyntaxError: Non-ASCII character '\xc2' in file <stdin> on line 3, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details. Buraya codingyorumu eklersem işe yarar , ancak bu fazladan 15 bayt kazanır.
Score_Under

6

Python 2 , 131 127 bayt

s=input()
for y in'WXGURFSOIZ':vars()[y]=s.count(y)
while Z<9:s+=[O-U-W,W,R-U,U,F-U,X,S-X,G,I-X-G-F+U][Z]*str(Z+1);Z+=1
print s

Çevrimiçi deneyin!

JavaScript Draco18s çözümünün düzeltilmiş bir sürümüne dayanarak .


Ne ilginç bir kullanım vars!
xnor

@xnor ovs idi bana diğer golfler için nasıl öğrendim :)))
mdahmoune

Çok zeki. Cevabımı uyarlamak için + 1'e sahip olmalısınız (başlangıçta olduğu gibi kusurlu).
Draco18,

5

PHP , 164 bayt

for($c=count_chars($argn);$i<9;)echo str_pad("",[$c[79]-$c[87]-$u=$c[85],$c[87],$c[72]-$g=$c[71],$u,$f=$c[70]-$u,$x=$c[88],$c[86]-$f,$g,$c[73]-$x-$f-$g][+$i],++$i);

Çevrimiçi deneyin!

PHP , 179 bayt

önceki yaklaşıma göre, önce çift sayıları, ardından tek sayıları artan düzende kontrol edin

for($z=[$o=($c=count_chars($argn))[87],$f=$c[85],$x=$c[88],$g=$c[71],$c[79]-$o-$f,$c[72]-$g,$v=$c[70]-$f,$c[86]-$v,$c[73]-$x-$v-$g];$i<9;)echo str_repeat(++$i,$z[_405162738[$i]]);

Çevrimiçi deneyin!

PHP , 201 bayt

for(;$o=ord(WUXGOHFVN[$i]);$i++)for(;$r[$o]<count_chars($argn)[$o];$t[]=$i>3?2*$i-7:2+2*$i,sort($t))for(++$r[$o],$n=0;$q=ord(([TO,ORF,IS,HEIT,EN,TREE,IVE,SEEN,NIE][+$i])[$n++]);)$r[$q]++;echo join($t);

Çevrimiçi deneyin!


başarısız olduENOOWTWTOWOT
Titus

@Titus şimdi sabittir. Soruyu yanlış
anladım

Evet, örnekler biraz yanıltıcı. Vay bu maliyeti! Onu yıkar mısın?
Titus

@Titus, yaklaşımınız olarak başka bir yol bulma sınırına ulaştığımı düşünüyorum
Jörg Hülsermann,

1
$i++<9ve $iyerine $i<10ve ++$i(-1 bayt); _405162738[$i]yerine $i%2?$i/2+4:$i/2-1(-4 bayt) ( $i/2+~($i%2*-5)çok çalışırdı, ama bu bir bayt daha uzun.)
Titus

5

Javascript (ES6), 288 150 144 bayt

q=s=>[u=(l=t=>s.split(t).length-1)`U`,l`O`-l`W`-u,l`W`,l`R`-w,u,f=l`F`-u,x=l`X`,l`S`-x,g=l`G`,l`I`-x-g-f].map((n,i)=>`${i}`.repeat(i&&n)).join``

const testCases = ['NEO', 'ENOWOT', 'EONOTWHTERE', 'SNVEEGHEITNEIN', 'ENOOWTEERHTRUOFEVIFXISNEVESTHGIEENIN']

testCases.forEach(testCase => console.log(testCase, q(testCase)))

Diğer JS girişlerinden diğer ikisinden daha uzun , ancak başka bir dilde biri için işe yarayabilecek ilginç bir yaklaşım bırakacağımı düşündüm.

Temel olarak aşağıdakileri belirleyebiliriz:

W -> 2
X -> 6
G -> 8
U -> 4

Bu harflerin herhangi bir şekilde ortaya çıkması, bu rakamın orijinal sayıda bulunduğunu gösterir. Buradan, basamakların geri kalan kısmını çıkarabiliriz:

R-U -> 3
F-U -> 5
S-X -> 7

İki karmaşık durum da dahil olmak üzere:

O-(U+W) -> 1
I-(X+G+(F-U)) -> 9

Hem 1ve 9bölge Sert nispeten. ONE için, Ebazı sözcüklerde ( SEVENiki taneye sahip) olduğu gibi N( birden fazla NINE), yani Odiğer iki yerde meydana gelip gelmediğini kontrol etmemize şaşırdık, neyse ki ikisi de basit.

NINE için dokuz, onu nasıl dilimlendiğiniz önemli değildir.

Böylece bu harita ile sonuçlanır:

[u=(l=t=>s.split(t).length-1)`U`,  //unused 0; precompute 'U's
 l`O`-l`W`-u,    //1
 l`W`,           //2
 l`R`-w,         //3
 u,              //4
 f=l`F`-u,       //5
 x=l`X`,         //6
 l`S`-x,         //7
 g=l`G`,         //8
 l`I`-x-g-f]     //9

Şekil 9, baytları koruyarak değişken atamalarıyla siX, eiGht ve Five'ı (5 geri referanslama foUr ile) geri referanslandırabilir. Bunun için Neil sayesinde, çok tanımadığım JS'nin bazı özelliklerini kullanıyor ( ('örneğin ikiye ayırmak için kullanılan geri dönüşler) ve kod yazmayı denemeden önce kağıda çizdiğim fikrine daha da yaklaşıyor (Ben de "bir bakın sanki düşünmeye, "geride kalan" olarak 9 çıktıktan Xkaldırabilirim ve bir Sve Idaha sonra ... dizesinden" böylece dört basit vakalarda sonraki 3 edeceğini haline basit).

Bu giriştir nedeni ilginç o işleyebilir çünkü herhangi Shuffled dize girdi olarak. yani, tek tek kelimelerin karıştırılmasından ziyade, John'un orjinal olarak yaptığını düşündüğüm şey olan tüm dizgiyi değiştirebiliriz:

q=s=>[u=(l=t=>s.split(t).length-1)`U`,l`O`-l`W`-u,l`W`,l`R`-w,u,f=l`F`-u,x=l`X`,l`S`-x,g=l`G`,l`I`-x-g-f].map((n,i)=>`${i}`.repeat(i&&n)).join``

const testCases = ['XENSENINEVSI']

testCases.forEach(testCase => console.log(testCase, q(testCase)))


1
Harika, ama 9 sayma ile ilgili bir sorun var ... ixg-f + u olabileceğini düşünüyorum
mdahmoune

@mdahmoune Shoot, haklısın. Onu mahvettim. : <
Draco18,

4 bayt kullanarak s.split(t).length-1, 2 bayt kullanarak s.repeat(n>0&&n)(neden n sıfırdan daha az?? 7 bayt kaydeder). Her zaman geçirmeye devam etmenize gerek kalmayacak şekilde ilan ederek bir demet bayttan gtasarruf edin sve daha iyisi hala toplamda 55 bayt kazandıran etiketli bir şablon yapabilirsiniz (9 düzeltmeden önce). Devamı geçicilere tekrarlanan değerleri kaydederek bayt ve kullanıyorum kapalı birkaç tane daha traş map: s=>[,(l=t=>s.split(t).length-1)`O`-l`W`-l`U`,w=l`W`,l`R`-w,u=l`U`,l`F`-u,x=l`X`,l`S`-x,g=l`G`,l`I`-x-g].map((n,i)=>`${i}`.repeat(n)).join`` .
Neil

@Neil N'in neden sıfırdan daha az bittiğinden emin değilim, ancak ÜÇ için test ederken oldu. Bir hata alıp aramaya başladığımı soruşturmaya ihtiyacım olduğunu buldum, ancak hala emin değilim. Oradaki şablonlanmış kütüphane haritası javascript, nasıl okunacağını bile bilmiyorum. : D
Draco18,

@Neil Ah, doğru, n kontrol sebebi> 0: Orada ise olan bir İKİ ama hiçbir ÜÇ. R = 0, W = 1. 0-1 = -1. Bir saat önce, 3 çekle ilgili olduğunu biliyordum, ama bunun üzerinde çalışmakta olan bir zaman şeytanı vardı (kahve eksikliği).
Draco18,

4

Mathematica, 133 bayt

(s={};c=Characters;j=c@#;Table[If[FreeQ[j~Count~#&/@c[#[[i]]]&@ToUpperCase@IntegerName@Range@9,0],s~AppendTo~i],{i,9}];FromDigits@s)&


giriş

"VENESGTHIEENNI"

çıktı

789


c@#[[i]]Bunun yerine fazladan bir bayt kaydedebilir misiniz c[#[[i]]]? Sen infix sözdizimi kullanarak başka byte kaydetmek mümkün olabilir ~üzerinde Table.
numbermaniac

4

C #, 218 bayt

Kısa versiyon:

string q(string s){var n="ONE,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE".Split(',');for(inti=0,j;;i++)for(j=0;n[i].IndexOf(s[j])>=0;){if(++j==n[i].Length){var r=++i+"";for(;j<s.Length;r+=++i)j+=n[i].Length;return r;}}}

Genişletilmiş sürüm:

string q(string s)
{
    var n = "ONE,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE".Split(',');
    for (int i = 0, j; ; i++)
        for (j = 0; n[i].IndexOf(s[j]) >= 0;)
        {
            if (++j == n[i].Length)
            {
                var r = ++i + "";
                for (; j < s.Length; r += ++i)
                    j += n[i].Length;
                return r;
            }
        }
}

ONLINE deneyin!

İlk girişim olduğundan kurallardan emin değilim ... Sadece şifreyi çözmek için kullanılan sınıfın boyutunu sayıyorum, test eden kodu değil, doğru mu?

Düzenle

Ve bunun eğlencesi için - işte yapmaya başladığım şey, tüm kuralları okumam: S - İdeOne'da görün . Bir basamaktan gelen karakterler dizedeki herhangi bir yere karıştırılabilirken bile şifresini çözer.

Düzenle 2

TheLethalCoder tarafından verilen ipuçlarına göre kısaltılmıştır. Teşekkürler!

Düzenle 3

Ve şimdi Titus birkaç bayttan daha fazla traş oldu. Teşekkürler!


2
Merhaba ve PPCG'ye hoş geldiniz! Sadece bu yöntemi eklemeniz gerekir, public staticoradan kaldırabilirsiniz . Gibi anonim bir yönteme dönüştürebilirsiniz s=>{<do stuff>return"";}. varBirkaç kez kullanabilirsiniz , değişkenleri birlikte bildirmek baytları yani kaydeder int i=1,j;. Bir dizgiden bir dizi oluşturma ve üzerinde bölme genellikle daha kısadır (bu durumda kontrol etmemiş olmama rağmen) "ONE|TWO".Split('|'). Sen kullanabilirsiniz <0yerine==-1
TheLethalCoder


@TheLethalCoder Harika ipuçları, teşekkürler!
SamWhan

Hiç test edilmedi ancak aşağıdaki kodun 221 bayt için kodunuzun karşılığı olduğuna inanıyorum:s=>{var n="ONE|TWO|THREE|FOUR|FIVE|SIX|SEVEN|EIGHT|NINE".Split('|');for(int i=0,j;++i<= 9;)for(j=0;n[i-1].IndexOf(s[j])<0;){if(++j==n[i-1].Length){var r=i+"";while(j<s.Length){j+=n[i].Length;r+=++i;}return r;}}return "";}
TheLethalCoder

Bir yandan, TIO'larınız için TIO'yu kullanmak genellikle daha kolaydır !
TheLethalCoder

3

JavaScript (ES6), 142 139 Bayt

Neil sayesinde 3 bayt kurtardı .

Şu anda sayılardan faydalanmıyorsa her zaman artan düzende düzenlenir

f=s=>s?'ENO|OTW|EEHRT|FORU|EFIV|ISX|EENSV|EGHIT|EINN'.split`|`.findIndex(w=>[...s.slice(0,y=w.length)].sort().join``==w)+1+f(s.slice(y)):''

f=s=>s?'ENO|OTW|EEHRT|FORU|EFIV|ISX|EENSV|EGHIT|EINN'.split`|`.findIndex(w=>[...s.slice(0,y=w.length)].sort().join``==w)+1+f(s.slice(y)):''

const testCases = ['NEO', 'ENOWOT', 'EONOTWHTERE', 'SNVEEGHEITNEIN', 'ENOOWTEERHTRUOFEVIFXISNEVESTHGIEENIN']

testCases.forEach(testCase => console.log(testCase, f(testCase)))


bir dakika ne?? "axbxc".split`x`.join``. Bu nasıl adlandırılır? Google'da bir şey bulamıyor.
Qwerty

@Qwerty - Onlar edilir etiketlenen şablon değişmezleri , ben durumunda parens gerek etmeyerek birkaç byte kaydetmek için kullanıyorum bir ES6 özelliği splitvejoin
Craig Ayre

Cevap verdin. Etiketlenmiş şablon değişmezlerini biliyorum, ancak bu işlevlerde de kullanabileceğinizi anlamadım. Teşekkür ederim.
Qwerty

Biraz farklılar, şablon değişmezleri var (ör. x=`foo${5+5}bar`), Bunları parens olmadan kullanarak bir işlevi çağırdığınızda etiketlenirler: foo`foo${5+5}bar`aynıfoo(['foo','bar'], 10)
Craig Ayre

1
f(s.slice(y))her zaman bir dizedir, bundan ''+önce gerek duymazsınız.
Neil,

2

Jöle , 38 bayt

Dị“©ȯ¿w¶&ÇhṆỌƘ#Ȯʋ~¢CNẓ_»Ḳ¤FṢŒu
L3*Ç€iṢ

Çevrimiçi deneyin!

açıklama

L3*Ç€iṢ    Main link. Argument: s (string)
L            Get length of s.
 3*          Raise 3 to that power. This will always be greater than n.
   ǀ        Get the name of each of the numbers using the helper link.
     iṢ      Find the position of the sorted input.

Dị“©ȯ¿w¶&ÇhṆỌƘ#Ȯʋ~¢CNẓ_»Ḳ¤FṢŒu    Helper link. Argument: n (number)
D                                   Get digits of n.
  “©ȯ¿w¶&ÇhṆỌƘ#Ȯʋ~¢CNẓ_»            The string "one two (...) eight nine AA".
                        Ḳ           Split that string at spaces.
 ị                                  Get name of each digit in the list.
                          F         Flatten to a single string.
                           Ṣ        Sort the characters.
                            Œu      Make uppercase.

Kodunuzla ilgili bir sorun var. Dize "EIGHTNINE"girmeyi deneyin :)
Amorris

@Morris 0 byte için düzeltildi.
PurkkaKoodari

Bence "VENESGTHIEENNI" için işe yaramadı
J42161217

I second @Jenny_mathy
Amorris

@Jenny_mathy Program çok verimsiz ve uzun girişler için zaman ve hafıza yetersiz çalışıyor (Biliyorum, gerçekten kötü). İle çalışma prensibini değiştirmeden kolayca 789 hesaplamanızı sağlayan daha küçük bir üst sınır kullanmak için 3ile 2.2değiştirebilirsiniz. 2iyi olurdu, ancak altı taneden fazla olan belirli girdiler için zorlukla başarısız olacaktı.
PurkkaKoodari

2

Javascript (ES6), 221 bayt

s=>(m=btoa`8Ñ>Mc¾LtDáNQ!Q>HþHA7átþ4Ò`.split`+`.map(s=>RegExp(s.replace(/(.)\1*/g,c=>`(?=(.*${c[0]}){${c.length}})`))),t=0,r=0,[...s].map(c=>(t+=c,d=1,n=0,m.map((r,i)=>t.match(r)&&(d--,n=i)),d||(r=r*10+n+1,t=0))),r)

Örnek kod pasajı:

f=

s=>(m=btoa`8Ñ>Mc¾LtDáNQ…!Q>H…þHA7átþ4Ò`.split`+`.map(s=>RegExp(s.replace(/(.)\1*/g,c=>`(?=(.*${c[0]}){${c.length}})`))),t=0,r=0,[...s].map(c=>(t+=c,d=1,n=0,m.map((r,i)=>t.match(r)&&(d--,n=i)),d||(r=r*10+n+1,t=0))),r)

console.log(f("NEO"))
console.log(f("ENOWOT"))
console.log(f("EONOTWHTERE"))
console.log(f("SNVEEGHEITNEIN"))
console.log(f("ENOOWTEERHTRUOFEVIFXISNEVESTHGIEENIN"))


2

Retina , 160 bayt

([ONE]{3})*([TWO]{3})*([THRE]{5})*([FOUR]{4})*([FIVE]{4})*([SIX]{3})*([SEVN]{5})*([EIGHT]{5})*([NIE]{4})*
$#1$*1$#2$*2$#3$*3$#4$*4$#5$*5$#6$*6$#7$*7$#8$*8$#9$*9

Çevrimiçi deneyin! Gevşek bir şekilde @ TessellatingHeckler'in PowerShell cevabını temel almıştır.


2

Retina , 88 bayt

[EFIST]

^(ON|NO)*
$#1$*1
O

W
2
HR|RH
3
UR|RU
4
X
6
GH|HG
8
(NN)*$
$#1$*9
r`NV|VN
7
V
5

Çevrimiçi deneyin!

açıklama

  • İlk olarak, fark için gerekli olmayan bir sürü gereksiz karakter bırakın
  • Öndeki 1'leri seçin (bu, hemen ardından Os'ın geri kalanını bırakmamıza izin verir ve 5, 7, 9 karmaşasına ulaşmadan önce bazı N'leri siler.)
  • 2, 3, 4, 6 ve 8 şimdi önemsiz
  • 9'lar çift NN, bu yüzden 5 ve 7 ile ilgilenmeden önce sonları kapın
  • 7s'yi sağdan değiştirin (VNV'yi 57 yerine 75'e düşürmeyiz)
  • 5s kalan V'ler.


PunPun1000 @ teşekkürler. Bunu yapmanın bir yolu olması gerektiğini düşündüm ama çabucak bulamadıktan sonra pes ettim.
Kytheron

1

PowerShell , 182 bayt

[regex]::Replace("$args",'(?<1>[ONE]{3z2>[TWO]{3z3>[THRE]{5z4>[FOUR]{4z5>[FIVE]{4z6>[SIX]{3z7>[SVEN]{5z8>[EIGHT]{5z9>[NIE]{4})'.replace('z','})|(?<'),{$args.groups.captures[1].name})

Çevrimiçi deneyin!

Ungolfed ama çalışmayan kod:

[System.Text.RegularExpressions.Regex]::Replace("$args",

    '(?<1>[ONE]{3})       
    |(?<2>[TWO]{3})
    |(?<3>[THRE]{5})
    |(?<4>[FOUR]{4})
    |(?<5>[FIVE]{4})
    |(?<6>[SIX]{3})
    |(?<7>[SVEN]{5})
    |(?<8>[EIGHT]{5})
    |(?<9>[NIE]{4})'

    ,{$args.groups.captures[1].name}
)

örneğin (?<3>[THRE]{5}), karakter sınıfını THREeşleştirir; böylece sırayla eşleşebilir ve bu karakterlerin herhangi birini yan yana beş kez eşleştirmesi gerekir ve yakalama grubuna, sayılarla eşlenen adlara '3' adı verilir.

Tekrarlayan metni })|(?<a ile değiştirerek basit sıkıştırma z.


1

C ++, 296 , 288 bayt

Kısa versiyon:

#define T string
using namespace std;T N[]={"ONE","TWO","THREE","FOUR","FIVE","SIX","SEVEN","EIGHT","NINE"};T Q(T S){T R="";for(int i=0;i<9;i++){do{if(S.find(N[i])!=T::npos){S.erase(S.find(N[i]),N[i].size());R+=to_string(i+1);}}while(next_permutation(N[i].begin(),N[i].end()));}return R;}

Tam versiyon:

#define T string
using namespace std;

T N[]={"ONE","TWO","THREE","FOUR","FIVE","SIX","SEVEN","EIGHT","NINE"};

T Q(T S)
{
    T R="";
    for(int i=0;i<9;i++)                             //for all possible                             
                                                     //codewords (ONE,TWO...NINE)   
    {
        do
        {   
            if(S.find(N[i])!=T::npos)                //if found in encrypted word
            {
                S.erase(S.find(N[i]),N[i].size());  //erase it from the word
                R+=to_string(i+1);                  //save integer to the result string
            }
                                                    //check next permuation of codeword  

        } while(next_permutation(N[i].begin(),N[i].end())); 
    }                                                   

    return R;
}

ONLINE deneyin!

Düzenleme:
1) 200-> 296 bayt, orlp 2) 296-> 288, makroda kullanıldığı için, sayının içine N alanını ve tanımını dahil etmek için Zacharı sayesinde


Bayt sayınızın tanımını Nve using namespace std;içine eklemeniz gerekir .
orlp

Daha spesifik olmalıyım, sadece bayt sayınıza değil, cevabınıza da ekleyin. Cevabınız, hemen Qbaşka hiçbir ekleme yapmadan hemen ardından arayarak çalışabilmelidir .
orlp

Hepsini dahil etmek için yeniden düzenlendi. N'in tanımı için kendimden emin değildim, ama ad alanı için genellikle onu dahil etmiyorum (kütüphane malzemesi olarak kabul et). Yine de, şu anki kodda dizgenin çalışması için çok önemli
koita_pisw_sou

1
Bir kaç bayt kaydetmek için bir makro tanımlayabilir misiniz? repl.it/JY7k
Zacharý

1

Ruby, 138 114 110 bayt

gsub(/#{"3ONE3TWO5THRE4FOUR4FIVE3SIX5SEVN5EIGHT4NIE".gsub(/(.)(\D+)/,'([\2]{\1})|')}/){(1..9).find{|i|$~[i]}}

Bayt sayısı -pseçeneği için 1 bayt içerir .

Ne?

Bu:

/#{"3ONE3TWO5THRE4FOUR4FIVE3SIX5SEVN5EIGHT4NIE".gsub(/(.)(\D+)/,'([\2]{\1})|')}/

dize enterpolasyonu ile değerlendiren bir regex değişmezidir:

/([ONE]{3})|([TWO]{3})|([THRE]{5})|([FOUR]{4})|([FIVE]{4})|([SIX]{3})|([SEVN]{5})|([EIGHT]{5})|([NIE]{4})|/

Bunu atadığımızda regex, kodun geri kalanını kavraması biraz kolaydır: Girdideki her eşleşme $~, geçerli eşleşme verilerini içeren büyülü değişkenden çıkarılan yakalama grubunun numarası ile değiştirilir :

gsub(regex){(1..9).find{|i|$~[i]}}

Çevrimiçi deneyin!


1

Java 8, 198 256 bayt

s->{String r="",x=r;for(String n:"ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE".split(" ")){for(char c:n.toCharArray())x+="(?=.*"+c+")";x+="["+n+"]{"+n.length()+"}x";}for(int i=0,q;i<9;)for(q=(s+" ").split(x.split("x")[i++]).length-1;q-->0;)r+=i;return r;}

+58 bayt .. önceki sürümün regex düzgün çalışmıyor çünkü (aynı zamanda "EEE"; "EEN"; vb.

Açıklama:

Burada dene.

s->{                     // Method with String as parameter and return-type
  String r="",           //  Result-String
         x=r;            //  Regex-String
  for(String n:"ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE".split(" ")){
                         //  Loop (1) from "ONE" through "NINE":
    for(char c:n.toCharArray())
                         //   Inner loop (2) over the characters of this String
      x+="(?=.*"+c+")";  //    Append regex-group `(?=\w*c)` where `c` is the capital character
                         //   End of inner loop (2) (implicit / single-line body)
    x+="["+n+"]{"+n.length()+"}x";
                         //   Append regex part `[s]{n}` where `s` is the String, and `n` is the length
  }                      //  End of loop (1)
  // The regex now looks like this, which we can split on "x":
  // (?=.*O)(?=.*N)(?=.*E)[ONE]{3}x(?=.*T)(?=.*W)(?=.*O)[TWO]{3}x(?=.*T)(?=.*H)(?=.*R)(?=.*E)(?=.*E)[THREE]{5}x(?=.*F)(?=.*O)(?=.*U)(?=.*R)[FOUR]{4}x(?=.*F)(?=.*I)(?=.*V)(?=.*E)[FIVE]{4}x(?=.*S)(?=.*I)(?=.*X)[SIX]{3}x(?=.*S)(?=.*E)(?=.*V)(?=.*E)(?=.*N)[SEVEN]{5}x(?=.*E)(?=.*I)(?=.*G)(?=.*H)(?=.*T)[EIGHT]{5}x(?=.*N)(?=.*I)(?=.*N)(?=.*E)[NINE]{4}x
  for(int i=0,q;i<9;)    //  Loop (3) from 0 through 9 (exclusive)
    for(q=(s+" ").split(x.split("x")[i++]).length-1;
                         //   Split the input on the current regex-part,
                         //   and save the length - 1 in `q`
        q-->0;           //   Inner loop (4) over `q`
      r+=i               //    And append the result-String with the current index (+1)
    );                   //   End of inner loop (4)
                         //  End of loop (3) (implicit / single-line body)
  return r;              //  Return the result-String
}                        // End of method

1
Erf ... için yanlış sonuç "ENOOWTEERHTRUOFEVIFXISNEVESTHGIEENIN":(
Olivier Grégoire

Evet, bunu + 1'lememi engelleyen tek şey bu! Benim çözümüm 240 byte ... beni yenmeden önce.
Olivier Grégoire

@ OlivierGrégoire 240 baytlık çözümünüzü yayınlamaktan çekinmeyin, çünkü bir çözüm bulamıyorum. Bunun bir dezavantajı , testin sonunda EIGHT ve NINE bölümleriyle [ONE]{3}eşleşmesidir EEN. Ve sanırım orada tüm bunları ENO|EON|NEO|NOE|OEN|ONEeşleştirmek EEE;EEN;EEO;...için bir regex: 40 bayttan daha kısa olan tüm sayılarla eşleşmeden de olabilir. Belki substringsayıları kontrol ederek bir şeyi ters çevirebilirim, ama şimdi anlamaya gerçekten zamanım yok ..
Kevin Cruijssen

@ OlivierGrégoire Eğer hala 240 byte cevabınız varsa, göndermekten çekinmeyin. Yine bu zorlukla karşılaştım ve +58 bayt için yeni bir regex yaparak cevabımı düzelttim ..
Kevin Cruijssen

1
Görünüşe göre bu zorluğu tekrarlarken daha da kısa bir yol buldum : p
Olivier Grégoire

1

Java (OpenJDK 8) , 181 bayt

s->{String x="",r;for(int i=0,l;i<9;)for(r="ONE,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE".split(",")[i++],l=r.length();s.matches("["+r+"]{"+l+"}.*");s=s.substring(l))x+=i;return x;}

Çevrimiçi deneyin!

Kevin Cruyssen'in TIO şablonunu tekrar kullanma özgürlüğümü kullandım . Umarım sakıncası yok;)


Ah, önceki yorumumu boşver. Regex üzerinde döngü yerine regex oluştur. Yine de, sadece kullanmış olsaydım, ilk cevabımla yakındım s.substring. En kötüsü s.substringşu anki cevabımı kullanıyorum, lol .. Ah iyi, benden +1. Neredeyse hafta sonu oldu sevindim ..
Kevin Cruijssen

1

05AB1E , 36 31 bayt

‘€µ‚•„í†ìˆÈŒšï¿Ÿ¯¥Š‘#vyœN>UvyX:

Çevrimiçi deneyin!


Hata ayıklama ile koştu görüntüle: TIO Debug

‘€µ‚•„í†ìˆÈŒšï¿Ÿ¯¥Š‘# | Push ['ONE', 'TWO', 'THREE', 'FOUR', 'FIVE', 'SIX', 'SEVEN', 'EIGHT', 'NINE']
vyœ                   | For each list of permutations of that word...
   N>U                | Push index + 1 into register X.          
      vyX:            | Replace each permutation with X.

Sadece benden daha çok yeşil bir işarete sahip olduğunuzu ve bir böcek olduğunu fark ettim: FURONESEVgeri dönüyor FUR1SEV:(
Jonathan Allan

1

Perl 5 , 102 + 1 (-n) = 103 bayt

for$i(map{"[$_]{".length.'}'}ONE,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE){$,++;print$,while(s/^$i//)}

Çevrimiçi deneyin!


Güzel! Hileler Çift yardımı olun: map{...}genellikle ile değiştirilebilir map...,, lengthve y///cgenellikle birbirinin yerine de (her zaman değil çalışmıyor zaman küçüktür $_olsa!) Yerine while, ++$,x s/^$i//daha kısa olduğunu ve değiştirirseniz -niçin -psize yerine `$ \` ekleyebileceğiniz çağırmak print! Çevrimiçi deneyin!
Dom Hastings

Ayrıca, bazı tavsiyelerde bulunmamın sakıncası yoktur, eğer kaçınmamı tercih ederseniz. :)
Dom Hastings

0

Python 3 , 238 236 bayt

def f(s):
 e=''
 while len(s):
  for i in range(9):
   for r in[''.join(p)for p in permutations('ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE'.split()[i])]: 
    if s[:len(r)]==r:e+=str(i+1);s=s[len(r):]
 return e
from itertools import*

Çevrimiçi deneyin!


Brute-force çözümü, rakamların azaltılmaması avantajını kullanmaz.


@ Mr'a teşekkürler. 2 bayt kaydetmek için Xcoder!


def f(s):Bayt
sayınıza

Ayrıca while len(s)>0ile değiştirebilirsinizwhile len(s)
Mr. Xcoder

@ Mr.Xcoder bu açıklama için teşekkürler
Chase Vogeli

e-1 bayt için bildirimini işlev başlığına taşıyabilirsiniz . Ayrıca, execliste kavramaları da girintiden bayt kazandırabilir.
Hesap MakinesiFeline

0

PHP, 141 bayt

for($a=count_chars($argn);$c=ord($s[++$p]?:$s=[OWU,W,HG,U,FU,X,SX,G,N17.$p=0][$i-print str_repeat($i++,$x)]);)$x=$a[$i+48]+=($p?-1:1)*$a[$c];

eski sürüm, 151 bayt :

for($a=count_chars($argn,1);$s=[OWU,W,HG,U,FU,X,SX,G,N17][+$i++];print str_repeat($i,$a[$i+48]))for($p=0;$c=ord($s[$p]);)$a[$i+48]+=($p++?-1:1)*$a[$c];

1'den 9'a kadar olan rakamlar arasında dolaşır, sözcükteki benzersiz karakterleri sayar ve benzersiz olmayan karakterlerin sayımlarını çıkarır, hareket halindeyken basamağı yazdırır.
Hareket halindeyken yazdırılmasına rağmen, 9durum çalışması için basamak sayıları kaydedilmelidir .

Pipe ile çalıştırın -nRveya çevrimiçi deneyin .

Rakam sayıları $a[$i]yerine saklamak için 4 bayttan tasarruf eder $a[$i+48]ve ASCII 1ve 7rakam karakterleri yerine tırnak işaretleri kullanır.

Yıkmak

for(
    $a=count_chars($argn,1);                # count character occurences in input
    $s=[OWU,W,HG,U,FU,X,SX,G,N17][+$i++];   # loop through digit names
    print str_repeat($i,$a[$i+48])              # print digit repeatedly
)
    for($p=0;$c=ord($s[$p]);)                   # loop through name
        $a[$i+48]+=                                 # add to digit count
        ($p++?-1:1)*                                # (add first, subtract other)
        $a[$c];                                     # character occurences

ONEsadece olan bir kelime değildir O, bu yüzden W(sadece görünenler TWO) ve U(yalnızca görünenler ) gibi sayıları çıkarmanız gerekir FOUR.
NINEözeldir, çünkü harfleri kullanırsam ( I-X-G-F+Uveya isterse N-O-S+W+U+X) çıkarmamın bir yolu yoktur , bu yüzden bunun yerine rakamları kullanırım.

PHP, 160 bayt

$a=count_chars($argn);foreach([W2O,U4FOR,X6SI,G8I,F5I,O1,R3,S7,I9]as$s)for(${$s[$p=1]}+=$n=$a[ord($s)];$c=ord($s[++$p]);)$a[$c]-=$n;while($$i--?print$i:$i++<9);

tüm büyük harf girişlerini varsayar; karakterler her yerde karıştırılabilir.
Pipe ile çalıştırın -nRveya çevrimiçi deneyin .

açıklama

Girdide ve diğer karakterlerin sayısını azaltarak işlemdeki benzersiz karakterlerin sayımlarını sayarak, sayılar arasında dolaşır. "Diğer karakterler" olabilir kelimenin diğer tüm karakterler anlamına; ama sadece daha sonra ihtiyaç duyulacak olanları düşünerek 19 bayt kurtardı.

str_repeatDöngüyü birleşik bir döngüye dönüştürmek 5 bayt kurtardı.

Rakam sayısı için değişken değişkenleri kullanmak ise 8 tane daha kaydetti.

Yıkmak

$a=count_chars($argn);                              # count character occurences in input
foreach([W2O,U4FOR,X6SI,G8I,F5I,O1,R3,S7,I9]as$s)   # loop through digit names
    for(${$s[$p=1]}+=                                   # 2. add to digits count
        $n=$a[ord($s)];                                 # 1. get count of unique character
        $c=ord($s[++$p]);)                              # 3. loop through other characters
        $a[$c]-=$n;                                         # reduce character count
while(
    $$i--?print$i                                       # print digit repeatedly
    :$i++<9);                                       # loop through digits
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.