Problème FizzBuzz ceci et cela

"Comment identifier les futurs programmeurs qui ne peuvent pas écrire de code" (Wikipedia % 95% 8F% E9% A1% 8C))), mais quand vous voyez ces problèmes, il est courant de penser à quel point vous pouvez écrire dans différentes langues (biais), donc encore une fois. J'y ai pensé moi-même.

Pour Scheme

Si vous l'écrivez honnêtement, cela ressemble à ceci. Vérifiez auprès de 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))

Non, c'est trop simple, alors je l'ai réécrit.

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

Était-ce trop vif cette fois?

Pour Python

Tout d'abord, honnêtement.

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)

Réécrivons cela avec la colle dans le cas de Scheme.

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

Bien. Si vous pensez, Si vous utilisez la notation d'inclusion de liste, vous n'avez besoin que d'une seule ligne?

Pour Prolog

Vérifiez avec SWI-Prolog et GNU Prolog. Je me demande si la combinaison entre et échec est une mauvaise idée.

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).

Pour C

Une version simple pour le moment.

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

Réécrit à l'aide de l'opérateur ternaire. Ce n'est pas utilisé comme opérateur, mais c'est un peu plus court.

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

Considération

Si vous générez une séquence de nombres de 1 à 100 et appliquez un traitement à chaque élément, ou si vous pouvez écrire plusieurs expressions de jugement sur une seule ligne, il semble que vous puissiez créer un code court et simple.

Recommended Posts

Problème FizzBuzz ceci et cela
Le problème des menteurs et de l'honnêteté
Le problème des menteurs et de l'honnêteté
Avec les types de données algébriques et FizzBuzz
Combinaison de problèmes typiques d'optimisation et comment le faire