割算を使わないプログラムを追加
authorj8takagi <info@j8takagi.net>
Fri, 2 Nov 2012 10:48:42 +0000 (19:48 +0900)
committerj8takagi <info@j8takagi.net>
Fri, 2 Nov 2012 10:48:42 +0000 (19:48 +0900)
c/fizzbuzz2.c [new file with mode: 0644]
casl/fizzbuzz2.casl [new file with mode: 0644]
ruby/fizzbuzz2.rb [new file with mode: 0755]

diff --git a/c/fizzbuzz2.c b/c/fizzbuzz2.c
new file mode 100644 (file)
index 0000000..8a511f9
--- /dev/null
@@ -0,0 +1,29 @@
+#include <stdio.h>
+#include <assert.h>
+enum {
+    MIN = 1,
+    MAX = 100,
+    FIZZNUM = 3,
+    BUZZNUM = 5,
+};
+
+int main()
+{
+    assert(MIN <= FIZZNUM && MIN <= BUZZNUM);
+    int i, fizz, buzz;
+
+    for(i = fizz = buzz = MIN; i <= MAX; i++, fizz++, buzz++) {
+        fizz = (fizz == FIZZNUM) ? 0 : fizz;
+        buzz = (buzz == BUZZNUM) ? 0 : buzz;
+        if(fizz == 0 && buzz == 0) {
+            puts("FizzBuzz");
+        } else if(fizz == 0) {
+            puts("Fizz");
+        } else if(buzz == 0) {
+            puts("Buzz");
+        } else {
+            printf("%d\n", i);
+        }
+    }
+    return 0;
+}
diff --git a/casl/fizzbuzz2.casl b/casl/fizzbuzz2.casl
new file mode 100644 (file)
index 0000000..3e28fea
--- /dev/null
@@ -0,0 +1,43 @@
+MAIN    START
+        RPUSH
+        LD      GR1,MIN         ; GR1:カウンター。初期値はMIN
+        LD      GR2,MIN         ; GR2:Fizzカウンター。初期値はMIN
+        LD      GR3,MIN         ; GR3:Buzzカウンター。初期値はMIN
+        XOR     GR4,GR4         ; GR4:FizzBuzzフラグ。初期値は0
+SETFIZ  CPL     GR2,FIZNUM      ; GR2 = 3ではない場合、SETBUZへジャンプ
+        JNZ     SETBUZ          ; ↓
+        LAD     GR2,0           ; GR2 <- 0
+SETBUZ  CPL     GR3,BUZNUM      ; GR3 = 5ではない場合、PUTFBへジャンプ
+        JNZ     PUTFB           ; ↓
+        LAD     GR3,0           ; GR3 <- 0
+PUTFB   LD      GR4,GR2         ; GR4 <- GR2 or GR3
+        OR      GR4,GR3         ; ↓
+        JNZ     PUTFIZ          ; GR4が0ではない場合、GR2とGR4のどちらかが0ではないので、PUTFIZへジャンプ
+        OUT     FIZZ,FBLEN      ; 「FizzBuzz」を出力
+        JUMP    LOPEND          ; LOPENDへジャンプ
+PUTFIZ  LD      GR2,GR2         ; GR2が0ではない場合、PUTBUZへジャンプ
+        JNZ     PUTBUZ          ; ↓
+        OUT     FIZZ,FIZLEN     ; 「Fizz」を出力
+        JUMP    LOPEND          ; LOPENDへジャンプ
+PUTBUZ  LD      GR3,GR3         ; GR3が0ではない場合、PUTNUMへジャンプ
+        JNZ     PUTNUM          ; ↓
+        OUT     BUZZ,BUZLEN     ; 「Buzz」を出力
+        JUMP    LOPEND          ; LOPENDへジャンプ
+PUTNUM  CALL    OUTL            ; GR1の数値を表示
+LOPEND  CPL     GR1,MAX         ; GR1とMAXを比較
+        JZE     FIN             ; GR1 = MAX の場合、FINへジャンプ
+        LAD     GR1,1,GR1       ; GR1 <- GR1 + 1
+        LAD     GR2,1,GR2       ; GR2 <- GR2 + 1
+        LAD     GR3,1,GR3       ; GR3 <- GR3 + 1
+        JUMP    SETFIZ          ; SETFIZへジャンプ
+FIN     RPOP
+        RET
+MIN     DC      1               ; FIZZNUMとBUZNUMより小さい数値でなければならない
+MAX     DC      100
+FIZNUM  DC      3
+BUZNUM  DC      5
+FIZZ    DC      'Fizz'
+BUZZ    DC      'Buzz'
+FIZLEN  DC      4
+BUZLEN  DC      4
+FBLEN   DC      8
diff --git a/ruby/fizzbuzz2.rb b/ruby/fizzbuzz2.rb
new file mode 100755 (executable)
index 0000000..4023e8f
--- /dev/null
@@ -0,0 +1,21 @@
+#!/usr/local/bin/ruby
+
+min = 1
+max = 65535
+
+fizz = buzz = min
+for i in min..max
+  fizz = 0 if fizz == 3
+  buzz = 0 if buzz == 5
+  if fizz == 0 and buzz == 0
+    puts("FizzBuzz")
+  elsif fizz == 0
+    puts("Fizz")
+  elsif buzz == 0
+    puts("Buzz")
+  else
+    puts(i)
+  end
+  fizz += 1
+  buzz += 1
+end