闇プログラマーに喧嘩を売ってしまった昼下がり~条件分岐篇~

※このまとめに含まれるプログラムは一種のパズル的な遊びです。   くれぐれも用法用量を守った上で正しくご利用ください><   実用するならば、“言うまでもなく” if か ?: を利用すべきです。 やばい連中に喧嘩を売ってしまった……。 続きを読む
プログラミング 闇プログラマー c言語
49830view 38コメント
140
にゃんだーすわん卿 @tadsan
先週の部活の新入生向けC言語講座でif-else文だったので、せっかくなので講師の二年生に「if文を使はずに、printfで完結して表示内容を分岐する方法わかる?」と質問したところ、二年はおろか三年の正答率もやばかった件とか……。
Akihiko Koizuka @koizuka
@tadsan 三項演算子を使うのが正解とする問題だろうか
琴子(じゅーはっちゃい) @tot_main
@tadsan ifを使わずにと言った時点で三項演算子が出てこないと言うのが問題w ♪
忠吉さん(偽物) @tadsan2
--------------------------------------------------
にゃんだーすわん卿 @tadsan
printf("%s\n",(a==b)?"正":"誤"); みたいなのが模範解答。
るいーに@4/20快創音楽室でDJやるよ @1ouis
@tadsan なるほど三項演算子でしたか、そこで使うアイデアはなかなか出てこないですね
Λlisue@論理筋肉プログラマ @lambdalisue
@tadsan あ、なんだ演算子も使わないでって意味かと思ってた。
るいーに@4/20快創音楽室でDJやるよ @1ouis
三項演算子は return (a==b)?1:0 みたいに使う事が多いかなぁ。
るいーに@4/20快創音楽室でDJやるよ @1ouis
char型配列って+で連結できたっけ。できなかった気がするんだけど……、あへ?
るいーに@4/20快創音楽室でDJやるよ @1ouis
これの+はstringみたいに連結のための+ではないのか。これは、んー?
にゃんだーすわん卿 @tadsan
@1ouis C言語なので、char* に 4加算 = 始点が4byteずれる ってことではないかと。比較演算子は 0 か 1 を返すので、a!=bならばずれなくて、しかも \0 で文字列が終ります。
るいーに@4/20快創音楽室でDJやるよ @1ouis
@tadsan やはり、ポインタとしてそれをずらしているということですか。文字列がポインタとして扱われていたんですね……!!
忠吉さん(偽物) @tadsan2
--------------------------------------------------
リモートなお仕事募集中でござるぞ @vivisuke
じゃあ、?: も使わずに表示内容を分岐する方法はわかる? QT @tadsan 先週の部活の新入生向けC言語講座でif-else文だったので、せっかくなので講師の二年生に「if文を使はずに、printfで完結して表示内容を分岐する方法わかる?」と質問したところ、二年はおろか三年…
にゃんだーすわん卿 @tadsan
闇プログラマーじゃないので、呈示されたコードは読めても、知らない方法はわかりません>< RT @vivisuke: じゃあ、?: も使わずに表示内容を分岐する方法はわかる?
忠吉さん(偽物) @tadsan2
--------------------------------------------------
Akihiko Koizuka @koizuka
@tadsan printf("誤¥0正"+(a==b)*4); // UTF-8の場合
にゃんだーすわん卿 @tadsan
戀塚さんやめてwwwwwwwwww
にゃんだーすわん卿 @tadsan
戀塚さんのコード http://twitter.com/#!/@koizuka/status/73605621345300480 がどうして動くのか後輩に質問してみるとおもしろいかもしれない。後輩が文字列\0の話をしてたのは聴いた覚えがあるので、これはきっと回答できると期待。
Akihiko Koizuka @koizuka
@tadsan printf("A%cB",61+(a>b)-(a<b)); // ASCII code環境
にゃんだーすわん卿 @tadsan
また変態なコードがwwwwww むしろASCIIのコード表が良くできてることに感服。
忠吉さん(偽物) @tadsan2
--------------------------------------------------
所詮その程度筒天@団体一名様 @tututen
@tadsan a-b||printf("正解\n");a-b&&printf("不正解\n"); 
にゃんだーすわん卿 @tadsan
また素直じゃないコードがwwwwww
残りを読む(17)

コメント

