そういや昔、思い付きで書いたけど公開してなかったので。
FizzBuzzナシナシです。
FizzBuzz.java
class FizzBuzz {
public static void main(String... args) {
Link start;
Link link = start = new Link(new N()); // 1
link.setNext(link = new Link(new N())); // 2
link.setNext(link = new Link(new F())); // 3
link.setNext(link = new Link(new N())); // 4
link.setNext(link = new Link(new B())); // 5
link.setNext(link = new Link(new F())); // 6
link.setNext(link = new Link(new N())); // 7
link.setNext(link = new Link(new N())); // 8
link.setNext(link = new Link(new F())); // 9
link.setNext(link = new Link(new B())); // 10
link.setNext(link = new Link(new N())); // 11
link.setNext(link = new Link(new F())); // 12
link.setNext(link = new Link(new N())); // 13
link.setNext(link = new Link(new N())); // 14
link.setNext(link = new Link(new FB())); // 15
link.setNext(start);
loop(start, 1);
}
public static void loop(Link link, int i) {
link.getProc().proc(i);
new Flow[]{new Loop(), new Loop(), new Loop(), new Stop()}[String.valueOf(i).length()].flow(link.getNext(), i + 1);
}
static class Link {
Proc proc;
Link next;
public Link(Proc proc) {
this.proc = proc;
}
public Proc getProc() {
return this.proc;
}
public Link getNext() {
return this.next;
}
public void setNext(Link next) {
this.next = next;
}
}
static interface Proc {
void proc(int i);
}
static class N implements Proc {
public void proc(int i) {
System.out.println(i);
}
}
static class F implements Proc {
public void proc(int i) {
System.out.println("Fizz");
}
}
static class B implements Proc {
public void proc(int i) {
System.out.println("Buzz");
}
}
static class FB implements Proc {
public void proc(int i) {
System.out.println("FizzBuzz");
}
}
static interface Flow {
void flow(Link link, int i);
}
static class Loop implements Flow {
public void flow(Link link, int i) {
loop(link, i);
}
}
static class Stop implements Flow {
public void flow(Link link, int i) {
}
}
}
出力が15周期になることを無限リンクリストで表現したり、100
で停止するようにするために現在のループ回数を文字列に変換して、3文字になったところで停めるようにしています。
みなさんはこんなヒドいJavaは書かないでくださいね。