Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
|---|---|
|Dart|[M3 Dart Quine](https://github.com/m3dev/crazy_programming/tree/main/quine/dart)|
|Go|[M3 Go Quine](https://github.com/m3dev/crazy_programming/tree/main/quine/go)|
|Java|[M3 Java 8 Quine](https://github.com/m3dev/crazy_programming/tree/main/quine/java)|
|Kotlin|[M3 Kotlin Quine](https://github.com/m3dev/crazy_programming/tree/main/quine/kotlin)|
|OCaml|[M3 OCaml Quine](https://github.com/m3dev/crazy_programming/tree/main/quine/ocaml)|
|Python|[M3 Python Quine](https://github.com/m3dev/crazy_programming/tree/main/quine/python)|
Expand Down
27 changes: 27 additions & 0 deletions quine/java/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# Java Quine

## M3 Java 8 Quine

Java 8で作成したQuine

昔、WebページにJavaアプレットで実装された電光掲示板が埋め込まれていた時代をイメージして作成しました。
ターミナル上でソースコードが横にスクロールしながら流れ続けます。

### 実行

コンパイルして実行してください。

```sh
javac quine_java8.java
java quine_java8
```

### 解説

ソースコード本体をBase64エンコードした文字列を20行の配列 `a[]` に分割して保持しています。

メインループでは、各行を1文字ずつ左にローテーション(先頭文字を末尾に移動)しながら、各行の同じオフセット位置から97文字を切り出して連結し、フレームごとの表示文字列を構築します。これにより、文字列が横にスクロールしているように見えます。

表示は `c()` メソッドが担当します。蓄積した文字列をBase64デコードし、`printf` でフォーマットすることで、配列 `a[]` の内容(=自身のソースコード)を埋め込んで出力します。`\033[H` でカーソルを左上に戻すことで、スクロールせずに同じ位置を上書き更新します。

出力結果を実行すると、再び同じ出力が得られます(Quineの性質)。
26 changes: 26 additions & 0 deletions quine/java/quine_java8.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
class quine_java8{public static void main(String[]args)throws Exception{System.out.print("\033[2J");
for(;;){int d=(a[0]+a[0]).indexOf("Y2");b="";for(int i=0;i<20;i++){b+=(a[i]+a[i]).substring(d,d+97);
a[i]=a[i].substring(1)+a[i].charAt(0);}c();Thread.sleep(0x33*3);}}static String b;static String[]a={
"Y2xhc3MgcXVpbmVfamF2YTh7cHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW11hcmdzKXRocm9 3cyBFeGNlcHRpb",
"257U3lzdG VtLm91dC5wcmludCgiXDAz M1sySiIpOwpmb3IoOz spe2ludCBkP",
"ShhWzBdK2Fb MF0pLmluZGV4T2YoIlkyI ik7Yj0iIjtmb3IoaW50 IGk9MDtpP",
"DIwO2krKyl7Yis 9KGFbaV0rYVtpXSkuc3 Vic3RyaW5nKGQsZCs5N yk7CmF baV09YVt",
"pXS5zdWJzdHJpb mcoMSkrYVtpXS5ja GFyQXQoMCk7fWMoKTtU aHJlYWQuc 2xlZXAoM",
"HgzMyozKTt9fXN 0YXRpYyBTdHJpbm cgYjtzdGF0aWMgU3RyaW5nW11hPXsKI iVzIn0KO",
"3N0YXRpYyB2b2l kIGMoKXRocm93 cyBFeGNlcHRpb257U3lzdGVtLm91dC5 wcmludGYo",
"IlwwMzNbSCIrbm V3IFN0cmluZy hqYXZhLnV0aWwuQmFzZTY0LmdldERl Y29kZXIoKQ",
"ouZGVjb2RlKGIu c mVwbGFjZUF sb CgiICIsIiIpLnNwbGl0KCI6Iil bKzBdLmdldEJ",
"5dGVzKCJVVEYtO CI pKSwiVVRG LTg iKSxTdHJpbmcuam9pbigiXC IsXG5cIiIs",
"YSkpO319Ci8vP T09P T09PT09 PT0 9PT09PT09PT09IFdlIGF yZSBoaXJ",
"pbmcgISEgOiBo dHRwc zovL 2pvY nMubTMuY29tL2VuZ2luZWVyLyA9PT 09PT09P",
"T09PT09PT09PT 09PT09 PT 09Ly8 K:Y2xhc3MgcXVpbmVfamF2YTh7cHVib GljIHN",
"0YXRpYyB2b2lk IG1haW4 o U3RyaW 5nW11hcmdzKXRocm93cyBFeGNlcHRpb2 57U3lz",
"dGVtLm91dC5w cmludCgi XDAzM1sy SiIpOwpmb3IoOzspe2ludCBkPShhWzB dK2FbM",
"F0pLmluZGV4T 2YoIlkyIi k7Yj0iIjt mb3IoaW50IGk9MDtpPDIwO2krKyl7Y is9KGF",
"baV0rYVtpXSk uc3Vic3Rya W5nKGQsZCs 5Nyk7CmFbaV09YVt pXS5zdWJzdH JpbmcoM",
"SkrYVtpXS5ja GFyQXQoMCk7 fWMoKTtUaHJ lYWQuc2xlZXAoMH gzMyozKTt9 fXN0YXRp",
"YyBTdHJ pbmcgYj tzdGF0a WMgU3RyaW5 nW11hPXsKI",
"iVzIn0K O3N0YXRp YyB2b2lk IGMoKXRocm93 cyBFeGNlcHRpb"}
;static void c()throws Exception{System.out.printf("\033[H"+new String(java.util.Base64.getDecoder()
.decode(b.replaceAll(" ","").split(":")[+0].getBytes("UTF-8")),"UTF-8"),String.join("\",\n\"",a));}}
//===================== We are hiring !! : https://jobs.m3.com/engineer/ =========================//