くろいえのぐ @enogu 2011年5月26日
"ifを使うな"って言われて固まった人はみんなディープなPythonistaだったんだよ!!
にゃんだーすわん @tadsan 2011年5月26日
流れを編輯/区切りを追加/戀塚さんのコードがひとつ抜けてたので補完。
高橋雅奇 @TakahashiMasaki 2011年5月26日
こんなトリッキーで面倒な方法つかうぐらいなら普通にif文でアルゴリズムを書けといいたい
にゃんだーすわん @tadsan 2011年5月26日
戀塚さんの新しいコードを追加/説明を編輯/デコレーション。
小川晃通(あきみち) @geekpage 2011年5月26日
「素直な方法」でswitch case defaultだと思ったけど、そうじゃなかった。文字列ポインタをいじる方法は色々考えると面白そう。最近C言語書いてないなぁ。
小川晃通(あきみち) @geekpage 2011年5月26日
あー、あとトリッキーな方法としては、__ASM__でifを使ってないとか無茶な主張をするとかか。。。
akihiro takizawa @turky 2011年5月26日
Pythonだって出来るもん print "%s" % (a==b and "正解" or "不正解")
@you_ 2011年5月26日
koizukaさんの解答だったら,ごめんなさいするけど,tadsanの解答は「はいはいワロスワロス」っていうな.条件分岐してるし.
荒牧護 @arainmonk 2011年5月26日
アナゴルみたいで面白い。
Assume @_Assume_ 2011年5月26日
C言語での文字列定数(文字列リテラル)って、charポインタ(const char *)そのもの。sizeof('不')==3な処理系であることが仮定されているから、整数演算で「bool型の0ではない値」を×3すると・・・以下(ry
ふ''れいす @bleis 2011年5月26日
条件演算子と呼べよデコ助野郎
uNagi @unagix 2011年5月26日
なんだmain[]=""するやつじゃないのか。
ねこがいました @chocolat_shop 2011年5月26日
全然「闇プログラマー」じゃないじゃないか。ワンライナー大好きな正しい意味でのハッカーじゃないか。でも三項演算子が多用されてるコードは後からメンテしづらいので勘弁していただきたく……
佐倉和音🥴 @O_Flow 2011年5月26日
Pythonでもワンライナーで書けるのか…。闇プログラマーの世界は恐ろしいw Hacker'sDictionaryには「クソッタレで醜いC言語コンテスト」っていうコンベンションがあった(ある?)って記載があった記憶が。
にゃんだーすわん @tadsan 2011年5月26日
僕の条件演算子のコードだけ「大したことなさすぎワロタ」なのは誰の目にも明らかな事実なのですけれども、当初は後輩から教科書的な回答が欲しかっただけなので、他のハックを引き立てる意味でもこれで十分なんですっ><
risou @risou 2011年5月26日
闇プログラマーというかゴルファー
にゃんだーすわん @tadsan 2011年5月26日
「闇プログラマー」の件は皆さんの仰る通りなのですが、かと言ってハックはハックでもハッキングと言ひ切るのはニュアンス的にどうなの、ゴルフはストローク数を競ふ競技なので全然違ふ、といふことでインパクト重視のタイトルを付けました><
Fomalhaut Weisszwerg @FmtWeisszwerg 2011年5月26日
@O_Flow 二番煎じですがPythonでも print"xo"[(a==b):] と書くことができます。めっちゃ顰蹙もらいますが・・・(´・ω・`)でもショートコーディング楽しい♪
佐倉和音🥴 @O_Flow 2011年5月26日
究極のワンライナーが書ける言語はPerlかしら?文字化けのようなコードでも通るしw
CodeAnalyze @codeanalyze 2011年5月26日
こうですか。わかりません printf("当たり\0外れ"+7*-(-(~a*~a)>>sizeof(a)*8-1));
でこすけ @dekosuke 2011年5月26日
三項演算子使うより配列のインデックスにするほうがしっくりきますね
あっと寿司 @atsushi015 2011年5月26日
普通に分岐コードを書いたら、このコードみたいな実装をコンパイラがしてくれるってのが個人的な理想。無理か。
アニメ大好きハゲおじさん @Crimson_Apple 2011年5月26日
流石に三項演算子は思いついたけど、こいづかさんみたいなのはおもいつかねーわ…。
td2sk🤔️ @td2sk 2011年5月27日
3個目ぐらいまでは自力で思いついたけどゴルファーでないので気持ち悪さしか感じない
risou @risou 2011年5月27日
話しの内容はゴルフと関係ないとしても、恋塚さんがゴルファーなのはぜんぜん間違ってないと思いますが……
にゃんだーすわん @tadsan 2011年5月27日
はい、戀塚さんはゴルファーです。生放送で配信してますが、とてもおもしろいですよ。 http://com.nicovideo.jp/community/co1039783
Guwashi @Guwashi 2011年5月27日
printf("誤¥0正"+(a==b)*4); // UTF-8の場合 ←これは素晴らしいね、感動した。
あどばーす・よー @AdvYaw 2011年5月27日
コーディングは、(処理速度とかの制約がない限りは)可読性を、もうちょっと重視しようよw
でき @dekijp 2011年5月27日
三項演算子は分岐だよね?見てるとスゲェ!と思うコードもあるし、Cの利点だとは思うけど、同時に大きな欠点でもあるんだよな。他人のコードどころか自分のコードが読めなくなる。
ukyo @ukyo 2011年5月27日
hoge = {True:"正解", False:"不正解"} print hoge[a==b] 条件分岐使わないとなるとこんな感じになるか(python)。
Egtra (ysk-noh) @egtra 2011年5月27日
条件分岐使わないCプログラムと言えば、これもかなり闇。 http://homepage1.nifty.com/herumi/prog/futsu.pdf
iWA @vmi_jp 2011年5月27日
配列モノがないので追加。printf("%s\n",(char*[]){"不正解","正解"}[a==b]); // ※C99ならおkのはず
めのすさん @menow_white 2011年5月28日
三項演算子はよく使うから思いつくけど、ポインタの挙動まで考えぬかれたやつはすげえなあ…w
柴宮両兵衛(伊予守・重高・幻鶴) @ShibamiyaRyobee 2011年12月15日
何だか上から下に読みにくいまとめだな…MSXBASICでよくやったX=X-(S=3)+(S=7)を思い出す
しゃろろん @sharo0331old 2012年12月1日
三項演算子は時々使うかな、こういう変態的なすばらしい考えができる人が羨ましい
門武乱 @anobiidae 2013年5月20日
printf(a==b?"NYA":"WANWAN"); とかですかねえ…
XENO @xenophobia__ 2013年5月21日
闇プログラマとかいうから身構えてたら普通にゴルフしてるだけではないか。
ログインして広告を非表示にする
ログインして広告を非表示にする