Fizz Buzz .. Crackle Pop! (Genelleştirilmiş Fizz Buzz)


11

Hepimiz ol 'Fizz Buzz problemini duyduk, ancak daha fazla faktörle uygulamaya çalıştığınızda ne olur? Fizz Buzz Crackle Pop!

Meydan okuma

Bir tamsayı girişi n , sonra bir tamsayı ve bir dize içeren n tuples, sonra başka bir tamsayı (> 1) k alan tam bir program yazın :

 n int1 str1 int2 str2 (...) intn strn k

Bu satırı komut satırından veya STDIN'den alabilirsiniz.

O herhangi biri tarafından bölünebilir ise, daha sonra bütün tamsayılar 1, k için INT1 , INT2 ... intn , çıkış karşılık gelen tüm str sonrasında bir yeni satır giriş sırayla s. Değilse, tamsayıyı ve ardından bir satırsonu çıkar.

Örneğin, girdi ile

3 2 Fizz 3 Buzz 5 Crackle 10

aldık

1
Fizz
Buzz
Fizz
Crackle
FizzBuzz
7
Fizz
Buzz
FizzCrackle

Ancak girdi ile (sipariş değişikliğine dikkat edin)

3 3 Buzz 2 Fizz 5 Crackle 10

aldık

1
Fizz
Buzz
Fizz
Crackle
BuzzFizz
7
Fizz
Buzz
FizzCrackle

İsteğe bağlı sondaki yeni satır kabul edilebilir.

Bayt cinsinden en kısa kod kazanır.

Düzenlemeler:

Açıkçası çok özledim, üzgünüm.

  • Dan Girdiler (: c) konsolu ve STDIN, başka bir şey 5 bayt alır yerde
  • Tam programlar lütfen.
  • Strs için boş olmayan dizeler varsayalım
  • Ints benzersizliği için garanti yok

Örnek C ++ programı (tembel olduğum için 20 ile sınırlı):

#include <iostream>
#include <string>
using namespace std;

int main() {
  string names[20];
  int mods[20], n, max;
  cin >> max >> n;
  for (int i=0; i<n; i++) {
    cin >> mods[i] >> names[i];
  }
  for (int i=1; i<=max; i++) {
    bool found = false;

    for (int j=0; j<n; j++) {
      if (i % mods[j] == 0) {
        found = true;
        cout << names[j];
      }
    }
    if (!found)
     cout << i;
    cout << endl;
  }

  return 0;
}

5
Girdinin bu kadar katı olması gerekiyor mu? Yoksa hashtable / dictionary / array / etc'yi alabilir miyiz. Anadilde mi?
AdmBorkBork

2
Ayrıca, PPCG'ye hoş geldiniz!
AdmBorkBork

1
Ya iki sayı aynı ise? Her zaman benzersiz pozitif tamsayılar olacak mı?
David Conrad

1
Sayılar hakkında ne gibi garantiler var: hepsi pozitif mi yoksa en azından sıfır mı olacak? Dizeler ne olacak: hepsi boş değil mi?
Peter Taylor

1
Daha iyi bir başlık olabilir Generalized Fizz Buzz.
mbomb007

Yanıtlar:



4

JavaScript (ES6), 90 bayt

Öncü bir yeni satır oluşturur.

f=(a,i=a.pop())=>i?f(a,i-1)+`
`+(a.map((_,j)=>++j>a[0]|i%a[j*2-1]?'':a[j*2]).join``||i):''

Ölçek



1

C ++, 194 bayt

#include <iostream>
#define p std::cout<<
int main(int c,char**a){c=2*atoi(a[1])+2;int x,f,i,n=atoi(a[c]);for(x=1;x<=n;x++){f=0;for(i=2;i<c;i+=2)if(x%atoi(a[i])<1)f=1,p a[i+1];if(!f)p x;p'\n';}}

Ungolfed:

#include <iostream>

int main(int c, char **a) {
    c = 2 * atoi(a[1]) + 2;
    int x, f, i, n = atoi(a[c]);
    for (x = 1; x <= n; x++) {
        f = 0;
        for (i = 2; i < c; i += 2)
            if (x % atoi(a[i]) < 1) f = 1, std::cout << a[i+1];
        if (!f) std::cout << x;
        std::cout << '\n';
    }
}

