Fizz Buzz .. Crackle Pop! (Fizz Buzz Umum)

11

Kita semua pernah mendengar tentang masalah Fizz Buzz, tetapi apa yang terjadi ketika Anda mencoba menerapkannya dengan lebih banyak faktor? Fizz Buzz Crackle Pop!

Tantangan

Tulis program lengkap yang mengambil input integer n , lalu n tupel yang berisi integer dan string, lalu integer lain (> 1) k, dengan demikian:

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

Anda dapat mengambil baris ini dari baris perintah atau STDIN.

Kemudian, untuk semua bilangan bulat 1 hingga k, jika itu dapat dibagi oleh salah satu dari int1 , int2 ... intn , output semua str yang sesuai dalam urutan input, diikuti oleh baris baru. Jika tidak, maka cukup output integer, diikuti oleh baris baru.

Misalnya dengan input

3 2 Fizz 3 Buzz 5 Crackle 10

kita mendapatkan

1
Fizz
Buzz
Fizz
Crackle
FizzBuzz
7
Fizz
Buzz
FizzCrackle

Tetapi dengan input (perhatikan perubahan pesanan)

3 3 Buzz 2 Fizz 5 Crackle 10

kita mendapatkan

1
Fizz
Buzz
Fizz
Crackle
BuzzFizz
7
Fizz
Buzz
FizzCrackle

Newline tambahan opsional dapat diterima.

Kode terpendek dalam byte menang.

Suntingan:

Jelas saya sangat ketinggalan, maaf.

  • Input dari konsol dan STDIN, yang lainnya mendapat +5 byte (: c) di mana saja
  • Program lengkap, silakan.
  • Asumsikan string tidak kosong untuk strs
  • Tidak ada jaminan untuk keunikan int

Contoh program C ++ (terbatas pada 20 karena saya malas):

#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;
}
Thunda
sumber
5
Apakah input harus kaku? Atau bisa kita ambil dalam hashtable / dictionary / array / etc. dalam format asli bahasa?
AdmBorkBork
2
Juga, selamat datang di PPCG!
AdmBorkBork
1
Bagaimana jika dua angka itu sama? Akankah mereka selalu menjadi bilangan bulat positif unik?
David Conrad
1
Apa jaminan yang ada tentang angka-angkanya: apakah semuanya positif, atau setidaknya tidak nol? Bagaimana dengan string: apakah semuanya tidak kosong?
Peter Taylor
1
Judul yang lebih baik mungkin Generalized Fizz Buzz.
mbomb007

Jawaban:

4

JavaScript (ES6), 90 byte

Menghasilkan baris baru terkemuka.

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):''

Uji

Arnauld
sumber
2

Python 2 , 98 byte

lambda b:[''.join(''if x%b[1+i*2]else b[2+i*2]for i in range(b[0]))or`x`for x in range(1,b[-1]+1)]

Cobalah online!

tongkat
sumber
1

C ++, 194 byte

#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';}}

Tidak Disatukan:

#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';
    }
}
David Conrad
sumber
1
Jika hasilnya x%atoi(a[i])tidak bisa negatif, maka cukup periksa x%atoi(a[i])<1.
Yytsi
@ TuukkaX Poin bagus, terima kasih.
David Conrad
1
Juga, saya yakin Anda bisa melakukannya p'\n':)
Yytsi
1

PHP, 99 byte

Berdasarkan pada jawaban FizzBuzz primo : õis chr (245), baris baru sedikit terbalik.

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

mengabaikan argumen pertama; jalankan bersama -nr.

Titus
sumber
0

JavaScript (ES6), 105 97 byte

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):""

Mengambil dalam peta pasangan m (integer, string) dan integer k . Hadir dengan baris baru yang tertinggal.

Berikut adalah versi non-rekursif (105 byte), tetapi tidak menghasilkan baris tambahan.

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

Cobalah online!

Yytsi
sumber
0

Java, 331 byte

Karena jawa

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);}}}

Ini adalah kelas penuh yang diperlukan untuk ini. Namun, untuk menjalankannya, Anda harus memanggil metode xpada instance yang ada A. Demi pengujian, saya telah menyediakan kelas runnable command-line di bawah ini, yang sebagian tidak dipisahkan.

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);
}
}
Addison Crump
sumber
0

ditumpuk , 85 byte

args rev...2*nsgroup rev 2 chunk@s~>{!s[1#]map s[0#n|]map keep''join:[n]\¬if out}map

Cobalah online! Atau, 86 byte:

args behead...@k sgroup 2 chunk@s k~>{!s[1#]map s[0#n|]map keep''join:[n]\¬if out}map
Conor O'Brien
sumber
0

dc , 121 byte

?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

Mengambil input pada 3 baris terpisah, baris pertama berisi bilangan bulat n, yang kedua menampung int strtupel dengan string yang terlampir dalam tanda kurung siku ( []), dan baris ketiga terdiri dari bilangan bulat k. Misalnya, 3 2 Fizz 3 Buzz 5 Crackle 10bisa dimasukkan sebagai:

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

Cobalah online!

Atau mengambil input dalam urutan berbeda:

dc , 118 byte

?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

Ini membutuhkan input dalam urutan yang berbeda, tetapi pada satu baris dalam format

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

Misalnya, 3 2 Fizz 3 Buzz 5 Crackle 10akan dimasukkan sebagai:

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

Cobalah online!

R. Kap
sumber