強いエンジニアにHelloWorldさせてみた(縛りあり)

# 縛りプログラミング

こんにちは、LIFULL HOME'S事業本部 技術開発部の宮崎です。
これは[LIFULL その2 Advent Calendar](https://qiita.com/advent-calendar/2017/lifull2)の8日目の投稿になります。
ついでに[LIFULL Advent Calendar](https://qiita.com/advent-calendar/2017/lifull)もよければご覧下さい。

## 縛りプログラミングとは
今回の記事は、僕がConfluenceの記事で出したある問題の解答集となります。
その問題が以下のとおりです。

```
ソースコードにダブルクォート、シングルクォート、数字を書くこと無く、「LIFULL」と出力して下さい。
最後に改行を付けること。
言語は問いません。
```
完全にHelloWorldですね。このHelloWorldを幾つかの縛りを設けて解いてみろ！という感じです。
この記事を見た方もどのような方法があるかぜひ考えてみて下さい。

幾つかは自分で実行の環境を~~用意するのがめんどくさかった~~用意できなかったので、動作確認できていないものがあります。

## 分類
どういう方法を用いたか大まかに分類してみることにします。
全ての解答は最後にまとめます。

### 異なるリテラルで文字列を表現
rubyの%qやヒアドキュメント、幾つかの言語では`を使うことで文字列を表現することができます。
また、PHPでは、PHPタグを使わないことで、直接文字列として認識させることもできるようです。

```rb:解答例
puts %q(LIFULL)
```


### 関数名やクラス名を文字列表現
スクリプト言語では、比較的簡単に関数名やクラス名を取得することができるので、その特徴を上手く活かしている解答です。

```js:解答例
console.log((LIFULL = () =>{}).name)
```

### 実行時に頑張る
**ソースコードに**というのがレギュレーションなので、上手く穴を突いた解答です。

実行時の引数や、環境変数、ワンライナーでの解答がありました。

```shell-session:解答例
$ cat lifull.sh
#!/bin/bash
echo $VAR
$ VAR="LIFULL" ./lifull.sh
```

### ASCIIコードで頑張る
そもそも文字はコンピューター内部では数字として保存されているようなものなので、数字を作ることができれば文字列を表示することができます。
問題はどうやって数字を作るかです。
解答の中では以下の様なものがありました。

- 行番号を使う
- 割り算する
- 用意されている定数を使う
- 言語特有のハックを使う（js,perl)

```java:解答例
import java.awt.event.KeyEvent;

public class Lifull {
    public static void main(String[] args) {
        byte[] codes = new byte[]{KeyEvent.VK_L, KeyEvent.VK_I, KeyEvent.VK_F, KeyEvent.VK_U, KeyEvent.VK_L, KeyEvent.VK_L};
        System.out.printf(new String(codes) + System.lineSeparator());
    }
}
```

### webページから文字列を取得する
LIFULLという文字が入っているページから文字列を取得し、頑張って数字を作れば文字列が抽出できます。

```php:解答例
  1 <?php
  2 $url = <<<EOF
  3 http://toushi.homes.co.jp/
  4 EOF;
  5
  6 $num = __LINE__;
 
<略>
 
480
481 $start = __LINE__;
482 $lifull = substr(file_get_contents($url),$start,$num);
483 print($lifull);
484 ?>
485
```

## まとめ
今回この問題を作るにあたって僕が考えていた解答は ASCIIコードで頑張る でした。そこで数字を作る方法も割り算じゃなくて、ビット演算でした。しかも言語はCです。
その解答しか頭になかったのでいろんな言語で色んな方法を見て、言われてみれば当たり前だけど、頭が固くて気づいてなかったなぁと思いました。精進したい💪💪💪💪💪

それはそれとして、出した問題に対して反応が貰えるととても嬉しいです。仕事に関しても周りを巻き込めるようになると仕事ももっと面白くなるんだろうなぁと思います。

こういう解答もあるよ！！！！
という方はコメントをお願いします🙏🙏🙏

## 全回答

### 解答1
```rb:lifull.rb
puts %q(LIFULL)
```

### 解答2
```py:lifull.py
class LIFULL: pass
print(LIFULL.__name__)
```

### 解答3
```py:lifull.py
try:
    LIFULL
except NameError as e:
    a = str(e)
 
try:
    XXXXXX
except NameError as e:
    b = str(e)
print(str().join(x for x, y in zip(a, b) if x != y))
```

### 解答4
```js:lifull.js
var s = `LIFULL\n`;
console.log(s);
```


### 解答5
```php:lifull.php
<?php
echo <<<EOF
LIFULL\n
EOF;
```

### 解答6
```php:lifull.php
LIFULL
```

### 解答7
```php:lifull.php
<?php eval($argv[__LINE__]);
```
```bash:実行方法
php ans.php "echo \"LIFULL\n\";"
```

### 解答8
```php:lifull.php
<?php
 
 
 
 
function LIFULL(){ error_log((__FUNCTION__), __LINE__);  }
LIFULL();
```

### 解答9
```bash:lifull.sh
#!/bin/bash
echo LIFULL
```

### 解答10
```shell-session
$ echo LIFULL
```

### 解答11
```js:lifull.js
console.log(((![]+[])[+!![] + +!![]]+([][+!![]]+[])[+!![] + +!![] + +!![] + +!![] + +!![]]+([][+[]]+[])[+!![] + +!![] + +!![] + +!![]]+([][+[]]+[])[+[]]+(![]+[])[+!![] + +!![]]+(![]+[])[+!![] + +!![]]).toUpperCase());
```

### 解答12
```js:lifull.js
console.log((LIFULL = () =>{}).name)
```

### 解答13
```r:lifull.R
v <- deparse(quote(`LIFULL\n`))
cat(v)
```
<font color="Red">動作未確認</font>

### 解答14
```r:lifull.R
one <- pi/pi
two <- floor(pi) - one
three <- ceiling(pi) - one
 
six <- two * three
seven <- six + one
nine <- three * three
twelve <- three * two * two
twentyone <- three * seven
 
newline <- deparse(quote(`\n`))
 
v <- c(LETTERS[c(twelve,nine,six,twentyone,twelve,twelve)], newline)
 
s <- character(one)
 
cat(v, sep=s)
```
<font color="Red">動作未確認</font>

### 解答15
```php:lifull.php
  1 <?php
  2 $url = <<<EOF
  3 http://toushi.homes.co.jp/
  4 EOF;
  5
  6 $num = __LINE__;
 
<略>
 
480
481 $start = __LINE__;
482 $lifull = substr(file_get_contents($url),$start,$num);
483 print($lifull);
484 ?>
485
```

### 解答16
```js:lifull.js
console.log(/LIFULL/.source);
```

### 解答17
```rb:lifull_spec.rb
class LIFULL
end
 
describe LIFULL do
  it do
    puts described_class
  end
end
```
```shell-session:実行方法
$ rspec lifull_spec.rb
```
<font color="Red">他の文字列が含まれているためレギュレーション的にはグレー</font>

### 解答18
```bash:lifull.sh
#!/bin/bash
echo $VAR
```
```shell-session:実行方法
$ VAR="LIFULL" ./lifull.sh
```

### 解答19
```apex(salesforce)
public enum COMPANY { LIFULL }
system.debug(COMPANY.LIFULL);
```
<font color="Red">動作未確認</font>

### 解答20
```brainf**k:
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.
---.
---.
+++++++++++++++.
---------.
.
------------------------------------------------------------------.
```

### 解答21
```lisp:lifull.lisp
(print (concatenate (quote string) (list #\L #\I #\F #\U #\L #\L #\linefeed)))
```
<font color="Red">動作未確認</font>

### 解答22
```shell-session
perl6 -e '::((~::((~(^(q{}~~q{})))~^q{~}~q{)}~^q{(}~^q{:}~^(~(^(q{}~~q{})))~^q{~}~q{)}~^q{~}~^q{:})((~(^(q{}~~q{})))~^q{)}~^q{(}~q{~}~^q{^}~^(~(^(q{}~~q{})))~^q{:}~q{:}~^q{~}~^q{(}~^q{^}~q{~}~^q{^}~^(~(^(q{}~~q{})))~^q{:}~q{~}~^q{^}~^(~(^(q{}~~q{})))~^q{:}~q{:}~^q{~}~^q{(}~^q{^}))~^q{:}~^q{(}~q{)}~^q{(}~^q{~}~^q{:}~q{~}~^q{(}~q{)}~^(~::((~(^(q{}~~q{})))~^q{~}~q{)}~^q{(}~^q{:}~^(~(^(q{}~~q{})))~^q{~}~q{)}~^q{~}~^q{:})((~(^(q{}~~q{})))~^q{)}~^q{(}~q{~}~^q{^}~^(~(^(q{}~~q{})))~^q{:}~q{:}~^q{~}~^q{(}~^q{^}~q{~}~^q{^}~^(~(^(q{}~~q{})))~^q{:}~q{~}~^q{^}~^(~(^(q{}~~q{})))~^q{:}~q{:}~^q{~}~^q{(}~^q{^}))~^(~(^(q{}~~q{})))~^q{~}~^q{:}~^q{(}~q{^}~^q{(}~^q{:})(q{(}~^(~(^(q{}~~q{})))~^q{:}~q{^}~^(~::((~(^(q{}~~q{})))~^q{~}~q{)}~^q{(}~^q{:}~^(~(^(q{}~~q{})))~^q{~}~q{)}~^q{~}~^q{:})((~(^(q{}~~q{})))~^q{)}~^q{(}~q{~}~^q{^}~^(~(^(q{}~~q{})))~^q{:}~q{:}~^q{~}~^q{(}~^q{^}~q{~}~^q{^}~^(~(^(q{}~~q{})))~^q{:}~q{~}~^q{^}~^(~(^(q{}~~q{})))~^q{:}~q{:}~^q{~}~^q{(}~^q{^}))~^(~(^(q{}~~q{})))~^q{)}~q{:}~^q{)}~^q{(}~^q{^}~^(~::((~(^(q{}~~q{})))~^q{~}~q{)}~^q{(}~^q{:}~^(~(^(q{}~~q{})))~^q{~}~q{)}~^q{~}~^q{:})((~(^(q{}~~q{})))~^q{)}~^q{(}~q{~}~^q{^}~^(~(^(q{}~~q{})))~^q{:}~q{:}~^q{~}~^q{(}~^q{^}~q{~}~^q{^}~^(~(^(q{}~~q{})))~^q{:}~q{~}~^q{^}~^(~(^(q{}~~q{})))~^q{:}~q{:}~^q{~}~^q{(}~^q{^}))~^(~(^(q{}~~q{})))~q{:}~^q{)}~^(~::((~(^(q{}~~q{})))~^q{~}~q{)}~^q{(}~^q{:}~^(~(^(q{}~~q{})))~^q{~}~q{)}~^q{~}~^q{:})((~(^(q{}~~q{})))~^q{)}~^q{(}~q{~}~^q{^}~^(~(^(q{}~~q{})))~^q{:}~q{:}~^q{~}~^q{(}~^q{^}~q{~}~^q{^}~^(~(^(q{}~~q{})))~^q{:}~q{~}~^q{^}~^(~(^(q{}~~q{})))~^q{:}~q{:}~^q{~}~^q{(}~^q{^}))~^q{^}~q{~}~^q{^}~q{:}~^(~::((~(^(q{}~~q{})))~^q{~}~q{)}~^q{(}~^q{:}~^(~(^(q{}~~q{})))~^q{~}~q{)}~^q{~}~^q{:})((~(^(q{}~~q{})))~^q{)}~^q{(}~q{~}~^q{^}~^(~(^(q{}~~q{})))~^q{:}~q{:}~^q{~}~^q{(}~^q{^}~q{~}~^q{^}~^(~(^(q{}~~q{})))~^q{:}~q{~}~^q{^}~^(~(^(q{}~~q{})))~^q{:}~q{:}~^q{~}~^q{(}~^q{^}))~^q{)}~q{^}~^q{(}~^q{:}~q{)}~^(~(^(q{}~~q{})))~^q{:}~^(~::((~(^(q{}~~q{})))~^q{~}~q{)}~^q{(}~^q{:}~^(~(^(q{}~~q{})))~^q{~}~q{)}~^q{~}~^q{:})((~(^(q{}~~q{})))~^q{)}~^q{(}~q{~}~^q{^}~^(~(^(q{}~~q{})))~^q{:}~q{:}~^q{~}~^q{(}~^q{^}~q{~}~^q{^}~^(~(^(q{}~~q{})))~^q{:}~q{~}~^q{^}~^(~(^(q{}~~q{})))~^q{:}~q{:}~^q{~}~^q{(}~^q{^}))~^q{^}~(~(^(q{}~~q{})))~^q{^}~^q{(}~(~(^(q{}~~q{})))~^q{(}~^q{)}~^q{:}~^q{^}~q{^}~^q{(}~^q{:}~q{^}~^q{(}~^q{:}~q{:}~^(~::((~(^(q{}~~q{})))~^q{~}~q{)}~^q{(}~^q{:}~^(~(^(q{}~~q{})))~^q{~}~q{)}~^q{~}~^q{:})((~(^(q{}~~q{})))~^q{)}~^q{(}~q{~}~^q{^}~^(~(^(q{}~~q{})))~^q{:}~q{:}~^q{~}~^q{(}~^q{^}~q{~}~^q{^}~^(~(^(q{}~~q{})))~^q{:}~q{~}~^q{^}~^(~(^(q{}~~q{})))~^q{:}~q{:}~^q{~}~^q{(}~^q{^}))~^q{)}~q{(}~^(~(^(q{}~~q{})))~^q{:}~q{^}~^q{:}~^q{~}~^(~::((~(^(q{}~~q{})))~^q{~}~q{)}~^q{(}~^q{:}~^(~(^(q{}~~q{})))~^q{~}~q{)}~^q{~}~^q{:})((~(^(q{}~~q{})))~^q{)}~^q{(}~q{~}~^q{^}~^(~(^(q{}~~q{})))~^q{:}~q{:}~^q{~}~^q{(}~^q{^}~q{~}~^q{^}~^(~(^(q{}~~q{})))~^q{:}~q{~}~^q{^}~^(~(^(q{}~~q{})))~^q{:}~q{:}~^q{~}~^q{(}~^q{^}))~q{)}~^q{(}~^q{~}~^q{:}~q{~}~^q{(}~q{)}~^(~::((~(^(q{}~~q{})))~^q{~}~q{)}~^q{(}~^q{:}~^(~(^(q{}~~q{})))~^q{~}~q{)}~^q{~}~^q{:})((~(^(q{}~~q{})))~^q{)}~^q{(}~q{~}~^q{^}~^(~(^(q{}~~q{})))~^q{:}~q{:}~^q{~}~^q{(}~^q{^}~q{~}~^q{^}~^(~(^(q{}~~q{})))~^q{:}~q{~}~^q{^}~^(~(^(q{}~~q{})))~^q{:}~q{:}~^q{~}~^q{(}~^q{^}))~^(~(^(q{}~~q{})))~^q{~}~^q{:}~^q{(}~q{^}~^q{(}~^q{:})'
```
<font color="Red">動作未確認</font>

### 解答23
```pl:lifull.pl
print <<EOF;
LIFULL
EOF
```

### 解答24
```sql:lifull.sql
SELECT
    CHR(eight * nine + four) AS l, -- 76
    CHR(eight * nine + one) AS i, -- 73
    CHR(eight * nine - two) AS f, -- 70
    CHR(nine * nine + four) AS u, -- 85
    CHR(eight * nine + four) AS l, -- 76
    CHR(eight * nine + four) AS l, -- 76
    CHR(nine + one) AS lf --10
FROM (
    SELECT
        one,
        one + one AS two,
        one + one + one AS three,
        one + one + one + one AS four,
        one + one + one + one + one AS five,
        one + one + one + one + one + one AS six,
        one + one + one + one + one + one + one AS seven,
        one + one + one + one + one + one + one + one AS eight,
        one + one + one + one + one + one + one + one + one AS nine
    FROM (
        SELECT DISTINCT
        (SELECT COUNT(*)/COUNT(*) FROM hoge) AS one
        FROM hoge
    ))
```
<font color="Red">動作未確認</font>

### 解答25
```tcl:tcl
puts {LIFULL}
```
<font color="Red">動作未確認</font>

### 解答26
```java:Lifull.java
import java.awt.event.KeyEvent;
 
public class Lifull {
    public static void main(String[] args) {
        byte[] codes = new byte[]{KeyEvent.VK_L, KeyEvent.VK_I, KeyEvent.VK_F, KeyEvent.VK_U, KeyEvent.VK_L, KeyEvent.VK_L};
        System.out.printf(new String(codes) + System.lineSeparator());
    }
}
```

### 解答27
```hs:lifull.hs
data Company = LIFULL | RECRUIT | ATHOME deriving Show
 
main :: IO ()
main = print LIFULL
```

### 解答28
```sqlplus:sqlplus
PROMPT LIFULL
```
<font color="Red">動作未確認</font>

### 解答29
```whitespace:whitespace
SSSSN
SSSTSTSN
SSSTSSTTSSN
SSSTSSTTSSN
SSSTSTSTSTN
SSSTSSSTTSN
SSSTSSTSSTN
SSSTSSTTSSN
N
SSSSN
SN
SN
TSSTN
TN
SSN
SN
SSN
N
SSSTN
N
N
N
N
```
<font color="Red">動作未確認</font>