FizzBuzz Ters Çözücü


32

Özet: Genelleştirilmiş bir FizzBuzz programının çıktısı göz önüne alındığında, program için kullanılan faktörlerin ve kelimelerin listesini döndürün.

Zorluk Açıklaması

Girdi olarak kullanılacak faktörlerin ve kelimelerin ve başlangıç ​​numaralarının bir listesini alan genelleştirilmiş bir FizzBuzz programı düşünün. Örneğin, bu programın girişi olsaydı

3 2,Ninja 5,Bear 7,Monkey

Program gelen sayıları yazdırmak istiyorum 3için 100bölünebilen sayılar yerine 2birlikte Ninja, sayılar tarafından bölünebilecek 5ile Bearve sayılar ile bölünebilecek 7ile Monkey. Daha bu terimlerin olandan sonra bölünebilir olan numaralar için programı gibi şeyler baskı, kelimeleri sıralamak olacak NinjaBearya BearMonkeyya NinjaMonkeyya NinjaBearMonkey. İşte bu girişin çıktısı:

3
Ninja
Bear
Ninja
Monkey
Ninja
9
NinjaBear
11
Ninja
13
NinjaMonkey
Bear
Ninja
17
Ninja
19
NinjaBear
Monkey
Ninja
23
Ninja
Bear
Ninja
27
NinjaMonkey
29
NinjaBear
31
Ninja
33
Ninja
BearMonkey
Ninja
37
Ninja
39
NinjaBear
41
NinjaMonkey
43
Ninja
Bear
Ninja
47
Ninja
Monkey
NinjaBear
51
Ninja
53
Ninja
Bear
NinjaMonkey
57
Ninja
59
NinjaBear
61
Ninja
Monkey
Ninja
Bear
Ninja
67
Ninja
69
NinjaBearMonkey
71
Ninja
73
Ninja
Bear
Ninja
Monkey
Ninja
79
NinjaBear
81
Ninja
83
NinjaMonkey
Bear
Ninja
87
Ninja
89
NinjaBear
Monkey
Ninja
93
Ninja
Bear
Ninja
97
NinjaMonkey
99
NinjaBear

Programın kelimeleri bir araya getirmesi gerektiğinde, her zaman en düşük sayıdan en yüksek sayıya geçtiğini unutmayın . Bu yüzden MonkeyBear(Maymun, Bear'den daha yüksek olduğu için) gibi bir şey basmaz.

Programınız içinde almalıdır çıkışı olarak genelleştirilmiş FizzBuzz programının giriş ve çıkış girişi genelleştirilmiş FizzBuzz programa verilen. Başka bir deyişle, genelleştirilmiş FizzBuzz programı için bir "ters program" yazın. Örneğin, yukarıdaki kod bloğunu girdi olarak verdiğinizde, programınızın çıktı vermesi gerekir 3 2,Ninja 5,Bear, 7,Monkey.

Kelimelerin her zaman takip edeceği bazı kurallar vardır:

  • Girişteki faktörlerin ve kelimelerin tam olarak ne olduğunu söylemek her zaman mümkün olacaktır.
  • Her kelime büyük harfle başlayacak ve başka büyük harf veya rakam içermeyecek.
  • Her faktör benzersizdir.

Örnek Girişler ve Çıkışlar

Giriş:

Calvins
7
Hobbies
9
10
11
Calvins
13
14
15
Hobbies
17
Calvins
19
20
21
22
23
CalvinsHobbies
25
26
27
28
29
Calvins
31
Hobbies
33
34
35
Calvins
37
38
39
Hobbies
41
Calvins
43
44
45
46
47
CalvinsHobbies
49
50
51
52
53
Calvins
55
Hobbies
57
58
59
Calvins
61
62
63
Hobbies
65
Calvins
67
68
69
70
71
CalvinsHobbies
73
74
75
76
77
Calvins
79
Hobbies
81
82
83
Calvins
85
86
87
Hobbies
89
Calvins
91
92
93
94
95
CalvinsHobbies
97
98
99
100

Çıktı:

6 6,Calvins 8,Hobbies

Giriş:

FryEggman
7
Am
Fry
The
11
FryAmEggman
13
14
FryThe
Am
17
FryEggman
19
AmThe
Fry
22
23
FryAmEggman
The
26
Fry
Am
29
FryTheEggman
31
Am
Fry
34
The
FryAmEggman
37
38
Fry
AmThe
41
FryEggman
43
Am
FryThe
46
47
FryAmEggman
49
The
Fry
Am
53
FryEggman
The
Am
Fry
58
59
FryAmTheEggman
61
62
Fry
Am
The
FryEggman
67
Am
Fry
The
71
FryAmEggman
73
74
FryThe
Am
77
FryEggman
79
AmThe
Fry
82
83
FryAmEggman
The
86
Fry
Am
89
FryTheEggman
91
Am
Fry
94
The
FryAmEggman
97
98
Fry
AmThe

Çıktı:

6 3,Fry 4,Am 5,The 6,Eggman

Giriş:

DeliciousTartApplePie
DeliciousCreamPancakeStrawberry
DeliciousProfiterole
DeliciousCream
DeliciousPancake
DeliciousCreamStrawberryTart

Çıktı:

95 1,Delicious 2,Cream 3,Pancake 4,Strawberry 5,Tart 19,Apple 95,Pie 97,Profiterole

Sen girdileri üretmek için kullanılan kod I alabilirsiniz burada .


Liste hep tam olarak 100’e mi çıkıyor?
Dennis,

@Dennis Evet, üst bağlanmış daima 100'dür
pelin otu

15
Örneklerinden birinde olmak sadece bir onur.
NinjaBearMonkey

Bu, başlangıçta kum havuzunda olduğundan çok daha iyi bir versiyonudur :)
Beta Decay

