2012-05-16 15 views
7

Dla tych, którzy nie wiedzą, FizzBuzz jest następujący problem:FizzBuzz bez Operator AND

Napisz program, który drukuje numery od 1 do 100. Ale dla wielokrotności trzech print „Fizz” zamiast liczby i dla wielokrotności pięciu wydruków "Buzz". Dla liczb, które są wielokrotnościami , zarówno trzy jak i pięć drukują "FizzBuzz".

rozwiązanie Każdy FizzBuzz znajdę to albo jakiś szalony ezoteryczne rozwiązanie wykonane przez wzgląd na oryginalności, lub swojej podstawowej if-else łańcucha:

for(int i = 1; i <= 100; i++) { 

if(i % 3 == 0 && i % 5 == 0) { 
    System.out.println("FizzBuzz"); 
} else if (i % 3 == 0) { 
    System.out.println("Fizz"); 
} else if (i % 5 == 0) { 
    System.out.println("Buzz"); 
} else { 
    System.out.println(i); 
} 
} 

szukam proste rozwiązanie, które ma na celu wyciągnij "FizzBuzz", jeśli oświadczenie. Mam to na uwadze:

for(int i = 1; i <= 100; i++) { 

if (i % 3 == 0) 
    System.out.print("Fizz"); 
if (i % 5 == 0) 
    System.out.println("Buzz") 
else 
    System.out.println(i); 
} 

Ale to nie działa. Zakładam, że byłby on w stanie wydrukować FizzBuzz, wpisując oba ifs, dla Fizz i Buzz, ale jeśli liczba jest na przykład 3, to wydrukowałby Fizz3. Jak tego uniknąć?

+0

Ponieważ powinno to być "else if" zamiast twojego drugiego wyrażenia 'if';) –

+0

@ThomasJungblut Nie, ponieważ wtedy sprawa FizzBuzz nie będzie działać. –

+0

@ThomasJungblut, Nie chce połączyć Fizz i Buzza razem, więc celowo opuszcza pierwsze, jeśli. – Igor

Odpowiedz

9

Co ty próbujesz zrobić to

if (a) 
    ... 
if (b) 
    ... 
else // if neigther a nor b 
    ... 

To jest po prostu niemożliwe. Numer else może należeć tylko do pojedynczego if. Musisz iść z nieco dłuższym wariantem.

Aby uniknąć robi zbędnych oceny operatora modulo, można sformułować ciało pętli jako

boolean fizz = i % 3 == 0; 
boolean buzz = i % 5 == 0; 

if (fizz) 
    System.out.print("Fizz"); 
if (buzz) 
    System.out.print("Buzz"); 
if (!(fizz || buzz)) 
    System.out.print(i); 

System.out.println(); 

Kolejny byłoby

String result = ""; 

if (i % 3 == 0) result = "Fizz"; 
if (i % 5 == 0) result += "Buzz"; 
if (result == "") result += i; 

System.out.println(result); 
+1

Ah, ale ma w sobie '&&'. ;-) –

+0

Zmieniono według reguły demorgan ... czy to oszustwo? :-) btw, to prawdopodobnie należy do http://codegolf.stackexchange.com/ – aioobe

+1

Cóż, tylko żartowałem. Tylko tytuł wspomina wyraźnie operatora AND - myślę, że prawdziwym celem jest posiadanie tylko dwóch instrukcji if oraz sprawy liczbowej, którą zawiera twoje rozwiązanie. Również mieć +1. –

2

Jeśli jedynym celem jest, aby unikać &&, można użyć podwójną negację i prawa DeMorgan za:

for(int i = 1; i <= 100; i++) { 

    if(!(i % 3 != 0 || i % 5 != 0)) { 
     System.out.println("FizzBuzz"); 
    } else if (i % 3 == 0) { 
     System.out.println("Fizz"); 
    } else if (i % 5 == 0) { 
     System.out.println("Buzz"); 
    } else { 
     System.out.println(i); 
    } 
} 

Można uniknąć && wykorzystując fakt, że i % 3 == 0 i i % 5 == 0 implikuje i % 15 == 0, zgodnie RFC1337's answer.

Innym rozwiązaniem jest użycie switch na pozostałej (mod 15, który jest 5 razy 3):

for(int i = 1; i <= 100; i++) { 
    final int mod = i % 15; 
    switch (mod) { 
     case 0: 
     case 3: 
     case 6: 
     case 9: 
     case 12: 
      System.out.print("Fizz"); 
      if (mod != 0) break; 
     case 5: 
     case 10: 
      System.out.print("Buzz"); 
      break; 
     default: 
      System.out.print(i); 
    } 

    System.out.println(); 
} 
+0

