縛りプログラミング
こんにちは、LIFULL HOME'S事業本部 技術開発部の宮崎です。
これはLIFULL その2 Advent Calendarの8日目の投稿になります。
ついでにLIFULL Advent Calendarもよければご覧下さい。
縛りプログラミングとは
今回の記事は、僕がConfluenceの記事で出したある問題の解答集となります。
その問題が以下のとおりです。
ソースコードにダブルクォート、シングルクォート、数字を書くこと無く、「LIFULL」と出力して下さい。
最後に改行を付けること。
言語は問いません。
完全にHelloWorldですね。このHelloWorldを幾つかの縛りを設けて解いてみろ!という感じです。
この記事を見た方もどのような方法があるかぜひ考えてみて下さい。
幾つかは自分で実行の環境を用意するのがめんどくさかった用意できなかったので、動作確認できていないものがあります。
分類
どういう方法を用いたか大まかに分類してみることにします。
全ての解答は最後にまとめます。
異なるリテラルで文字列を表現
rubyの%qやヒアドキュメント、幾つかの言語では`を使うことで文字列を表現することができます。
また、PHPでは、PHPタグを使わないことで、直接文字列として認識させることもできるようです。
puts %q(LIFULL)
関数名やクラス名を文字列表現
スクリプト言語では、比較的簡単に関数名やクラス名を取得することができるので、その特徴を上手く活かしている解答です。
console.log((LIFULL = () =>{}).name)
実行時に頑張る
ソースコードにというのがレギュレーションなので、上手く穴を突いた解答です。
実行時の引数や、環境変数、ワンライナーでの解答がありました。
$ cat lifull.sh
#!/bin/bash
echo $VAR
$ VAR="LIFULL" ./lifull.sh
ASCIIコードで頑張る
そもそも文字はコンピューター内部では数字として保存されているようなものなので、数字を作ることができれば文字列を表示することができます。
問題はどうやって数字を作るかです。
解答の中では以下の様なものがありました。
- 行番号を使う
- 割り算する
- 用意されている定数を使う
- 言語特有のハックを使う(js,perl)
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という文字が入っているページから文字列を取得し、頑張って数字を作れば文字列が抽出できます。
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
puts %q(LIFULL)
解答2
class LIFULL: pass
print(LIFULL.__name__)
解答3
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
var s = `LIFULL\n`;
console.log(s);
解答5
<?php
echo <<<EOF
LIFULL\n
EOF;
解答6
LIFULL
解答7
<?php eval($argv[__LINE__]);
php ans.php "echo \"LIFULL\n\";"
解答8
<?php
function LIFULL(){ error_log((__FUNCTION__), __LINE__); }
LIFULL();
解答9
#!/bin/bash
echo LIFULL
解答10
$ echo LIFULL
解答11
console.log(((![]+[])[+!![] + +!![]]+([][+!![]]+[])[+!![] + +!![] + +!![] + +!![] + +!![]]+([][+[]]+[])[+!![] + +!![] + +!![] + +!![]]+([][+[]]+[])[+[]]+(![]+[])[+!![] + +!![]]+(![]+[])[+!![] + +!![]]).toUpperCase());
解答12
console.log((LIFULL = () =>{}).name)
解答13
v <- deparse(quote(`LIFULL\n`))
cat(v)
動作未確認
解答14
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)
動作未確認
解答15
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
console.log(/LIFULL/.source);
解答17
class LIFULL
end
describe LIFULL do
it do
puts described_class
end
end
$ rspec lifull_spec.rb
他の文字列が含まれているためレギュレーション的にはグレー
解答18
#!/bin/bash
echo $VAR
$ VAR="LIFULL" ./lifull.sh
解答19
public enum COMPANY { LIFULL }
system.debug(COMPANY.LIFULL);
動作未確認
解答20
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.
---.
---.
+++++++++++++++.
---------.
.
------------------------------------------------------------------.
解答21
(print (concatenate (quote string) (list #\L #\I #\F #\U #\L #\L #\linefeed)))
動作未確認
解答22
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{:})'
動作未確認
解答23
print <<EOF;
LIFULL
EOF
解答24
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
))
動作未確認
解答25
puts {LIFULL}
動作未確認
解答26
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
data Company = LIFULL | RECRUIT | ATHOME deriving Show
main :: IO ()
main = print LIFULL
解答28
PROMPT LIFULL
動作未確認
解答29
SSSSN
SSSTSTSN
SSSTSSTTSSN
SSSTSSTTSSN
SSSTSTSTSTN
SSSTSSSTTSN
SSSTSSTSSTN
SSSTSSTTSSN
N
SSSSN
SN
SN
TSSTN
TN
SSN
SN
SSN
N
SSSTN
N
N
N
N
動作未確認