1
@NinjaBearMonkey İçlerinde birçok sözcük olan adları seçmemizin bize daha iyi örnekler verdiğini düşünüyorum. Beni de dahil ettiğiniz için teşekkürler @ Prirha! :)
FryAmTheEggman

Yanıtlar:


10

Pyth, 73 bayt

jd+J-101lK.zjL\,Sm,_-F>2+_Jf}d@KTUKd{smtcdf-@dTGUdf>T\:K

Kesinlikle zordu. Sanırım @ MartinBüttner örneğindeki her şey ve yinelenen faktör yok örneği de dahil olmak üzere tüm ileri vakaları ele aldım.

NinjaBearMonkey , Lezzetlilik

Yüksek seviyede, program ilk önce tüm kelimeleri alfabetik harfleri büyük harflerle keserek bulur.

Ardından, satırlar her bir dizginin satırda görünüp görünmeyeceği ile eşleştirilir ve olası her bir etmen aynı sıralamayı üretip üretmediğini görmek için test edilir. Varsa, faktör, zaten mevcut olup olmadığını görmek için kontrol edilen bir balbal listesine eklenir. Zaten mevcut değilse, faktör kullanılır. Dizeler, her biri yalnızca aynı satırda görünen dizelerin sırasını belirleyen girdideki ilk görünüme göre sıralanır.

Ondan sonra, sadece biçimlendirme ve yazdırma.


5

Scala, 350 karakter

(s:String)⇒{def g(a:Int,b:Int):Int=if(b==0)a.abs else g(b,a%b);val(j,q)=(s.lines:\100→Map.empty[String,Int]){case(l,(n,m))⇒if(l(0).isDigit)(n-1,m)else(n-1,m++(Seq(Seq(l(0)))/:l.tail){case(x,c)⇒if(c.isUpper)Seq(c)+:x else (x(0):+c)+:x.tail}.map{t⇒val w=t.mkString;w→g(m.getOrElse(w,n),n)})};s"${j+1}"+q.map{case(k,v)=>s" $v,$k"}.toSeq.sorted.mkString}

Kazanmama ... ama güzel soru.

test edilen sonuçlar:

scala> (s:String)⇒{def g(a:Int,b:Int):Int=if(b==0)a.abs else g(b,a%b);val(j,q)=(s.lines:\100→Map.empty[String,Int]){case(l,(n,m))⇒if(l(0).isDigit)(n-1,m)else(n-1,m++(Seq(Seq(l(0)))/:l.tail){case(x,c)⇒if(c.isUpper)Seq(c)+:x else (x(0):+c)+:x.tail}.map{t⇒val w=t.mkString;w→g(m.getOrElse(w,n),n)})};s"${j+1}"+q.map{case(k,v)=>s" $v,$k"}.toSeq.sorted.mkString}
res0: String => String = <function1>

scala> res0("""DeliciousTartApplePie
     | DeliciousCreamPancakeStrawberry
     | DeliciousProfiterole
     | DeliciousCream
     | DeliciousPancake
     | DeliciousCreamStrawberryTart""")
res1: String = 95 1,Delicious 2,Cream 3,Pancake 4,Strawberry 5,Tart 95,Apple 95,Pie 97,Profiterole

scala> res0("""FryEggman
     | 7
     | Am
     | Fry
     | The
     | 11
     | FryAmEggman
     | 13
     | 14
     | FryThe
     | Am
     | 17
     | FryEggman
     | 19
     | AmThe
     | Fry
     | 22
     | 23
     | FryAmEggman
     | The
     | 26
     | Fry
     | Am
     | 29
     | FryTheEggman
     | 31
     | Am
     | Fry
     | 34
     | The
     | FryAmEggman
     | 37
     | 38
     | Fry
     | AmThe
     | 41
     | FryEggman
     | 43
     | Am
     | FryThe
     | 46
     | 47
     | FryAmEggman
     | 49
     | The
     | Fry
     | Am
     | 53
     | FryEggman
     | The
     | Am
     | Fry
     | 58
     | 59
     | FryAmTheEggman
     | 61
     | 62
     | Fry
     | Am
     | The
     | FryEggman
     | 67
     | Am
     | Fry
     | The
     | 71
     | FryAmEggman
     | 73
     | 74
     | FryThe
     | Am
     | 77
     | FryEggman
     | 79
     | AmThe
     | Fry
     | 82
     | 83
     | FryAmEggman
     | The
     | 86
     | Fry
     | Am
     | 89
     | FryTheEggman
     | 91
     | Am
     | Fry
     | 94
     | The
     | FryAmEggman
     | 97
     | 98
     | Fry
     | AmThe""")
res2: String = 6 3,Fry 4,Am 5,The 6,Eggman

4

Python 2, 366 340 331 bayt

Bu program stdin üzerinden girdi alır.

Yeni yaklaşım:

Çizginin sonundan uzaklık ile sadece bir oluşum kelimelerinin faktörünü hesaplayın. Örneğin (son örnekten): DeliciousTartApplePiePasta olarak hesaplamak geçerli: [95,19,5,1][0]ve Apple geçerli: [95,19,5,1][1].

import sys
import re
d=[(i,re.findall('[A-Z][a-z]*',l)[::-1])for i,l in enumerate(sys.stdin)]
e=101-len(d)
print e," ".join(`x`+','+`y`[1:-1]for x,y in sorted({next((j-i for j,t in d if j>i and w in t),[x for x in range(i+e,0,-1)if(i+e)%x==0][d[i][1].index(w)]):w for w,i in{w:i for i,l in d[::-1]for w in l}.items()}.iteritems()))

Eski yaklaşım:

import sys
import re
l=[(i,re.findall('[A-Z][a-z]*',l))for i,l in enumerate(sys.stdin)]
e=101-len(l)
d={}
for i,s in l:
 for w in s[::-1]:
  if w not in d.values():
   d[next((j-i for j,t in l[i+1:]if w in t),next(m for m in range(i+e,0,-1)if(i+e)%m==0and m not in d))]=w 
print e," ".join(`x`+','+`y`[1:-1]for x,y in sorted(d.iteritems()))

Kullanımı:

python FizzBuzzReverseSolver.py < Sample1.txt

Açıklama (Eski yaklaşımın):

  • Genel olarak, program satır numarası ve sözcük listesi oluşturur (ör [(0, []), (1, ['Ninja']), (2, ['Bear']), ...].
  • Her satırdaki her kelime için (satırın sonundan başlayarak):
    • Kelimenin bir sonraki tekrarlamasını bulun ve farkı ve kelimeyi önceden tanımlanmış bir sözlüğe ekleyin.
    • Bulamazsa, sözlükte bulunmayan satır numarasının (kendisi dahil) en büyük faktörünü ve sözlüğe sözlüğe ekleyin.
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.