Orijinal Numara (II)


18

Bu meydan okuma, aslında tek bir farkla aynıdır : şimdi dizenin herhangi bir yerinde harfleri karıştırmaya izin verilir.

senaryo

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

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

Onun sayısı her zaman azalmayan bir dizidir (yani. "1123")

Her rakamı İngilizce kelimelere çevirdi. (ör. "123" -> "ONETWOTHREE")

Ve sonra, harfleri rastgele yeniden düzenleyin. (ör. "ONETWOTHREE" -> "EEWOOHRNTET")

John, sayısının güvenli olduğunu hissetti. Aslında, bu tür şifrelemelerin şifresi kolayca çözülebilir :(


Görev

Şifrelenmiş dize verildiğinde, göreviniz şifresini çözmek ve orijinal sayıyı döndürmektir.


kurallar

  • Bu kod golf, bu yüzden bayttaki en kısa cevap kazanır
  • Giriş dizesinin her zaman geçerli olduğunu varsayabilirsiniz.
  • Giriş dizesi yalnızca büyük harf içerir
  • Orijinal numaralar her zaman artan sırada düzenlenir
  • Numarayı dize veya tamsayı biçiminde döndürebilirsiniz
  • Harfler tüm dize arasında değil, sadece bir kelime arasında karıştırılır. Harfler dizenin herhangi bir yerine karıştırılabilir.
  • Sayılar sadece 1 ila 9 Anin olacaktır ( ONEiçin NINE)

Olası Çözülmemiş Dize

Sayılardan dizelere dönüştürüldükten hemen sonra dizelerin listesi:

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

Örnekler

"NEO" -> 1

"NWEOOT" -> 12

"TOEERWNEHOT" -> 123

"IHNEVGENNEISTE" -> 789

"WEETVTRFSVUHNEEFRHIXEOINSNIEGTOONIEE" -> 123456789

"EWHEWROETOTTON" -> 1223

"ONEWESTV" -> 27 (teşekkürler, ETHproductions!)


7
Önerilen test örneği: gibi "ONEWESTV" -> 27bir şey (aslında görünmeyen bir sayı içerir)
ETHproductions 28:17

@ETHproductions Harika bir fikir! Katma.
Cristian Lupascu

Neden "SIFIR" yok?
RosLuP

@RosLuP John önde gelen sıfırlardan nefret ediyor ...
Cristian Lupascu

Yanıtlar:


9

Python 2 , 123 bayt

c=map(input().count,"OWHUFXSGIQ")
i=4
for j in"71735539994":c[i*2]-=c[int(j)];i=-~i%5
s=""
for n in c:i+=1;s+=`i`*n
print s

Alıntılanan girdi alan ve John numarasını yazdıran tam bir program.

Çevrimiçi deneyin! veya bir test takımına bakın

Nasıl?

Örnek "NEONSEXTOWNII" ile çalışalım (1269 elde etmek ve biraz Leisure Suite Larry -esque olmak!)

İlk olarak c=map(input().count,"OWHUFXSGIQ")girdi alır ve her birinin sayısını sayar OWHUFXSGIQ- bunlar, her sayıda artan sırada görünen harflerdir, 2,4,6 ve 8'in "kendi" harflerine ( WUXG) ve ekstra bir harfe, Qsıfır eklemek için sonuna kadar ve sonuç listesinin uzunluğunu eşit yapın. Örnek için:

[2,1,0,0,0,1,1,0,2,0] <- c
 O W H U F X S G I Q  <- is the counts of these letters
 1 2 3 4 5 6 7 8 9 0  <- which "relate to" these digits in John's number
   2   4   6   8   0  <- these will be correct as the letters are unique to their words

1, 3, 5, 7 ve 9 girişlerinin diğer harflerin bolluğunu düzeltmek için ayarlanması gerekir. Bu, bir sonraki döngü tarafından gerçekleştirilir:

i=4
for j in"71735539994":c[i*2]-=c[int(j)];i=-~i%5

Ayarlanacak girdilerin alternatif olanlar olduğunu unutmayın (1,3,5,7,9,1,3,5, ...), bu nedenle her adımda bir dizin değişkenine iki ve kalmak için 10 ile modulo ekleyebiliriz menzili birden fazla kez geçmemiz gerekiyorsa (ki bunu yaparız). Bazı baytları kaydetmek için bir ve bir artı 5 artırabilir ve dizinin iki katını kullanabiliriz.
9 için ayarlamalar orada başladığımız en fazla işi gerektirdiğinden - dizin 8'de bulunur, bu yüzden de başlıyoruz i=4. Dize "71735539994"daha sonra jher aşamada kaldırılacak değerlerin dizinlerini verir (burada dokuzuncu dizinin "Q"oluştururken kullanarak sıfır içermesini sağladık c); c[i*2]-=c[int(j)]Her bir ayrı ayrı ayarlama ve yerine i=-~i%5hareket i(bir sonraki dizin -~iolan -(-1-i)ya da i+1tasarruf parantez (i+1)%5) tutmaki*2sınırları içinde c.
Böylece ilk dizindeki sayısı çıkarma j=7dizindeki bundan i*2=8( "I" s sayısından sayılır s "G" sayısını çıkararak "sekiz" s (doğru) sayısına göre geri sayım "NINE'ın" ayarlama ki bu da bir "Ben" e sahiptir). Daha sonra , "ONE" için olan referans indeksine i=0( -~4%5 = (4+1)%5 = 0) ilerleriz ve "O" sayımını ayarlayarak "W" sayımı girişini ve dolayısıyla "İKİ" i*2 = 0indeksinde j=1bulunan değeri çıkarırız . Döngünün sonunda düzeltilmiş sayımlara sahibiz:

[1,1,0,0,0,1,0,0,1,0] <- c   (for 1223333448 it would be: [1,2,4,2,0,0,0,1,0,0])
 1 2 3 4 5 6 7 8 9 0

yani geriye kalan tek şey cşimdi ( 1269) temsil eden şeyi yazdırmak . işimdi geri döndü 0, bu yüzden döngü başlangıcında artırıyoruz ve rakamımız olarak kullanıyoruz:

s=""
for n in c:i+=1;s+=`i`*n
print s

Geri keneler, `i`, Python2 olan stenografi için repr(i)hangi bir sayı creats tarafından burada sadece göstermek birçok tekrarlar (yeni dize dize bir nesne (bir dize olarak söz konusu rakam karakteriyle) temsilini ve çarpılması bir dize alır n=0dönüm `i`söz hakkından gelen "5"için ""ve n=1söz tutmak dönüm "6"olarak "6", ama aynı zamanda bu yüzden, daha büyük pozitif tamsayılar için çalışır "3"*4hale "3333"örneğin.)


8

05AB1E , 31 bayt

[{‘Z€µ‚•„í†ìˆÈŒšï¿Ÿ¯¥Š‘#NSèJ{Q#

Çevrimiçi deneyin!

açıklama

[                                   # start loop
 {                                  # sort input
  ‘Z€µ‚•„í†ìˆÈŒšï¿Ÿ¯¥Š‘#            # push the list ['Z','ONE','TWO','THREE','FOUR','FIVE','SIX','SEVEN','EIGHT','NINE']
                        N           # push the current iteration counter
                         S          # split to list of digits
                          è         # index into the list with each
                           J{       # join to string and sort
                             Q#     # if the strings are equal, exit loop
                                    # implicitly print iteration counter

Büyük giriş için çok verimsiz.


‘Z€µ‚•„í†ìˆÈŒšï¿Ÿ¯¥Š‘# # push the list ['Z','ONE','TWO','THREE','FOUR','FIVE','SIX','SEVEN','EIGHT','NINE']: Biraz açıklayabilir misiniz, herhangi bir dizgenin nasıl üretilebileceğini anlamak için mücadele ediyorum.
Cyril Gandon

1
@CyrilGandon: boşlukla ayrılmış kelimelerin büyük harfle sıkıştırılmış bir dizesini sınırlar. Zanlamına gelir Z. Diğer tüm 2 sembollü çiftler 05AB1E'nin sözlüğünden sıkıştırılmış bir kelimeyi belirtir . Yani örneğin olarak €µçevirir ONE.
Emigna

Güzel, sözlükte bulunan bir dizeyi nasıl sıkıştırırsın? Çiftin unicode değeri olan bir şey mi var?
Cyril Gandon

1
@CyrilGandon: Sözdeki kelimenin satır numarasını ( merhaba için 2420 ) alır ve 1 çıkarırsınız. Bu bize verir 2419. İhtiyacımız semboller tarafından takip edilmektedir sembollerdir 24ve 19içinde docs . Bizim durumumuzda bu 24=Ÿve 19=™öyle HELLOolur‘Ÿ™‘
Emigna

1
Adnan'ın yazdığı birçok durumda kullanabileceğiniz bir kompresör de var. Bağlantı biraz uzun, ancak 05AB1E sohbet odasında bulabilirsiniz . Bu, başka sorularınız varsa sormak için iyi bir yer :)
Emigna

8

Retina , 112 97 bayt

O`.
}`GH
8
X
6
H
3
+`F(.*)O(.*)U
4$1$2
+`O(.*)W
2$1
+`F(.*)V
5$1
+`N(.*)V
7$1
}`NO
1
NN
9
T`L
O`.

Çevrimiçi deneyin!

@Neil sayesinde -12 bayt

Transpozisyonda L karakter sınıfları kullanılarak -3 bayt

Nasıl çalışır

Temel olarak, bu, harflerin sadece belirli sayı adlarında kullanıldığı gerçeğine dayanır. Örneğin SIX, bir X. Bu, bazı kelimeler böyle her ikisi olarak, harflerle üst üste gerçeği ile daha alır FIVEve SEVENkullanma V. Bu belirleyerek için düzeltilmiş olabilir FIVEile F(.*)V.


1
@RickHitchcock Düzeltildi. 8'e dönüşüm özyineleme düzgün çalışmıyor
fireflame241

1
@RickHitchcock. Hepsi için özyineleme düzeltildi.
fireflame241

Can sıkıcı GHve NObitişik olurdu, herhangi bir önceki 8veya 1bir önceki değiştirme hariç ...
Neil

Belki }`GH 8de işe yarayacaktır 8- bu }, karakterlerin tekrar sıralanmasına neden olur, böylece kalanları Gve Hbirlikte yerleştirir .
Neil

@Neil Güzel bir fikir. Ben de bunu yapabildim NO -> 1, hangi uygun oldu.
fireflame241

5

Kotlin 1.1 , 359 352 331 327 325 bayt

boyun eğme

fun r(r:String):String{var s=""
val f=r.split(s).groupingBy{it}.eachCount()
val c=Array(10,{0})
c[8]=f["G"]?:0
c[6]=f["X"]?:0
c[4]=f["U"]?:0
c[2]=f["W"]?:0
c[1]=(f["O"]?:0)-c[2]-c[4]
c[3]=(f["R"]?:0)-c[4]
c[7]=(f["S"]?:0)-c[6]
c[5]=(f["V"]?:0)-c[7]
c[9]=((f["N"]?:0)-c[1]-c[7])/2
for(i in 1..9)for(x in 1..c[i])s+=i
return s}

Kotlin 1.1 desteklenmediği için TryItOnline'da çalışmıyor

Ölçek

fun r(r:String):String{
val f=r.split("").groupingBy{it}.eachCount()
val c=Array(10,{0})
c[8]=f["G"]?:0
c[6]=f["X"]?:0
c[4]=f["U"]?:0
c[2]=f["W"]?:0
c[1]=(f["O"]?:0)-c[2]-c[4]
c[3]=(f["R"]?:0)-c[4]
c[7]=(f["S"]?:0)-c[6]
c[5]=(f["V"]?:0)-c[7]
c[9]=((f["N"]?:0)-c[1]-c[7])/2
var s=""
for(i in 1..9)for(x in 1..c[i])s+=i
return s}

data class TestData(val input: String, val output: String)

fun main(vararg args:String) {
    val items = listOf(
    TestData("NEO" , "1"),
    TestData("NWEOOT" , "12"),
    TestData("TOEERWNEHOT" , "123"),
    TestData("IHNEVGENNEISTE" , "789"),
    TestData("WEETVTRFSVUHNEEFRHIXEOINSNIEGTOONIEE" , "123456789"),
    TestData("EWHEWROETOTTON" , "1223")
    )
    for (item in items) {
        val out = r(item.input)
        if (out != item.output) {
            throw AssertionError("Bad result: $item : $out")
        }
    }
}

Mantık

Beşik sayfası

Her bir harfi çözmenin en basit yolunu bulmak için yukarıdaki sayfayı kullandım

  • Yeşil = Kendi kendine çöz
  • Mavi = Çözmek için yeşile ihtiyaç var
  • Turuncu = Çözülmesi gereken maviler gerekiyor
  • Kırmızı = Çözmek için portakal gerekiyor

Düzenlemeler

  • -7 - Boşluk w0lf olarak değişti
  • -21 - Diziyi daralt
  • -4 - Gereksiz braketler çıkarıldı
  • 0 - Giriş mantığı eklendi
  • -2 - kevin-cruijssen sayesinde boş dizeyi yeniden kullanma

1
Sadece benzer bir yaklaşım kullanarak Java 8 cevabımla (127 bayt) tam olarak bağlandığımı fark ettim . ;) Ama bir soru: değiştiremediğiniz var s=""ve return skarşı r=""ve return rgirdi-String, o noktada artık ihtiyacı yeniden kullanarak? Daha önce hiç Kotlin'de programlamamıştım, bu yüzden burada saçma sapan konuşabilirdim. ; p
Kevin Cruijssen


1
Ah evet, bu elbette bir olasılıktı; parametreler finalvarsayılan değerdir. Hmm, bir şey golf mümkün olabilir: yerleştirin var s=""yönteminde ilk şey olarak, ve değiştirme val f=r.split("").ile val f=r.split(s).. Yine, işe yarayıp yaramadığı hakkında hiçbir fikrim yok. Çok kötü TIO henüz
v1.1'i

4

Jöle , 37 bayt

1ðDị“©ȯ¿w¶&ÇhṆỌƘ#Ȯʋ~¢CNẓ_»ŒuḲ¤ẎŒ!ċð1#

Çevrimiçi deneyin!

-1 Jonathan Allan sayesinde .


7 karakterden (: ex daha büyük bazı girişler için dışarı Bu kez NINEFIVE, THREEFIVE). Bu bir hata mı yoksa kod sadece verimsiz mi?
Cristian Lupascu

@ w0lf ikincisi ( Œ!"permütasyon" anlamına gelir)
Outgolfer Erik

"!" ...“©ȯ¿w¶&ÇhṆỌƘ#Ȯʋ~¢CNẓ_»...
Jonathan Allan

@JonathanAllan oh AA bir kelime mi?
Outgolfer Erik

Kısa sözlükteki ilk kelime, evet.
Jonathan Allan

3

Java 8, 248 234 bayt

s->{int x=0,a[]=new int[10];for(String t:"2WO;4UORF;6XSI;8GI;5FI;7S;3R;1O;9I".split(";"))for(;s.indexOf(t.charAt(1))>=0;a[t.charAt(0)-48]++)for(String z:t.split(""))s=s.replaceFirst(z,"");for(s="";x++<9;)for(;a[x]-->0;)s+=x;return s;}

Kod Açıklaması:

s->{
    // Array to count how often which number appears
    int a[]=new int[10];
    // The first character behind the number serves the identification
    // the other characters get removed to identify the other numbers later
    for(String t:"2WO;4UORF;6XSI;8GI;5FI;7S;3R;1O;9I".split(";"))
        // Check if the string contains the id 
        for(;s.indexOf(t.charAt(1))>=0;a[t.charAt(0)-48]++)
            // Remove the relevant charcters
            for(String z:t.split(""))
                s=s.replaceFirst(z,"");
    // Clear the string to write the output
    s="";
    // write the numbers sequential into the output 
    for(int x=0;x++<9;)
        for(;a[x]-->0;)
            s+=x;
    return s;
}

-14 Olivier Grégoire'a teşekkürler



2

Java 8, 346 345 344 336 327 bayt

s->{int g=c(s+=" ","G"),u=c(s,"U"),w=c(s,"W"),x=c(s,"X"),f=c(s,"F")-u,h=c(s,"H")-g,v=c(s,"V")-f,o=c(s,"O")-u-w,i=c(s,"I")-f-x-g;return d(s=d(s=d(s=d(s=d(s=d(s=d(s=d(s=d("",o,1),w,2),h,3),u,4),f,5),x,6),v,7),g,8),n,9);}int c(String...s){return~-s[0].split(s[1]).length;}String d(String s,int i,int n){for(;i-->0;s+=n);return s;}

Burada deneyin.

Genel açıklama:

Alfabedeki her karakterin oluşumlarına baktım:

E 13357789
F 45
G 8
H 38
I 5689
N 1799
O 124
R 34
S 67
T 238
U 4
V 57
W 2
X 6
  • Ben ilk tek maç karakterlerin tüm oluşumlarını sayılır: G=8; U=4; W=2; X=6.
  • Sonra onların sayıları çıkarma olabilir ayrıca yukarıda dört biriyle eşleşmesi iki eşleştirilmiş karakterler, tüm tekrarları: F=5; H=3.
  • Sonra da aynısını yaptım V=7(çıkararak F=5).
  • Sonra kalmıştı her üç-maçlar karakterler için aynı: O=1; N=9.
    • Ama Niçinde iki kez olduğu için, her oluşumu için NINEbir ek yapmak zorunda kaldım , bu yüzden bunun yerine kullandım (iki yerine önceki üç maçı çıkararak).-1NI=9

Kod Açıklaması:

s->{                    // Method with String as parameter and return-type
  int g=c(s+=" ","G"),  //  Amount of 8s (and append a space to `s` first, for the .split)
      u=c(s,"U"),       //  Amount of 4s
      w=c(s,"W"),       //  Amount of 2s
      x=c(s,"X"),       //  Amount of 6s
      f=c(s,"F")-u,     //  Amount of 5s
      h=c(s,"H")-g,     //  Amount of 3s
      v=c(s,"V")-f,     //  Amount of 7s
      o=c(s,"O")-u-w,   //  Amount of 1s
      i=c(s,"I")-f-x-g; //  Amount of 9s
  return d(             //  Return the result by:
   s=d(
    s=d(
     s=d(
      s=d(
       s=d(
        s=d(
         s=d(
          s=d("",       //   Making the input String `s` empty, since we no longer need it
                 o,1),  //   Append all 1s to `s`
         w,2),          //   Append all 2s to `s`
        h,3),           //   Append all 3s to `s`
       u,4),            //   Append all 4s to `s`
      f,5),             //   Append all 5s to `s`
     x,6),              //   Append all 6s to `s`
    v,7),               //   Append all 7s to `s`
   g,8),                //   Append all 8s to `s`
  i,9);                 //   And then returning `s` + all 9s
}                       // End of method

int c(String...s){  // Separate method with String-varargs parameter and int return-type
                    //  `s[0]` is the input-String
                    //  `s[1]` is the character to check
  return~-s[0].split(s[1]).length;
                    //  Return the amount of times the character occurs in the String
}                   // End of separated method (1)

String d(String s,int i,int n){
               // Separate method with String and two int parameters and String return-type
  for(;i-->0;  //  Loop from the first integer-input down to 0
      s+=n     //   And append the input-String with the second input-integer
  );           //  End of loop
  return s;    //  Return the resulting String
}              // End of separated method (2)

1
Kahretsin, bir listeye ekledikten sonra sıralamanın daha kısa olacağını düşünürdüm (öyle değil). Aferin!
Olivier Grégoire

1
Sonunda, seni geride bıraktım , ama çok fazla değil;)
Olivier Grégoire


1

Python 3 , 225 bayt

def f(s):
	r=[]
	for i,w in zip([2,4,6,8,3,5,7,1,9],["WTO","UFOR","XSI","GEIHT","HTREE","FIVE","VSEEN","ONE","NINE"]):
		while s.count(w[0]):
			r+=[i]
			for l in w:s="".join(s.split(l,1))
	return "".join(sorted(map(str,r)))

Çevrimiçi deneyin!

Basit: önce belirli bir harfle tanımlanan basamakları kaldırır.


1

Python 3 , 125 bayt

lambda s:''.join(min(w)*(2*sum(map(s.count,w[:2]))-sum(map(s.count,w)))for w in"O1WU W2 H3G U4 F5U X6 S7X G8 IUFXG9".split())

Çevrimiçi deneyin!

Bağlantılı zorluğu okuduktan sonra , bunun, Draco18s'in ES6 çözümüne dayanan mdahmoune Python çözümünde bir varyasyon olduğunu fark ettim , ama hey, en azından iki bayt golf oynadık.

Bu çözüm gibi, cevabı belirli harflerin oluşum sayısının doğrusal bir kombinasyonu ile hesaplıyoruz. Doğrusal kombinasyonları, ilk iki harfin ekleneceği ve sonrasındaki her şeyin çıkarılacağı kelimeler olarak yazarak kısaca kodlarız. Bazen ilk iki karakteri doldurmak için bir karakter gerekir; bunu çıkarmak istediğimiz rakamı gizlemek için kullanırız (girişte hiçbir zaman gerçekleşmez, bu yüzden algoritmamızı etkilemez) min.



1

Aksiyom, 351 bayt

s:="GXUWRFVIONETHS";e:EqTable(CHAR,INT):=table();v:=[8,6,4,2,3,5,7,9,1];z:=[k for k in 1..46|prime?(k)];F(x,y)==>for i in 1..#x repeat y;F(z,e.(s.i):=z.i);t:=[1787026,2451,16445,5957,16036207,130169,20372239,495349,20677];h(a)==(r:=1;F(a,r:=r*e.(a.i));j:=[];F(v,while r rem z.i=0 repeat(r:=r quo t.i;j:=cons(v.i,j)));j:=sort j;k:=0;F(j,k:=k*10+j.i);k)

ungolfed yorumladı sonuçları

s:="GXUWRFVIONETHS" -- tutte le lettere di ONE..NINE in ordine di importanza 
e:EqTable(Character,Integer):=table()
v:=[8,6,4,2,3,5,7,9,1]              -- numeri da controllare in quell'ordine di apparizione di v
z:=[k for k in 1..46|prime?(k)]     -- 14 numeri primi da associare a s
F(x,y)==>for i in 1..#x repeat y 
F(z,e.(s.i):=z.i)                   -- riempie la tavola associando numeri primi alle lettere "GXUW..."
t:=[1787026,2451,16445,5957,16036207,130169,20372239,495349,20677]  -- prodotto di numeri primi 1787026 dovrebbe essere HEIGHT
h(a)==
     r:=1 ;F(a,r:=r*e.(a.i))        -- calcola il numero associato alla stringa a
     j:=[];F(v,while r rem z.i=0 repeat(r:=r quo t.i;j:=cons(v.i,j)));j:=sort j  -- leva il nome dei numeri che man mano trova, aggiunge a j
     k:=0 ;F(j,k:=k*10+j.i)         -- costruisce il numero decimale k, da j vettore ordinato
     k                              -- ritorna tale numero k
------------------------------------------------------
(8) -> h("IHNEVGENNEISTE")
   (8)  789
                                                    Type: PositiveInteger
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.