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


11

Abbiamo tutti sentito parlare del vecchio problema di Fizz Buzz, ma cosa succede quando provi ad applicarlo con più fattori? Fizz Buzz Crackle Pop!

La sfida

Scrivi un programma completo che accetta un input intero n , quindi n tuple contenenti un numero intero e una stringa, quindi un altro numero intero (> 1) k, come tale:

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

Puoi prendere questa linea da riga di comando o STDIN.

Quindi, per tutti i numeri interi da 1 a k, se è divisibile per uno qualsiasi di int1 , int2 ... intn , genera tutte le str corrispondenti nell'ordine di input, seguito da una nuova riga. In caso contrario, emettere semplicemente il numero intero, seguito da una nuova riga.

Ad esempio, con input

3 2 Fizz 3 Buzz 5 Crackle 10

noi abbiamo

1
Fizz
Buzz
Fizz
Crackle
FizzBuzz
7
Fizz
Buzz
FizzCrackle

Ma con input (nota la modifica dell'ordine)

3 3 Buzz 2 Fizz 5 Crackle 10

noi abbiamo

1
Fizz
Buzz
Fizz
Crackle
BuzzFizz
7
Fizz
Buzz
FizzCrackle

La nuova riga finale facoltativa è accettabile.

Vince il codice più breve in byte.

modifiche:

Ovviamente mi sono perso molto, scusa.

  • Input da console e STDIN, qualsiasi altra cosa ottiene +5 byte (: c) ovunque
  • Programmi completi per favore.
  • Supponiamo stringhe non vuote per le stringhe
  • Nessuna garanzia per l'unicità degli ints

Esempio di programma C ++ (limitato a 20 perché sono pigro):

#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
L'input deve essere così rigido? O potremmo prendere in un hashtable / dizionario / array / ecc. nel formato nativo della lingua?
AdmBorkBork,

2
Inoltre, benvenuto in PPCG!
AdmBorkBork,

1
Cosa succede se due dei numeri sono uguali? Saranno sempre numeri interi positivi unici?
David Conrad,

1
Quali garanzie ci sono sui numeri: saranno tutti positivi o almeno diversi da zero? Che dire delle stringhe: sono tutte non vuote?
Peter Taylor,

1
Un titolo migliore potrebbe essere Generalized Fizz Buzz.
mbomb007,

Risposte:



4

JavaScript (ES6), 90 byte

Genera una nuova linea principale.

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

Test



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

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
Se il risultato di x%atoi(a[i])non può essere negativo, basta controllare x%atoi(a[i])<1.
Yytsi,

@TuukkaX Ottimo punto, grazie.
David Conrad,

1
Inoltre, sono abbastanza sicuro che puoi farlo p'\n':)
Yytsi,

1

PHP, 99 byte

Basato sulla risposta FizzBuzz di primo : õis chr (245), un po 'invertito newline.

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

ignora il primo argomento; corri con -nr.


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

Comprende una mappa di coppie m (intero, stringa) e un intero k . Viene fornito con una nuova riga finale.

Ecco una versione non ricorsiva (105 byte), ma non produce una nuova riga finale.

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

Provalo online!


0

Java, 331 byte

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

Questa è la classe completa richiesta per questo. Tuttavia, per eseguirlo, è necessario chiamare il metodo xsu un'istanza esistente di A. Per motivi di test, ho fornito una classe eseguibile dalla riga di comando di seguito, che è parzialmente non giocata.

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

impilato , 85 byte

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

Provalo online! In alternativa, 86 byte:

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

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

Accetta input su 3 righe separate, la prima contiene l'intero n, la seconda ospita le int strtuple con le stringhe racchiuse tra parentesi quadre ( []) e la terza riga è costituita dall'intero k. Ad esempio, 3 2 Fizz 3 Buzz 5 Crackle 10potrebbe essere inserito come:

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

Provalo online!

O prendendo input in un ordine diverso:

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

Ciò accetta input in un ordine diverso, ma su una sola riga nel formato

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

Ad esempio, 3 2 Fizz 3 Buzz 5 Crackle 10verrebbe inserito come:

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

Provalo online!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.