SlideShare ist ein Scribd-Unternehmen logo
1 von 19
Downloaden Sie, um offline zu lesen
変態ショートコーダーへの道


        @uskey512
自己紹介
今をときめく(脳内)ゆるふわ系プログラマ
競技プログラマ畑な人
コーラは一日2リットルまで




             のうき☆マヂカ
ショートコーディングって何?



A. ある機能を実現する際に、
   記述するコードを可能な限り短くする行為




      さようなら、可読性。こんにちは、新世界。
必要な心構え

・出来るだけ行儀悪くコードを書く


・演算順序や(コード上)短い処理への置換、
データの持ち方、アルゴリズム等を意識する。


・環境固有の動作や処理系の内部まで考える


      そして1Byteに命(睡眠時間)を賭ける気概
何をもって実現とみなすのか
実行環境に差異があってはならず、
ショートコーダー達が共通の条件で同じ問題と戦えなければならない。

→オンラインジャッジシステムの利用
- PKU (北京大学)   http://poj.org/
                                 利用可能言語:
                                 C, C++, Java, Pascal, Fortran

- AOJ (会津大学)   http://judge.u-aizu.ac.jp/onlinejudge/

                                 利用可能言語:
                                 C, C++, Java
ショートコーディング例
[AOJ 0006] Reverse Sequence

文字列 str を入力したとき、その文字列を逆順に
出力するプログラムを作成して下さい。文字は半
角英数字のみで、20 文字以内とします。



             http://goo.gl/C7H5u
普通に解いてみる (217B(161B))
 #include <stdio.h>
 #include <string.h>


 int main(void)
 {
     char i, str[21];
     scanf("%s", str);


     for (i = strlen(str) - 1; 0 <= i; i--){
         printf("%c", str[i]);
     }
     printf("¥n");               ・配列に文字列を入れて、逆順で表示
     return (0);
 }
                                 ・出力時に改行入れないとダメだったり
行儀悪く解いてみる (167B(115B))
 main()
 {
     char i, str[21];
     scanf("%s", str);
     for (i = strlen(str) - 1; 0 <= i; i--){
          printf("%c", str[i]);
     }
     printf("¥n");       ・インクルード宣言は省略しても動く
     return (0);         ・関数,変数の型宣言は省略可能
 }
                         ・voidは省略可能

                         gccってすごいコンパイラ!!
同じ処理に置き換える (145B(98B))
 main(i)                       -1 => 11111111(2)   iが0以上
 {
                                     ↓               ↓
     char str[21];
                              ~-1 => 00000000(2)   iが-1でない
     scanf("%s", str);
     for (i = strlen(str); ~--i;){
           putchar(str[i]);
     }
     puts("");           ・printfをputs, putcharで置換
     return 0;           ・ループ条件のまとめ
 }
                         ・mainの引数使えば宣言しなくても

                         普通の解き方じゃここまでか…
ちょっと頭を使ってみる
入力された文字列の逆を表示する…



              T    出力時

              S

              E
       入力時
              T




       (やや強引に)これはスタックだ…