1
Eğer sonuç x%atoi(a[i])negatif olamazsa, kontrol edin x%atoi(a[i])<1.
Yytsi

@TuukkaX İyi nokta, teşekkürler.
David Conrad

1
Ayrıca, yapabileceğinizden eminim p'\n':)
Yytsi

1

PHP, 99 bayt

Primo'nun FizzBuzz cevabına dayanarak : õchr (245), biraz tersine çevrilmiş yeni satır.

for(;$i++<($a=$argv)[$z=$argc-1];){for($k=$s="";$z>$k+=2;)$s.=[$a[$k+1]][$i%$a[$k]];echo$s?:$i,~õ;}

ilk argümanı yok sayar; ile çalıştırın -nr.


0

JavaScript (ES6), 105 97 bayt

g=(m,k,i=1)=>i<-~k?([...m.keys()].filter(j=>i%j<1).map(j=>m.get(j)).join``||i)+"\n"+g(m,k,i+1):""

M (tamsayı, dize) ve k tamsayı çiftlerinin haritasını alır . Sondaki satırsonu ile birlikte gelir.

İşte özyinelemeyen bir sürüm (105 bayt), ancak sondaki bir satırsonu vermez.

m=>k=>[...Array(k).keys()].map(x=>[...m.keys()].filter(j=>-~x%j<1).map(j=>m.get(j)).join``||x+1).join`\n`

Çevrimiçi deneyin!


0

Java, 331 bayt

Çünkü Java.

import java.util.*;class A{A(int c,String x){i=c;v=x;}int i;String v;void x(String[]x){ArrayList<A>l=new ArrayList();int n=0;for(;++n<x.length-1;)l.add(new A(Integer.valueOf(x[n++]),x[n]));n=Integer.valueOf(x[n]);for(int i=1;i++<n;){String o="";boolean y=1>0;for(A a:l)if(i%a.i==0){y=1<0;o+=a.v;}if(y)o+=i;System.out.println(o);}}}

Bunun için gereken tam sınıf budur. Ancak, çalıştırmak için, yöntemi var xolan bir örneğinde çağırmalısınız A. Test uğruna, aşağıda kısmen çözülmemiş bir komut satırı çalıştırılabilir sınıfı sağladım.

import java.util.*;
class A{
A(int c,String x){i=c;v=x;}
int i;
String v;
void x(String[]x){
ArrayList<A>l=new ArrayList();
int n=0;
for(;++n<x.length-1;)
l.add(new A(Integer.valueOf(x[n++]),x[n]));
n=Integer.valueOf(x[n]);
for(int i=1;i++<n;){
String o="";
boolean y=1>0;
for(A a:l)if(i%a.i==0){y=1<0;o+=a.v;}
if(y)o+=i;
System.out.println(o);
}
}
public static void main(String[] args) {
new A(0,"").x(args);
}
}


0

dc , 121 bayt

?dstsw?[rdlt:Y:Rlt1-dst0<q]dsqx?sb1sm[ln;Y;RnlP1+sP]ss[lmn]sF[1sn0sP[lnd;Ylmr%0=s1+dsnlw!<g]dsgxlP0=Flm1+dsm10Plb!<i]dsix

3 ayrı satırda giriş alır, ilk satır tamsayıyı içerir n, ikincisi int strtuplleri köşeli parantez ( []) içine alınmış dizelerle barındırır ve üçüncü satır tamsayıdan oluşur k. Örneğin, 3 2 Fizz 3 Buzz 5 Crackle 10şu şekilde girilebilir:

3
3 [Buzz] 2 [Fizz] 5 [Crackle]
10

Çevrimiçi deneyin!

Veya girişi farklı bir sırayla almak:

dc , 118 bayt

?dstsw[dlt:Y:Rlt1-dst0<q]dsqxsb1sm[ln;Y;RnlP1+sP]ss[lmn]sF[1sn0sP[lnd;Ylmr%0=s1+dsnlw!<g]dsgxlP0=Flm1+dsm10Plb!<i]dsix

Bu, girdiyi farklı bir sırada alır, ancak biçimdeki tek bir satıra alır

k [str1] int1 [str2] int2 (...) [strn] intn n

Örneğin, 3 2 Fizz 3 Buzz 5 Crackle 10şu şekilde girilir:

10 [Buzz] 3 [Fizz] 2 [Crackle] 5 3

Çevrimiçi deneyin!

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.