有哪些看似簡單其實非常精妙的代碼?
c c++ java python object-c java script Visual Basic PHP 彙編
MATLAB。。。。。
racket ml haskell coq idris agda wolfram (想要看似簡單其實精妙的代碼,怎麼能不用這些語言呢?
TCBE「如何用 100 行 hs 寫強類型函數式語言的解釋和 TC」,而且因為用了 HOAS,因此實現了 Substitution-free,速度極快……
https://github.com/AndrasKovacs/tcbe/blob/master/Minimal.hs
module Minimal where
import Prelude hiding (pi)
import Control.Monad
import Data.Either
import Data.HashMap.Strict (HashMap, (!))
import qualified Data.HashMap.Strict as HM
import Syntax (RawTerm)
import qualified Syntax as S
import Debug.Trace
data Term = Var !Int
| App Term Term
| Lam Term Term
| Pi Term Term
| Star
deriving (Eq)
data Val
= VVar !Int
| VApp Val Val
| VLam Type (Val -&> Val)
| VPi Type (Val -&> Val)
| VStar
data Infer
= Ok Type
| IPi Type (Val -&> TM Infer)
type Type = Val
type Cxt = ([Val], [Type], Int)
type TM = Either String
cxt0 :: Cxt
cxt0 = ([], [], 0)
(&<:) :: (Val, Type) -&> Cxt -&> Cxt
(&<:) (v, t) (vs, ts, d) = (v:vs, t:ts, d + 1)
(&<::) :: Type -&> Cxt -&> Cxt
(&<::) t (vs, ts, d) = (VVar d:vs, t:ts, d + 1)
vapp :: Val -&> Val -&> Val
vapp (VLam _ f) x = f x
vapp f x = VApp f x
quoteInfer :: Int -&> Infer -&> TM Term
quoteInfer d = case
Ok ty -&> pure $ quote d ty
IPi a b -&> Pi (quote d a) &<$&> (quoteInfer (d + 1) =&<&< b (VVar d))
evaluate :: [Val] -&> Int -&> Term -&> Val
evaluate vs d = case
Var i -&> vs !! (d - i - 1)
App f x -&> evaluate vs d f `vapp` evaluate vs d x
Lam a t -&> VLam (evaluate vs d a) $ v -&> evaluate (v:vs) (d + 1) t
Pi a b -&> VPi (evaluate vs d a) $ v -&> evaluate (v:vs) (d + 1) b
Star -&> VStar
quote :: Int -&> Val -&> Term
quote d = case
VVar i -&> Var i
VApp f x -&> App (quote d f) (quote d x)
VLam a t -&> Lam (quote d a) (quote (d + 1) (t (VVar d)))
VPi a b -&> Pi (quote d a) (quote (d + 1) (b (VVar d)))
VStar -&> Star
check :: Cxt -&> Term -&> Term -&> TM ()
check cxt@(_, _, d) t expect = do
tt &<- quoteInfer d =&<&< infer cxt t
unless (tt == expect) $ Left "type mismatch"
infer :: Cxt -&> Term -&> TM Infer
infer cxt@(vs, ts, d) = case
Var i -&> pure $ Ok (ts !! (d - i - 1))
Star -&> pure $ Ok VStar
Lam a t -&> do
check cxt a Star
let a" = evaluate vs d a
pure $ IPi a" $ v -&> infer ((v, a") &<: cxt) t
Pi a b -&> do
check cxt a Star
check (evaluate vs d a &<:: cxt) b Star
pure $ Ok VStar
App f x -&>
infer cxt f &>&>= case
IPi a b -&> do
check cxt x (quote d a)
b (evaluate vs d x)
Ok (VPi a b) -&> do
check cxt x (quote d a)
pure $ Ok $ b (evaluate vs d x)
_ -&> Left "Can"t apply non-function"
#define ture true
在知乎上看到的,但已經找不到了原答案了:
return a==b ?a:b
翻譯:如果我和女票的意見統一時聽我的,否則的話,就聽女票的→_→答這道題的基本都是程序員吧?我這個學生物的湊個熱鬧~
我不會碼代碼,不過我看過一些絕妙的代碼,它們大概長這樣:
這是一些叫做「小鼠肝炎病毒」的RNA序列片段,這種病毒(以及許多其他病毒)的遺傳序列有一個特性:
正著編譯是一種蛋白,反過來編譯是另一種蛋白
就好比你的代碼寫成機器碼是0100110001010,那麼正著編譯出來是一個意思,反過來0101000110010則是另一個意思……
病毒的遺傳序列就是精簡到了如此變態的地步……
各位程序員們,要不要嘗試著編一段正反意思不同、且都有意義的編碼呢?
以上
Reference:
Zhang X, Liao C, Lai M M, et al. Coronavirus leader RNA regulates and initiates subgenomic mRNA transcription both in trans and in cis.[J]. Journal of Virology, 1994, 68(8): 4738-4746.
------------
輪子哥在評論里貼了個鏈接,是他寫的代碼,各位可以去圍觀一下
雖然可能已經被說爛了,可初見確實驚艷啊。心想怎麼會有這麼好看的代碼~【花痴臉
快速排序:
qsort [] = []
qsort (x: xs) = qsort l ++ [x] ++ qsort r
where (l, r) = partition (&< x) xs
斐波那契數列:
fib = 1: 1: zipWith (+) fib (tail fib)
來自評論區更短的斐波那契數列:
fib = 1: scanl (+) 1 fib
查了一下 wiki 這兩個實現都是 O(n) 噠~ @vczh
The Fibonacci sequence
篩法求素數:
sieve (p: xs) = p: sieve [x | x &<- xs, mod x p /= 0]
primes = sieve [2..]
評論知友以及樓下有答案提到了《 hacker"s delight 》這本書,裡面有大量這樣的底層優化
以及謝謝評論指出a - b有可能會溢出,所這段代碼普適性確實比較差.. 一般是都是正數或者ICPC題目中比較常見的|a| &<= 10^9 這種
-----------------------------------------------
(b (a - b &>&> 31) | a ~(a - b &>&> 31))
相當於求max(a, b),僅適用於有符號32位int, 但同理可以改成16位,64位,等等
優點是彙編代碼中完全避免了跳轉語句,在分支檢測效果不好的情況下是巨大的常數優化
如果想測速一下的話,最好是關掉優化測(複雜代碼中開著優化一般也會變快,但是簡單的測試代碼基本上都會被優化掉)
不知道多少年前從 @葉蔚 的QQ空間上看來的:
#define 趁還 while
#define 那個啥 int
#define 總的來說 main
#define 買 cin
#define 賣 cout
#define 進 &>&>
#define 出 &<&<
#define 拜拜了 return
#define 去掉 -=
#define 等於 =
#define 屁 100e4
#define 我說 (
#define 是吧 )
#define 啊 a
#define 那麼就 {
#define 得了 }
#define 呀 ;
#include &
using namespace std;
那個啥 總的來說 我說 那個啥 啊 是吧
那麼就 那個啥 有錢 等於 屁 呀
趁還 我說 有錢 是吧 那麼就
那個啥 多少 呀 買 進 多少 呀 賣 出 多少 呀 有錢 去掉 多少 呀
賣 出 多少 呀 得了
拜拜了 啊 呀 得了
int lowbit(int x)
{
return x-x;
}
樹狀數組裡的這個,太精妙了,樹狀數組使區間求和複雜度降低到了log(n),發明這段代碼的人一定是個天才,而這個lowbit恰恰是最精妙的一部分,可以準確的找到我們需要加的部分,巧妙的利用了計算機的位運算
被離職程序員拿走不謝
#define TRUE (_LINE_ % 13 != 0)
#define &>= &>
曾經在某著名blog上看到有人吹lisp。然後拿python舉例,python本身夠靈活了吧?lisp和python相比怎麼樣呢?然後lisp方給出的例子是一個累加器生成器f:
調用 f(k) 產生返回一個初始值為k的累加器 g,然後每次調用 g(m),都會在先前基礎上加上m並返回結果。
python,特別是2.x的版本由於對閉包local等機制支持不太完整很難寫出很漂亮的解決方案。但是lisp可以。然後blog結論當然是lisp吼啦。
評論區下面一堆人拿各類語言寫,試圖孬lisp。其中最短一個幾乎肯定吊打lisp:
f=n=&>i=&>n+=i
對這是 ECMAScript6。對於這個問題幾乎不可能有更短的答案了(12個字元長)。
這個答案基本相當於:
var f = function(n) {
return function(i) {
n = n + i;
return n;
}
}
應該到這裡就結束了。但是我們應該反思一下,為什麼ECMAScript6在這裡可以寫這麼短。我想原因主要有:
- javascript全局變數不用聲明類型,前面也不需要加auto/var/let,這樣一來(其他不變時)相比靜態類型的肯定更短
- javascript允許單行後面不帶分號,至少少一個字元
- javascript繼承了部分C的表達式均有值的概念,因此累加結果n+=i直接可以返回,python等做不到
- javascript天然的相對完善雖然略奇怪的閉包支持。沒閉包或者不完整的做這項工作很頭疼
- javascript中函數很接近first-class,不需要像c++/python等特地搞lambda範式的聲明,或者有非常顯式的內聯函數
- ecmascript6箭頭運算符的引入大大簡化匿名函數,並且可以輕鬆級聯
----------------------------
由於和問題無關,我也不吹不黑問題以外的lisp, js, python到底如何。
???寫記敘文都可以引戰,在下不奉陪。
long long ago
double kill
……
//從0到n-1中隨機等概率輸出m個不同的數
證明: 1.輸出不同的m個值: 由這個for循環循環n次,且在滿足條件時才輸出i,可知,輸出不同值的要求已滿足,因為每次輸出的都是i值,而i值每次都是不一樣的,m--保證了程序在輸出了m個值後就不再輸出i。 2.等概率: 在i=0時,rand()%(n-i)的取值範圍為0到n-1,共n個數,此時要輸出0隻需要rand()%(n-i)小於m,故i=0被輸出的概率為m/n;//假設輸入的n遠大於m
void knuth(int n, int m)
{
for (int i = 0; i &< n; i++) {
if (rand() % (n - i)&
在i=1時,rand()%(n-i)的取值範圍為0到n-2,共n-1個數,若i=0沒有被輸出,則m--未被執行,此時i=1被輸出的概率為m/(n-1),若i=0已經被輸出了,則m變為m-1,此時i=1被輸出的概率為(m-1)/(n-1);由概率論的知識,可知此時i=1被輸出的概率為
P=(1-m/n)*(m/(n-1))+m/n*((m-1)/(n-1))=m/n;
以此類推,可知每個數被輸出的概率都為m/n。
這次要說的是一段HTML代碼,同時也是知乎的一個頁面,很簡單,如下圖:
我相信,學過一段時間的HTML CSS,很快就能實現這樣一個頁面。
這也是一個網站標配的提示頁面,如果用戶的瀏覽器版本比較舊,就提示用戶升級,以免影響正常的瀏覽。
當然,如果你是比較現代的瀏覽器,那就不會看到這個頁面了,可以使用下面的方式看到這個頁面:
這本沒什麼,精妙的地方來了,右鍵,審查元素「直接進入知乎」——
目光不要移開:
感受到了來自知乎的「善意」了么?
斷句後: Get in zhihu because I am stupid.
如果你曾經用舊瀏覽器訪問過知乎,並且還「直接進入知乎」了,那……
補一個簡單的代碼片段,希望還沒有人提到:
大家都知道,替換兩個變數的值,一般需要引入第三個變數,下面的代碼就不需要,但是,這個方法了解一下就好,別在項目中使用,具體見評論區:
假設這兩個變數是a , b
a = a^b
b = a^b
a = a^b
基本上c系的語言都支持,打開瀏覽器的console也可以一試。
沉睡排序法(sleep sort),複雜度O(wtf)
補充:
箭頭函數有人看不太明白,翻譯一下
/*-----------------------------------------*/
var numbers = [...]
numbers.forEach(
function(num){
setTimeout(function(){
console.log(num)
},num);
});
補充一個
[].forEach.call($$("*"),function(a){a.style.outline="1px solid #"+(~~(Math.random()*(1&<&<24))).toString(16)})
顯示頁面元素邊框
據說來自某谷歌工程師,膜拜。
轉載,侵刪:原貼地址 http://blog.chinaunix.net/uid-233938-id-162628.html 一段列印自己的小程序
#include &
#include &
extern char * _binary_test_c_start;
int main()
{
printf("%s", (char *)_binary_test_c_start);
}
Makefile
SRC = test.c
TAR = t
ALL:test.c
objcopy -I binary -O elf32-i386 -B i386 test.c test.bin
gcc -o t test.c test.bin
一段代碼列印自己,但是這樣寫還是有一些隱患的,不過確實很有意思
再深入看這個問題,發現很有意思:The Quine Page (self-reproducing code)
while(1)
{
printf("a");
}
試過的都知道
作為一個在上課時試過的人,說多了全是淚書名《演算法競賽:入門經典》劉汝佳
4.27更新
之前寫 判斷是否相等並返回
if(a==b)
return 1;
else
return 0;
直到今天看《演算法》
return a==b;
突然感覺到自己思維的局限
# P is the list of coordinates of vertices of the polygon
def polygon_area(P):
n = len(P)
P.append(P[0])
S = 0
for i in range(0, n):
x1,y1 = P[i]
x2,y2 = P[i + 1]
S = S + (x1 + x2) * (y2 - y1)
return 0.5 * abs(S)
P是多邊形端點坐標的列表。給定端點坐標,該函數可以計算任意簡單多邊形的面積,也就是說三角形、四邊行、六邊行以及各種奇形怪狀的多邊形都有統一的計算方法。
推薦閱讀: