2011年5月26日

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

※このまとめに含まれるプログラムは一種のパズル的な遊びです。   くれぐれも用法用量を守った上で正しくご利用ください><   実用するならば、“言うまでもなく” if か ?: を利用すべきです。 やばい連中に喧嘩を売ってしまった……。 続きを読む
141
にゃんだーす☆わん @tadsan

先週の部活の新入生向けC言語講座でif-else文だったので、せっかくなので講師の二年生に「if文を使はずに、printfで完結して表示内容を分岐する方法わかる?」と質問したところ、二年はおろか三年の正答率もやばかった件とか……。

2011-05-26 13:22:43
るいーに @1ouis

@tadsan えっ分岐できるんですか……

2011-05-26 13:26:51
KOIZUKA, Akihiko @koizuka

@tadsan 三項演算子を使うのが正解とする問題だろうか

2011-05-26 13:23:45
琴子(じゅーはっちゃい) @tot_main

@tadsan ifを使わずにと言った時点で三項演算子が出てこないと言うのが問題w ♪

2011-05-26 13:26:04
忠吉さん(偽物) @tadsan2

--------------------------------------------------

2011-02-16 05:29:57
にゃんだーす☆わん @tadsan

printf("%s\n",(a==b)?"正":"誤"); みたいなのが模範解答。

2011-05-26 13:23:56
るいーに @1ouis

@tadsan なるほど三項演算子でしたか、そこで使うアイデアはなかなか出てこないですね

2011-05-26 13:28:40
Λlisue@同調圧力に屈した男 @lambdalisue

@tadsan あ、なんだ演算子も使わないでって意味かと思ってた。

2011-05-26 13:35:34
るいーに @1ouis

三項演算子は return (a==b)?1:0 みたいに使う事が多いかなぁ。

2011-05-26 13:30:30
るいーに @1ouis

char型配列って+で連結できたっけ。できなかった気がするんだけど……、あへ?

2011-05-26 13:31:52
るいーに @1ouis

これの+はstringみたいに連結のための+ではないのか。これは、んー?

2011-05-26 13:37:12
にゃんだーす☆わん @tadsan

@1ouis C言語なので、char* に 4加算 = 始点が4byteずれる ってことではないかと。比較演算子は 0 か 1 を返すので、a!=bならばずれなくて、しかも \0 で文字列が終ります。

2011-05-26 13:42:15
るいーに @1ouis

@tadsan やはり、ポインタとしてそれをずらしているということですか。文字列がポインタとして扱われていたんですね……!!

2011-05-26 13:45:58
忠吉さん(偽物) @tadsan2

--------------------------------------------------

2011-02-16 05:29:57
リモートなお仕事募集中でござるぞ @vivisuke

じゃあ、?: も使わずに表示内容を分岐する方法はわかる? QT @tadsan 先週の部活の新入生向けC言語講座でif-else文だったので、せっかくなので講師の二年生に「if文を使はずに、printfで完結して表示内容を分岐する方法わかる?」と質問したところ、二年はおろか三年…

2011-05-26 13:29:20
にゃんだーす☆わん @tadsan

闇プログラマーじゃないので、呈示されたコードは読めても、知らない方法はわかりません>< RT @vivisuke: じゃあ、?: も使わずに表示内容を分岐する方法はわかる?

2011-05-26 13:33:40
忠吉さん(偽物) @tadsan2

--------------------------------------------------

2011-02-16 05:29:57
KOIZUKA, Akihiko @koizuka

@tadsan printf("誤¥0正"+(a==b)*4); // UTF-8の場合

2011-05-26 13:25:22
にゃんだーす☆わん @tadsan

戀塚さんやめてwwwwwwwwww

2011-05-26 13:29:10
にゃんだーす☆わん @tadsan

戀塚さんのコード http://twitter.com/#!/@koizuka/status/73605621345300480 がどうして動くのか後輩に質問してみるとおもしろいかもしれない。後輩が文字列\0の話をしてたのは聴いた覚えがあるので、これはきっと回答できると期待。

2011-05-26 13:32:02
KOIZUKA, Akihiko @koizuka

@tadsan printf("A%cB",61+(a>b)-(a<b)); // ASCII code環境

2011-05-26 13:47:13
にゃんだーす☆わん @tadsan

また変態なコードがwwwwww むしろASCIIのコード表が良くできてることに感服。

2011-05-26 13:49:48
忠吉さん(偽物) @tadsan2

--------------------------------------------------

2011-02-16 05:29:57
筒天@【卒業】団体一名様 @tututen

@tadsan a-b||printf("正解\n");a-b&&printf("不正解\n"); 

2011-05-26 13:38:42
にゃんだーす☆わん @tadsan

また素直じゃないコードがwwwwww

2011-05-26 13:43:16
残りを読む(17)

コメント

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