再帰でスタックっぽく扱う (114B(79B))
 main(i){
     if (i != 10){
            main(getchar());   ¥n

     } else return 0;
                               T
     putchar(i-1?i:10);
     return 0;                 S
 }
                               E
     ・再帰でスタック領域の変数を使う
     →配列宣言不要(添字演算子文短く(ry       T
     ・最後の改行は表示せず、
                               ¥n
       最初の文字の前に改行を表示する処理
IFとか要らないですしおすし(84B(61B))
main(i){
     i-10 &&
     main(getchar()) &
     putchar(i-1?i:10);
     return 0;
}

    ・AND演算子(&&)で接続した式は、
     最初の式の結果によって実行されるか決定




                         If文とかそんなものなかった!
予約語なんて消えちまえ! (72B(53B))
j;main(i){
    j=i-10 &&
    main(getchar()) /
    putchar(i-1?i:10);
}
    ・return文で設定される戻り値は
     eaxレジスタに設定される。
    →じゃあeaxレジスタに0が入ればreturn文は要らない!
    →ダミーの除算で0を入れてやる。
    →→でも除算処理だけだと最適化で削除され(ry
                        予約語は死んだ!(ニーチェ
                        コレが最短だぜうおおおおお!
これで最短やで!(ドヤ顔投稿
これで最短やで!(ドヤ顔投稿
┐(´ー`)┌
これで最短やで!(ドヤ顔投稿




      卒研担当教授は出しぬいた!
まとめ(白目
メリット
・(変態的な)アルゴリズムを勉強できる
・処理系のディープな中身も勉強できる!
・頭がやわらかくなる→ボケ防止?


デメリット
・業務中に-1ならチルダ判定一択だろJKとか思っちゃう
・汚いコードの中の何かに目覚める

            やってみると意外と楽しいよ!
            みんなもショートコーディングしようぜ!
おまけ
AOJに投稿する時の見た目



j;main(i){j=i-10&&main(getchar())/putchar(i-1?i:10);}

Weitere ähnliche Inhalte

Was ist angesagt?

モナドハンズオン前座
モナドハンズオン前座モナドハンズオン前座
モナドハンズオン前座bleis tift
 
関数型プログラミング in javascript
関数型プログラミング in javascript関数型プログラミング in javascript
関数型プログラミング in javascriptRyuma Tsukano
 
並行プログラミングと継続モナド
並行プログラミングと継続モナド並行プログラミングと継続モナド
並行プログラミングと継続モナドKousuke Ruichi
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由kikairoya
 
C++11概要 ライブラリ編
C++11概要 ライブラリ編C++11概要 ライブラリ編
C++11概要 ライブラリ編egtra
 
お前は PHP の歴史的な理由の数を覚えているのか
お前は PHP の歴史的な理由の数を覚えているのかお前は PHP の歴史的な理由の数を覚えているのか
お前は PHP の歴史的な理由の数を覚えているのかKousuke Ebihara
 
yieldとreturnの話
yieldとreturnの話yieldとreturnの話
yieldとreturnの話bleis tift
 
templateとautoの型推論
templateとautoの型推論templateとautoの型推論
templateとautoの型推論MITSUNARI Shigeo
 
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜勝成 鈴江
 
言語処理系入門4
言語処理系入門4言語処理系入門4
言語処理系入門4Kenta Hattori
 
Scala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみたScala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみたKazuyuki TAKASE
 
Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2Masao Kato
 
Implicit Implicit Scala
Implicit Implicit ScalaImplicit Implicit Scala
Implicit Implicit ScalaKota Mizushima
 
Java電卓勉強会資料
Java電卓勉強会資料Java電卓勉強会資料
Java電卓勉強会資料Toshio Ehara
 
2011年12月9日
2011年12月9日2011年12月9日
2011年12月9日nukaemon
 
C++でHello worldを書いてみた
C++でHello worldを書いてみたC++でHello worldを書いてみた
C++でHello worldを書いてみたfirewood
 

Was ist angesagt? (20)

Emcjp item21
Emcjp item21Emcjp item21
Emcjp item21
 
モナドハンズオン前座
モナドハンズオン前座モナドハンズオン前座
モナドハンズオン前座
 
関数型プログラミング in javascript
関数型プログラミング in javascript関数型プログラミング in javascript
関数型プログラミング in javascript
 
並行プログラミングと継続モナド
並行プログラミングと継続モナド並行プログラミングと継続モナド
並行プログラミングと継続モナド
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
 
C++11概要 ライブラリ編
C++11概要 ライブラリ編C++11概要 ライブラリ編
C++11概要 ライブラリ編
 
お前は PHP の歴史的な理由の数を覚えているのか
お前は PHP の歴史的な理由の数を覚えているのかお前は PHP の歴史的な理由の数を覚えているのか
お前は PHP の歴史的な理由の数を覚えているのか
 
yieldとreturnの話
yieldとreturnの話yieldとreturnの話
yieldとreturnの話
 
templateとautoの型推論
templateとautoの型推論templateとautoの型推論
templateとautoの型推論
 
業務報告会
業務報告会業務報告会
業務報告会
 
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
 
言語処理系入門4
言語処理系入門4言語処理系入門4
言語処理系入門4
 
Scala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみたScala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみた
 
Emcjp item33,34
Emcjp item33,34Emcjp item33,34
Emcjp item33,34
 
Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2
 
Implicit Implicit Scala
Implicit Implicit ScalaImplicit Implicit Scala
Implicit Implicit Scala
 
Java電卓勉強会資料
Java電卓勉強会資料Java電卓勉強会資料
Java電卓勉強会資料
 
2011年12月9日
2011年12月9日2011年12月9日
2011年12月9日
 
C++でHello worldを書いてみた
C++でHello worldを書いてみたC++でHello worldを書いてみた
C++でHello worldを書いてみた
 
勉強会課題①
勉強会課題①勉強会課題①
勉強会課題①
 

Ähnlich wie X hago2 shortcoding 20110827

Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Ransui Iso
 
Material
MaterialMaterial
Material_TUNE_
 
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Ransui Iso
 
テーマ「最適化」
テーマ「最適化」テーマ「最適化」
テーマ「最適化」technocat
 
x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチMasami Ichikawa
 
Usp友の会勉強会、ジャクソン構造図の巻(前編)
Usp友の会勉強会、ジャクソン構造図の巻(前編)Usp友の会勉強会、ジャクソン構造図の巻(前編)
Usp友の会勉強会、ジャクソン構造図の巻(前編)umidori
 
プログラマ講習第3回
プログラマ講習第3回プログラマ講習第3回
プログラマ講習第3回Yuma Yoshimoto
 
Scalaの限定継続の応用と基本
Scalaの限定継続の応用と基本Scalaの限定継続の応用と基本
Scalaの限定継続の応用と基本Kota Mizushima
 
Scalaの限定継続の応用と基本(改訂版)
Scalaの限定継続の応用と基本(改訂版)Scalaの限定継続の応用と基本(改訂版)
Scalaの限定継続の応用と基本(改訂版)Kota Mizushima
 
Boost jp9 program_options
Boost jp9 program_optionsBoost jp9 program_options
Boost jp9 program_optionsnyaocat
 
第12回計算機構成
第12回計算機構成第12回計算機構成
第12回計算機構成眞樹 冨澤
 
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミング(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミングOuka Yuka
 
Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~CHY72
 
人工無脳バトル 1st STEP 回答と解説
人工無脳バトル 1st STEP 回答と解説人工無脳バトル 1st STEP 回答と解説
人工無脳バトル 1st STEP 回答と解説JustSystems Corporation
 
Usp友の会勉強会、ジャクソン構造図の巻(後編)
Usp友の会勉強会、ジャクソン構造図の巻(後編)Usp友の会勉強会、ジャクソン構造図の巻(後編)
Usp友の会勉強会、ジャクソン構造図の巻(後編)umidori
 
Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料時響 逢坂
 
Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料時響 逢坂
 

Ähnlich wie X hago2 shortcoding 20110827 (20)

Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
 
Material
MaterialMaterial
Material
 
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3
 
テーマ「最適化」
テーマ「最適化」テーマ「最適化」
テーマ「最適化」
 
x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチ
 
Usp友の会勉強会、ジャクソン構造図の巻(前編)
Usp友の会勉強会、ジャクソン構造図の巻(前編)Usp友の会勉強会、ジャクソン構造図の巻(前編)
Usp友の会勉強会、ジャクソン構造図の巻(前編)
 
プログラマ講習第3回
プログラマ講習第3回プログラマ講習第3回
プログラマ講習第3回
 
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
 
Scalaの限定継続の応用と基本
Scalaの限定継続の応用と基本Scalaの限定継続の応用と基本
Scalaの限定継続の応用と基本
 
Scalaの限定継続の応用と基本(改訂版)
Scalaの限定継続の応用と基本(改訂版)Scalaの限定継続の応用と基本(改訂版)
Scalaの限定継続の応用と基本(改訂版)
 
Boost jp9 program_options
Boost jp9 program_optionsBoost jp9 program_options
Boost jp9 program_options
 
第12回計算機構成
第12回計算機構成第12回計算機構成
第12回計算機構成
 
C++14言語編
C++14言語編C++14言語編
C++14言語編
 
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミング(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
 
講座C入門
講座C入門講座C入門
講座C入門
 
Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~
 
人工無脳バトル 1st STEP 回答と解説
人工無脳バトル 1st STEP 回答と解説人工無脳バトル 1st STEP 回答と解説
人工無脳バトル 1st STEP 回答と解説
 
Usp友の会勉強会、ジャクソン構造図の巻(後編)
Usp友の会勉強会、ジャクソン構造図の巻(後編)Usp友の会勉強会、ジャクソン構造図の巻(後編)
Usp友の会勉強会、ジャクソン構造図の巻(後編)
 
Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料
 
Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料
 

X hago2 shortcoding 20110827