po prostu zapisz i% 15 na górze zamiast dwukrotnie obliczać modulo. – ranman

+0

Dobry punkt @ranman, edytowany. –

+0

Czy występuje kara za wydajność polegająca na deklarowaniu zmiennej końcowej w kółko? Wydaje mi się, że pamiętam, że wpadłem w te lata i lata temu, ale nie mogę teraz znaleźć żadnego odniesienia do tego. – ranman

3

Twoje pierwsze jeśli stwierdzenie jest zupełnie sam.

Twój kod trafi pierwszą instrukcję, która jest TYLKO instrukcją if, a następnie przechodzi do następnej, która jest instrukcją if/else.

RosettaCode ma dobry przykład bez operatorów AND.

int i; 
    for (i = 0; i <= 100; i++) { 
      if ((i % 15) == 0) 
        cout << "FizzBuzz" << endl; 
      else if ((i % 3) == 0) 
        cout << "Fizz" << endl; 
      else if ((i % 5) == 0) 
        cout << "Buzz" << endl; 
      else 
        cout << i << endl; 
    } 
+0

Myślę, że intencją było ponowne użycie 'Fizz' podczas pisania' FizzBuzz'. – aioobe

+1

@aioobe Tak, i myślę, że można to łatwo zaadaptować z nieco większym zagnieżdżaniem warunków. Miałem zamiar zaproponować skrzynkę przełączników, ale [Platinum Azure] (http://stackoverflow.com/a/10620230/1397668) Już dostarczyłem przykład dla tego. – RFC1337

0

Wystarczy dodać zmienną flagi i używać System.out.print:

package com.stackoverflow; 

public class FizzBuzz { 
    public static void main(String[] args) { 
     for (int i = 1; i <= 100; i++) { 
      boolean printed = false; 
      if (i % 3 == 0) { 
       printed = true; 
       System.out.print("Fizz"); 
      } 
      if (i % 5 == 0) { 
       printed = true; 
       System.out.print("Buzz"); 
      } 

      if (printed) { 
       System.out.println(); 
      } else { 
       System.out.println(i); 
      } 
     } 
    } 
} 
0

To nie bierze się z if, ale nie korzysta z & (i) operator &, można przerzucać operatorów binarnych .

//FizzBuzz Case 
if(!(a % 3 != 0 || a % 5 != 0)){ //flips 
    result[index] = "FizzBuzz"; 
    index++; 
    } 
0

Szalony aczkolwiek niezwiązany rozwiązanie zrobione w Python3

#!/usr/bin/python3 

for i in range(1,100): 
    msg = "Fizz" * bool(i%3==0) 
    msg += "Buzz" * bool(i%5==0) 
    if not msg: 
     msg = i 
print(msg) 
0

Nie używaj if w ogóle.

import java.util.*; 
import java.lang.*; 
import java.io.*; 
class FizzBuzz 
{ 
    public static void main (String[] args) throws java.lang.Exception 
    { 
     String[] words = {"", "Fizz", "Buzz"}; 
     String[] nwords = {"", ""}; 

     for(int i = 1; i < 101; ++i) 
     { 
      int fp = (i % 3 == 0) ? 1 : 0; 
      int bp = ((i % 5 == 0) ? 1 : 0) * 2; 
      int np = ((fp > 0 || bp > 0) ? 1: 0); 

      nwords[0] = Integer.toString(i); 

      System.out.print(words[fp]); 
      System.out.print(words[bp]); 
      System.out.println(nwords[np]); 
     } 
    } 
} 

Zobacz na ideone.

+0

nie ważne coz (i% 3 == 0)? 1: 0 w rzeczywistości jest to stwierdzenie – maxormo

1

To jest moje rozwiązanie. To prawda, jest nieco zawiłe (jak na rondzie), ale uważam, że pasuje do twoich wymagań.

int main() 
{ 
    char fizzpass=0; 

    unsigned short index=0; 

    for(index=1;index<=100;index++) 
    { 
     if(0 == (index%3)) 
     { 
      printf("Fizz"); 
      fizzpass = 1; 
     } 

     if(0 == (index%5)) 
     { 
      if(1 == fizzpass) 
      {     
       fizzpass = 0; 
      } 

      printf("Buzz\n"); 
      continue; 
     } 

     if(1 == fizzpass) 
     { 
      fizzpass = 0; 
      printf("\n"); 
      continue; 
     } 

     printf("%d\n",index); 
    } 

    return 0; 
} 

Pozdrawiam.