嘶嘶声。(通用的Fizz Buzz)


11

我们都听说过Fizz Buzz问题,但是当您尝试将其应用到更多因素时会发生什么呢?嘶嘶声嗡嗡声爆裂!

挑战

编写一个完整的程序,该程序接受一个整数输入n,然后是包含一个整数和一个字符串的n个元组,然后是另一个整数(> 1)k,如下所示:

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

您可以从命令行或STDIN接受此行。

然后,对于所有1到k的整数,如果它可以被int1int2 ... intn中的任何一个整除,则按输入顺序输出所有对应的str,后跟换行符。如果不是,则只输出整数,然后输出换行符。

例如,输入

3 2 Fizz 3 Buzz 5 Crackle 10

我们得到

1
Fizz
Buzz
Fizz
Crackle
FizzBuzz
7
Fizz
Buzz
FizzCrackle

但是有输入(请注意顺序更改)

3 3 Buzz 2 Fizz 5 Crackle 10

我们得到

1
Fizz
Buzz
Fizz
Crackle
BuzzFizz
7
Fizz
Buzz
FizzCrackle

可选的尾随换行符是可以接受的。

以字节为单位的最短代码获胜。

编辑:

显然,我错过了很多,抱歉。

  • 来自控制台和STDIN的输入,其他任何地方均可获得+5字节(:c)
  • 请完整的程序。
  • 假定str的非空字符串
  • 不保证整数的唯一性

示例C ++程序(由于懒惰,限制为20):

#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
输入是否需要如此严格?或者我们可以接受一个hashtable / dictionary / array / etc。语言的本机格式?
AdmBorkBork

2
另外,欢迎来到PPCG!
AdmBorkBork'2

1
如果两个数字相同怎么办?它们将始终是唯一的正整数吗?
戴维·康拉德

1
这些数字有什么保证:它们都是正数还是至少非零数?字符串呢:它们都是非空的吗?
彼得·泰勒

1
更好的标题可能是Generalized Fizz Buzz
mbomb007

Answers:



4

JavaScript(ES6),90个字节

产生一个领先的换行符。

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

测试



1

C ++,194个字节

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

取消高尔夫:

#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
如果的结果x%atoi(a[i])不能为负,则检查x%atoi(a[i])<1
Yytsi'2

@TuukkaX好点,谢谢。
大卫·康拉德

1
另外,我非常确定您可以做到p'\n':)
Yytsi

1

PHP,99字节

基于primo的FizzBu​​zz答案õchr(245),有点换行符。

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

忽略第一个参数;与运行-nr


0

JavaScript(ES6),105 97字节

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(整数,字符串)和一个整数k。带有尾随换行符。

这是非递归版本(105字节),但不会产生尾随换行符。

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

在线尝试!


0

Java,331字节

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

这是为此所需的完整课程。但是,要运行它,您必须x在的现有实例上调用方法A。为了进行测试,我在下面提供了一个命令行可运行类,部分未使用。

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

堆积,85字节

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

在线尝试!或者,86个字节:

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

0

直流,121字节

?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条单独的行上接受输入,第一行包含整数n,第二行容纳int str元组,字符串括在方括号([])中,第三行包含整数k。例如,3 2 Fizz 3 Buzz 5 Crackle 10可以输入为:

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

在线尝试!

或以其他顺序输入:

直流电,118字节

?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

这将以不同顺序输入,但格式为一行

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

例如,3 2 Fizz 3 Buzz 5 Crackle 10将输入为:

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

在线尝试!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.