[PYTHON] FizzBuzz Problem dies und das

"So identifizieren Sie aufstrebende Programmierer, die keinen Code schreiben können" (Wikipedia % 95% 8F% E9% A1% 8C)))) ist ein FizzBuzz-Problem, aber wenn Sie ein solches Problem sehen, ist es in der Welt üblich, darüber nachzudenken, wie kurz und einfach es in verschiedenen Sprachen geschrieben werden kann (Bias). Ich habe selbst darüber nachgedacht.

Für Schema

Wenn Sie es ehrlich schreiben, sieht es so aus. Wenden Sie sich an Gauche.

fizzbuzz1.scm


(define FizzBuzz 
  (lambda (n)
    (let loop ((x 1) (r '()))
      (cond ((> x n) (reverse r))
            ((and (zero? (modulo x 3)) (zero? (modulo x 5)))
             (loop (+ x 1) (cons 'FizzBuzz r)))
            ((zero? (modulo x 3))
             (loop (+ x 1) (cons 'Fizz r)))
            ((zero? (modulo x 5))
             (loop (+ x 1) (cons 'Buzz r)))
            (else
             (loop (+ x 1) (cons x r)))))))

(display (FizzBuzz 100))

Nein, es ist zu einfach, also habe ich es umgeschrieben.

fizzbuzz2.scm


(define (ch x)
  (define (p? n) (zero? (modulo x n)))
  (cond ((p? 15) 'FizzBuzz) ((p? 3) 'Fizz) ((p? 5) 'Buzz) (else x)))
(display (map ch (cdr (iota 101))))

War es diesmal zu scharf?

Für Python

Zuallererst ehrlich.

fizzbuzz1.py


def FizzBuzz(n):
  for x in range(1, n+1):
    if x % 3 == 0 and x % 5 == 0:
      print('FizzBuzz')
    elif x % 3 == 0:
      print('Fizz')
    elif x % 5 == 0:
      print('Buzz')
    else:
      print(x)

FizzBuzz(100)

Lassen Sie uns dies im Fall von Schema mit dem Kleber umschreiben.

fizzbuzz2.py


def ch(x):
  def p(n):
    return (x % n == 0)
  return ('FizzBuzz' if p(15) else 'Fizz' if p(3) else 'Buzz' if p(5) else x)

print(list(map(ch, range(1,101))))

In Ordung. Wenn Sie denken: Wenn Sie die Listeneinschlussnotation verwenden, benötigen Sie nur eine Zeile?

Für Prolog

Wenden Sie sich an SWI-Prolog und GNU Prolog. Ich frage mich, ob die Kombination von zwischen und scheitern eine schlechte Idee ist.

fizzbuzz.pl


fb(X,'FizzBuzz') :- X mod 15 =:= 0, !.
fb(X,'Fizz')     :- X mod  3 =:= 0, !.
fb(X,'Buzz')     :- X mod  5 =:= 0, !.
fb(X,X).
fizzbuzz(N) :- between(1,N,X), fb(X,R), write(R), write(' '), fail.

% ?- fizzbuzz(100).

Für C.

Eine vorerst unkomplizierte Version.

fizzbuzz1.c


#include <stdio.h>

int main(void)
{
  for (int n = 1; n <= 100; n++)
    if (n % 3 == 0 && n % 5 == 0) printf("FizzBuzz ");
    else if (n % 3 == 0) printf("Fizz ");
    else if (n % 5 == 0) printf("Buzz ");
    else printf("%d ", n);
  return (0);
}

Mit dem ternären Operator neu geschrieben. Es wird nicht als Operator verwendet, ist aber etwas kürzer.

fizzbuzz2.c


#include <stdio.h>

int main(void)
{
  for (int n = 1; n <= 100; n++)
    n % 3 == 0 && n % 5 == 0 ? printf("FizzBuzz ") :
    n % 3 == 0 ? printf("Fizz ") :
    n % 5 == 0 ? printf("Buzz ") :
    printf("%d ", n);
  return (0);
}

Erwägung

Wenn Sie eine Folge von Zahlen von 1 bis 100 generieren und die Verarbeitung auf jedes Element anwenden oder wenn Sie mehrere Beurteilungsausdrücke in eine Zeile schreiben können, können Sie anscheinend einen kurzen und einfachen Code erstellen.

Recommended Posts

FizzBuzz Problem dies und das
Das Problem der Lügner und der Ehrlichkeit
Das Problem der Lügner und der Ehrlichkeit
Mit algebraischen Datentypen und FizzBuzz
Kombinationsoptimierungstypische Probleme und wie es geht