Fizz Buzz .. Crackle Pop! (Zumbido generalizado de Fizz)

11

Todos hemos oído hablar del viejo problema de Fizz Buzz, pero ¿qué sucede cuando intentas aplicarlo con más factores? Fizz Buzz Crackle Pop!

El reto

Escriba un programa completo que tome una entrada entera n , luego n tuplas que contengan un entero y una cadena, luego otro entero (> 1) k, como tal:

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

Puede tomar esta línea desde la línea de comando o STDIN.

Entonces, para todos los números enteros 1 a k, si es divisible por cualquiera de INT1 , INT2 ... INTN , la salida de todo correspondiente str s en el orden de entrada, seguido de una nueva línea. Si no es así, simplemente genera el número entero, seguido de una nueva línea.

Por ejemplo, con entrada

3 2 Fizz 3 Buzz 5 Crackle 10

obtenemos

1
Fizz
Buzz
Fizz
Crackle
FizzBuzz
7
Fizz
Buzz
FizzCrackle

Pero con entrada (observe el cambio de orden)

3 3 Buzz 2 Fizz 5 Crackle 10

obtenemos

1
Fizz
Buzz
Fizz
Crackle
BuzzFizz
7
Fizz
Buzz
FizzCrackle

Nueva línea final opcional es aceptable.

El código más corto en bytes gana.

Ediciones:

Obviamente me he perdido mucho, lo siento.

  • Entradas de la consola y STDIN, cualquier otra cosa obtiene +5 bytes (: c) en cualquier lugar
  • Programas completos por favor.
  • Asumir cadenas no vacías para strs
  • No hay garantías para la unicidad de las entradas.

Programa de muestra C ++ (limitado a 20 porque soy vago):

#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
fuente
55
¿La entrada debe ser tan rígida? ¿O podríamos tomar una tabla hash / dictionary / array / etc. en el formato nativo del idioma?
AdmBorkBork
2
Además, bienvenido a PPCG!
AdmBorkBork
1
¿Qué pasa si dos de los números son iguales? ¿Serán siempre enteros positivos únicos?
David Conrad
1
¿Qué garantías hay sobre los números: serán todos positivos, o al menos distintos de cero? ¿Qué pasa con las cadenas: están todas no vacías?
Peter Taylor
1
Un mejor título podría ser Generalized Fizz Buzz.
mbomb007

Respuestas:

4

JavaScript (ES6), 90 bytes

Genera una nueva línea líder.

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

Prueba

Arnauld
fuente
1

C ++, 194 bytes

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

Sin golf:

#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
fuente
1
Si el resultado x%atoi(a[i])no puede ser negativo, simplemente verifique x%atoi(a[i])<1.
Yytsi
@ TuukkaX Buen punto, gracias.
David Conrad
1
Además, estoy bastante seguro de que puedes hacerlo p'\n':)
Yytsi
1

PHP, 99 bytes

Basado en la respuesta FizzBuzz de primo : ões chr (245), una nueva línea un poco invertida.

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

ignora el primer argumento; correr con -nr.

Titus
fuente
0

JavaScript (ES6), 105 97 bytes

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

Toma un mapa de pares m (entero, cadena) y un entero k . Viene con una nueva línea final.

Aquí hay una versión no recursiva (105 bytes), pero no produce una nueva línea final.

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

Pruébalo en línea!

Yytsi
fuente
0

Java, 331 bytes

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

Esta es la clase completa requerida para esto. Sin embargo, para ejecutarlo, debe llamar al método xen una instancia existente de A. En aras de las pruebas, he proporcionado una clase ejecutable de línea de comandos a continuación, que está parcialmente sin golf.

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
fuente
0

apilado , 85 bytes

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

Pruébalo en línea! Alternativamente, 86 bytes:

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

cc , 121 bytes

?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

Toma entrada en 3 líneas separadas, la primera línea que contiene el número entero n, la segunda que contiene las int strtuplas con las cadenas entre corchetes ( []), y la tercera línea consiste en el número entero k. Por ejemplo, 3 2 Fizz 3 Buzz 5 Crackle 10podría ingresarse como:

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

Pruébalo en línea!

O tomando la entrada en un orden diferente:

cc , 118 bytes

?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

Esto toma la entrada en un orden diferente, pero en una sola línea en el formato

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

Por ejemplo, 3 2 Fizz 3 Buzz 5 Crackle 10se ingresaría como:

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

Pruébalo en línea!

R. Kap
fuente