Fizz Buzz .. Crackle Pop! (Fizz Buzz généralisé)

11

Nous avons tous entendu parler du problème de Ol 'Fizz Buzz, mais que se passe-t-il lorsque vous essayez de l'appliquer avec plus de facteurs? Fizz Buzz Crackle Pop!

Le défi

Écrivez un programme complet qui prend une entrée entière n , puis n tuples contenant un entier et une chaîne, puis un autre entier (> 1) k, comme tel:

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

Vous pouvez prendre cette ligne à partir de la ligne de commande ou de STDIN.

Ensuite, pour tous les entiers 1 à k, s'il est divisible par l'un de int1 , int2 ... intn , sortez toutes les str correspondantes dans l'ordre d'entrée, suivi d'une nouvelle ligne. Si ce n'est pas le cas, sortez simplement l'entier, suivi d'une nouvelle ligne.

Par exemple, avec entrée

3 2 Fizz 3 Buzz 5 Crackle 10

on a

1
Fizz
Buzz
Fizz
Crackle
FizzBuzz
7
Fizz
Buzz
FizzCrackle

Mais avec entrée (notez le changement de commande)

3 3 Buzz 2 Fizz 5 Crackle 10

on a

1
Fizz
Buzz
Fizz
Crackle
BuzzFizz
7
Fizz
Buzz
FizzCrackle

Un retour à la ligne facultatif est acceptable.

Le code le plus court en octets gagne.

Modifications:

Évidemment, j'ai raté beaucoup de choses, désolé.

  • Entrées depuis la console et STDIN, tout le reste obtient +5 octets (: c) n'importe où
  • Programmes complets s'il vous plaît.
  • Supposons des chaînes non vides pour les chaînes
  • Aucune garantie pour l'unicité des pouces

Exemple de programme C ++ (limité à 20 parce que je suis paresseux):

#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
la source
5
L'entrée doit-elle être si rigide? Ou pourrions-nous prendre une table de hachage / dictionnaire / tableau / etc. au format natif de la langue?
AdmBorkBork
2
Bienvenue également à PPCG!
AdmBorkBork
1
Et si deux des nombres sont identiques? Seront-ils toujours des entiers positifs uniques?
David Conrad
1
Quelles garanties y a-t-il sur les chiffres: seront-ils tous positifs ou du moins non nuls? Et les cordes: sont-elles toutes non vides?
Peter Taylor
1
Un meilleur titre pourrait être Generalized Fizz Buzz.
mbomb007

Réponses:

4

JavaScript (ES6), 90 octets

Génère une nouvelle ligne de premier plan.

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

Tester

Arnauld
la source
1

C ++, 194 octets

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

Non 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
la source
1
Si le résultat de x%atoi(a[i])ne peut pas être négatif, vérifiez simplement x%atoi(a[i])<1.
Yytsi
@TuukkaX Bon point, merci.
David Conrad
1
En outre, je suis sûr que vous pouvez le faire p'\n':)
Yytsi
1

PHP, 99 octets

Basé sur la réponse FizzBuzz de primo : õest chr (245), un retour à la ligne un peu inversé.

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

ignore le premier argument; courir avec -nr.

Titus
la source
0

JavaScript (ES6), 105 97 octets

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

Prend une carte des paires m (entier, chaîne) et un entier k . Livré avec une nouvelle ligne de fin.

Voici une version non récursive (105 octets), mais ne produit pas de nouvelle ligne de fin.

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

Essayez-le en ligne!

Yytsi
la source
0

Java, 331 octets

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

Il s'agit de la classe complète requise pour cela. Cependant, pour l'exécuter, vous devez appeler la méthode xsur une instance existante de A. Pour des raisons de test, j'ai fourni ci-dessous une classe exécutable en ligne de commande, qui n'est pas entièrement golfée.

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
la source
0

empilé , 85 octets

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

Essayez-le en ligne! Alternativement, 86 octets:

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

dc , 121 octets

?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

Prend l'entrée sur 3 lignes distinctes, la première ligne contenant l'entier n, la seconde abritant les int strtuples avec les chaînes entre crochets ([] ), et la troisième ligne se compose de l'entier k. Par exemple, 3 2 Fizz 3 Buzz 5 Crackle 10pourrait être entré comme:

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

Essayez-le en ligne!

Ou en prenant les informations dans un ordre différent:

dc , 118 octets

?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

Cela prend l'entrée dans un ordre différent, mais sur une seule ligne au format

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

Par exemple, 3 2 Fizz 3 Buzz 5 Crackle 10serait entré comme:

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

Essayez-le en ligne!

R. Kap
la source