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

11

Wir haben alle von dem alten Fizz Buzz-Problem gehört, aber was passiert, wenn Sie versuchen, es mit mehr Faktoren anzuwenden? Fizz Buzz Crackle Pop!

Die Herausforderung

Schreiben Sie ein vollständiges Programm , das eine Ganzzahl- Eingabe n , dann n Tupel mit einer Ganzzahl und einer Zeichenfolge und dann eine weitere Ganzzahl (> 1) k als solche verwendet:

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

Sie können diese Zeile entweder über die Befehlszeile oder über STDIN übernehmen.

Dann wird für alle ganzen Zahlen 1 bis k, wenn es von einem teilbaren INT1 , INT2 ... INTn , all entsprechenden Ausgang str s in der Eingabereihenfolge, gefolgt von einem Zeilenvorschub. Wenn dies nicht der Fall ist, geben Sie einfach die Ganzzahl gefolgt von einer neuen Zeile aus.

Zum Beispiel mit Eingabe

3 2 Fizz 3 Buzz 5 Crackle 10

wir bekommen

1
Fizz
Buzz
Fizz
Crackle
FizzBuzz
7
Fizz
Buzz
FizzCrackle

Aber mit Eingabe (beachten Sie die Auftragsänderung)

3 3 Buzz 2 Fizz 5 Crackle 10

wir bekommen

1
Fizz
Buzz
Fizz
Crackle
BuzzFizz
7
Fizz
Buzz
FizzCrackle

Optionaler nachfolgender Zeilenumbruch ist zulässig.

Der kürzeste Code in Bytes gewinnt.

Bearbeitungen:

Offensichtlich habe ich viel verpasst, sorry.

  • Eingaben von der Konsole und STDIN, alles andere erhält überall +5 Bytes (: c)
  • Vollständige Programme bitte.
  • Nehmen Sie nicht leere Zeichenfolgen für strs an
  • Keine Garantie für die Eindeutigkeit von Ints

Beispiel für ein C ++ - Programm (auf 20 begrenzt, weil ich faul bin):

#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
quelle
5
Muss die Eingabe so starr sein? Oder könnten wir eine Hashtabelle / ein Wörterbuch / ein Array / etc. im Muttersprache-Format?
AdmBorkBork
2
Willkommen auch bei PPCG!
AdmBorkBork
1
Was ist, wenn zwei der Zahlen gleich sind? Werden sie immer eindeutige positive ganze Zahlen sein?
David Conrad
1
Welche Garantien gibt es für die Zahlen: Werden sie alle positiv oder zumindest ungleich Null sein? Was ist mit den Saiten: Sind sie alle nicht leer?
Peter Taylor
1
Ein besserer Titel könnte sein Generalized Fizz Buzz.
mbomb007

Antworten:

4

JavaScript (ES6), 90 Byte

Erzeugt einen führenden Zeilenumbruch.

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

Prüfung

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

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';
    }
}
David Conrad
quelle
1
Wenn das Ergebnis von x%atoi(a[i])nicht negativ sein kann, überprüfen Sie es einfach x%atoi(a[i])<1.
Yytsi
@ TuukkaX Guter Punkt, danke.
David Conrad
1
Ich bin mir auch ziemlich sicher, dass du das kannst p'\n':)
Yytsi
1

PHP, 99 Bytes

Basierend auf der FizzBuzz-Antwort von primo : õist chr (245), eine etwas invertierte Newline.

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

ignoriert das erste Argument; laufen mit -nr.

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

Nimmt eine Karte von Paaren m (Ganzzahl, Zeichenfolge) und einer Ganzzahl k auf . Kommt mit einem nachgestellten Zeilenumbruch.

Hier ist eine nicht rekursive Version (105 Byte), die jedoch keinen nachgestellten Zeilenumbruch ergibt.

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

Probieren Sie es online aus!

Yytsi
quelle
0

Java, 331 Bytes

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

Dies ist die vollständige Klasse, die dafür erforderlich ist. Um es auszuführen, müssen Sie die Methode jedoch xfür eine vorhandene Instanz von aufrufen A. Zum Testen habe ich unten eine ausführbare Befehlszeilenklasse angegeben, die teilweise nicht golfed ist.

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

gestapelt , 85 Bytes

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

Probieren Sie es online aus! Alternativ 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
quelle
0

Gleichstrom , 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

Die Eingabe erfolgt in 3 separaten Zeilen, wobei die erste Zeile die Ganzzahl enthält n, die zweite die int strTupel mit den in eckigen Klammern ( []) eingeschlossenen Zeichenfolgen enthält und die dritte Zeile aus der Ganzzahl besteht k. Zum Beispiel 3 2 Fizz 3 Buzz 5 Crackle 10könnte eingegeben werden als:

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

Probieren Sie es online aus!

Oder Eingaben in einer anderen Reihenfolge vornehmen:

Gleichstrom , 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

Dies erfolgt in einer anderen Reihenfolge, jedoch in einer einzelnen Zeile im Format

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

Zum Beispiel 3 2 Fizz 3 Buzz 5 Crackle 10würde eingegeben werden als:

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

Probieren Sie es online aus!

R. Kap
quelle