雑な導入
ネタ記事です
この記事には通常では考えられないような記法が多々登場します
皆さん、Python3とJavascript、使ってますよね!
ただ、こう思ったことはないですか?
「言語にかかわらずコードがコードが動けばいいのに」って。 ないです
そこでPythonとJavascriptどっちでも動くコードを作ろうと思い立ちました。
(第3回FizzBuzz回です)
今のところFizzBuzzの記事はJavascriptとPythonでしかやってないけど書きかけの記事にマルコフアルゴリズムあるんだよね()
どうせならやってる人いなさそうなやつがいいなってなった結果こうなった
問題点と解決策
まあ最初からわかりきっていた問題点ですが
・あまりにも記法が違いすぎる
完全にコードを共有できる場所が限りなく少ないんですよね〜、、、
そこで、「同じ記法で別の意味を持つ演算子や構文を探す」
ということをしました。
すると1つ、あったんですよ。
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
//コメントアウト
1//2 #商
勝ったな。風呂入ってくる
まさかの、コメントと演算子が被るという天才的な事態が起きたんです。
これにより、Pythonだけが動く場所を作れたんです。
ただ、Javascriptだけが動く場所も作らなければいけない、、、んですがこれはまあ簡単な話でPythonの複数行コメントをJavascriptのコメントのところに書くだけなんで!!(フラグ)
書く
ということで、早速書いていきましょう
1//2=='''
/*'''
for i in range(100):print(i%3//2*"Fizz"+i%5//4*"Buzz"or-~i)#*/for(i=0;++i<101;console.log(i%5?x||i:x+'Buzz'))x=i%3?'':'Fizz'
1//2=='''
/*'''
for i in range(100):print(i%3//2*"Fizz"+i%5//4*"Buzz"or-~i)#*/for(i=0;++i<101;console.log(i%5?x||i:x+'Buzz'))x=i%3?'':'Fizz'
できた!!!
流石に簡単すぎた
ということで流石に簡単すぎたため、コードの一部をある程度共有して、複数行コメントとfunctionやdefを禁止にして、再帰関数で書きます。
土台
const f = x => {
s = ''
if(!(x % 3)) s += 'Fizz';
if(!(x % 5)) s += 'Buzz';
s ||= x;
console.log(s);
if(x < 100) f(x + 1);
};
f(1)
f = (lambda x:
print(
( ('' if x%3 else 'Fizz')
+ ('' if x%5 else 'Buzz')
) or x
) or
(0 if x > 99 else f(x+1))
)
f(1)
これを合体させるとして、まず最初の方はだいたいもうわかっていて、
0//1; (f := (lambda x: '''
(f = x => { s = //''' == print(
処理
))(1)
0//1; (f := (lambda x: '''
(f = x => { s = //''' == print(
処理
))(1)
多分こんな感じでしょう
FizzやBuzzの処理
どうせならJavascriptとPythonで処理を統一させたいですよね?(圧)
ということで多くの言語でそれなりに表記方法が一緒であるリストを使いましょう!!
Javascriptでnot関数を定義しておくことによって
Javascriptでは「not関数」、Pythonでは「not演算子と式」と判定されることで
両言語で動くコードが書けますね!!
not = x => +!x
['','Fizz'][not(x % 3)] + ['','Buzz'][not(x % 5)]
FizzやBuzzでない時の整数の処理
あとは整数の処理ですね
Pythonのif文とJavascriptのif文を同時に扱うとなると
コンマが邪魔でとても書きにくいです。
そこで、
Pythonでは三項演算子がif elseであることを用います
Javascriptにはまだチェーン演算子が実装されていないので、
['出力したい内容'].map(x => console.log(x))
とすることによって疑似的にチェーン関数を代用できますね!!!
これと、先ほどのnot関数を用いて
['','Fizz'][not(x%3)]+['','Buzz'][not(x%5)]
if (not(x % 3 * x % 5 + 0 // 1 + int('''0
)) { console.log(s) } // '''[0])))
else ([ x + 0 // 1 + int('''1
].map(x => console.log(x))) // '''[0]) ][0]))
['','Fizz'][not(x%3)]+['','Buzz'][not(x%5)]
if (not(x % 3 * x % 5 + 0 // 1 + int('''0
)) { console.log(s) } // '''[0])))
else ([ x + 0 // 1 + int('''1
].map(x => console.log(x))) // '''[0]) ][0]))
こうすることによって、JavascriptでもPythonでも同じ出力をすることができるようになりましたね!!!
ループの処理
最後にループ処理ですね
こちらもPythonのif文を使うのが難しいため三項演算子のお世話になります!
x
が99
以上の時は何もせず、そうでないときはf(x+1)
を実行すればいいので
Javascriptにおいて一行のif文は{}
を省略できること、
Pythonの三項演算子において()
はグループ化以上の意味を持たないことを用いて
0//1; (f := (lambda x: '''
(f = x => { s = //''' == print(
処理
// )
if(x > 99) +0
else f(x + 1) == 0 // 1 or '''
}//Made by Sei2423''')
))(1)
0//1; (f := (lambda x: '''
(f = x => { s = //''' == print(
処理
// )
if(x > 99) +0
else f(x + 1) == 0 // 1 or '''
}//Made by Sei2423''')
))(1)
ちょっと短縮
現時点でのコードは
0//1; (f := (lambda x:'''
not = x => +!x;
((f = x => { s = // ''' == print(
['','Fizz'][not(x % 3)] + ['','Buzz'][not(x % 5)]
if (not(x % 3 * x % 5 + 0 // 1 + int('''0
)) console.log(s) // '''[0])))
else ([ x + 0 // 1 + int('''0
].map(x => console.log(x))) // '''[0]) ][0])) or (0
if(x > 99) +0
else f(x + 1) == 0 // 1 or '''
}//Made by Sei2423''')
))(1)
0//1; (f := (lambda x:'''
not = x => +!x;
((f = x => { s = // ''' == print(
['','Fizz'][not(x % 3)] + ['','Buzz'][not(x % 5)]
if (not(x % 3 * x % 5 + 0 // 1 + int('''0
)) console.log(s) // '''[0])))
else ([ x + 0 // 1 + int('''0
].map(x => console.log(x))) // '''[0]) ][0])) or (0
if(x > 99) +0
else f(x + 1) == 0 // 1 or '''
}//Made by Sei2423''')
))(1)
こんな感じですね!
ここで、Pythonでは、
0 // 1 + int('''0
...'''[0])
0 // int('''1
...'''[0])
この2つは同じ意味になりますね!!
そして、Pythonの複数行文字列は若干環境依存ではあるかもしれないですが、
'\
...'
このようにも表記することが可能です!!!
また、Pythonでは、この式の戻り値は
f(x + 1) == 0 // 1 or '\
}//Made by Sei2423'
によって'\n}//Made by Sei2423'
が返ってきますが、
or
を*
に置き換えることによって
この式は
f(x + 1) == ''
となり falseが返ってくるため四則演算ができるようになります。
ここで、一行目を見てみると
0//1; (f := (lambda x:'''
となっているため、この式の戻り値をTrueにする
つまり、==
の代わりに!=
にすることで、
0 // (f := (lambda x:'\
とすることができます!!
あとは、取り払える改行とスペースを全部取り除いたら、、、、
完成!
0//(f:=(lambda x:'\
not=x=>+!x;((f=x=>{s=//'==print(
['','Fizz'][not(x%3)]+['','Buzz'][not(x%5)]
if(not(x%3*x%5+0//int('1\
))console.log(s)//'[0])))
else([x+0//int('1\
].map(x=>console.log(x)))//'[0])][0]))or(0
if(x>99)+0
else f(x+1)!=0//1*'\
}//Made by Sei2423')
))(1)
0//(f:=(lambda x:'\
not=x=>+!x;((f=x=>{s=//'==print(
['','Fizz'][not(x%3)]+['','Buzz'][not(x%5)]
if(not(x%3*x%5+0//int('1\
))console.log(s)//'[0])))
else([x+0//int('1\
].map(x=>console.log(x)))//'[0])][0]))or(0
if(x>99)+0
else f(x+1)!=0//1*'\
}//Made by Sei2423')
))(1)
あとがき
FizzBuzz、皆さんもやりましょう!!
お読みいただきありがとうございました!!
感想