- 1
- 2
- 3
- 4
- 5
- 6
sign' ← case sign of
'-' → return '-'
'+' → return ' '
_ → Nothing
hh ← (readMaybe [sign',h1,h2]) :: Maybe Integer
mm ← (readMaybe mm) :: Maybe Integer
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
Всего: 91
−1000
sign' ← case sign of
'-' → return '-'
'+' → return ' '
_ → Nothing
hh ← (readMaybe [sign',h1,h2]) :: Maybe Integer
mm ← (readMaybe mm) :: Maybe Integer
Парсим значение со знаком.
−20
expand_ipv6(Addr) ->
AbbrevAddr = case string:str(Addr, "::") of
0 -> Addr;
_ ->
RemainBlocks = 8 - length(string:tokens(Addr, ":")),
re:replace(Addr,"::",string:copies(":0", RemainBlocks) ++ ":", [{return,list}])
end,
lists:foldl(fun(Block, Acc) ->
Start = case Acc of
[] -> "";
_ -> ":"
end,
RemainZeroes = 4 - length(Block),
ExpandedBlock = Start ++ string:copies("0", RemainZeroes) ++ Block,
Acc ++ ExpandedBlock
end, [], string:tokens(AbbrevAddr, ":")).
IPv6 и эрланг -- это как PHP и даты.
−15
case lists:member($:, Index) of
false -> % this is ipv4
[D4,D3,D2,D1|C] = lists:reverse(string:tokens(Index,".")),
IP = make_dot_string([D1,D2,D3,D4]),
Nw = make_dot_string(lists:reverse(C));
true -> % this is ipv6
[D|C] = lists:reverse(string:tokens(Index,".")),
IP = D,
Nw = make_dot_string(lists:reverse(C))
end
Кручу-верчу, запутать хочу.
−250
guest@localhost ~ $ for i in `seq 13000 14500`; do echo "i=$i"; curl -s "http://govnokod.ru/user/$i" | grep "title>Личная кабинка пользователя" ; done | tee newbs.txt
guest@localhost ~ $ grep -B1 bot_number newbs.txt
i=14276
<title>Личная кабинка пользователя bot_number_0 — Говнокод.ру</title>
i=14277
<title>Личная кабинка пользователя bot_number_00 — Говнокод.ру</title>
i=14278
<title>Личная кабинка пользователя bot_number_000 — Говнокод.ру</title>
i=14279
<title>Личная кабинка пользователя bot_number_0000 — Говнокод.ру</title>
i=14280
<title>Личная кабинка пользователя bot_number_00000 — Говнокод.ру</title>
i=14281
<title>Личная кабинка пользователя bot_number_000000 — Говнокод.ру</title>
i=14282
<title>Личная кабинка пользователя bot_number_0000000 — Говнокод.ру</title>
i=14283
<title>Личная кабинка пользователя bot_number_00000000 — Говнокод.ру</title>
i=14284
<title>Личная кабинка пользователя bot_number_000000000 — Говнокод.ру</title>
i=14285
<title>Личная кабинка пользователя bot_number_000000001 — Говнокод.ру</title>
i=14286
<title>Личная кабинка пользователя bot_number_000000002 — Говнокод.ру</title>
i=14346
<title>Личная кабинка пользователя bot_number_9 — Говнокод.ру</title>
i=14347
<title>Личная кабинка пользователя bot_number_99 — Говнокод.ру</title>
i=14348
<title>Личная кабинка пользователя bot_number_999 — Говнокод.ру</title>
i=14349
<title>Личная кабинка пользователя bot_number_9999 — Говнокод.ру</title>
i=14350
<title>Личная кабинка пользователя bot_number_99999 — Говнокод.ру</title>
i=14351
<title>Личная кабинка пользователя bot_number_999999 — Говнокод.ру</title>
i=14352
<title>Личная кабинка пользователя bot_number_9999999 — Говнокод.ру</title>
i=14353
<title>Личная кабинка пользователя bot_number_99999999 — Говнокод.ру</title>
i=14354
<title>Личная кабинка пользователя bot_number_999999991 — Говнокод.ру</title>
i=14355
<title>Личная кабинка пользователя bot_number_999999992 — Говнокод.ру</title>
i=14356
<title>Личная кабинка пользователя bot_number_999999999 — Говнокод.ру</title>
guest@localhost ~ $ grep -c bot_number newbs.txt
22
guest@localhost ~ $ echo $((13+9))
22
Занимательная нумерология. После void_main было зарегестрировано 22 пользователя с нехитрыми именами bot_number*
Сегодня днём все посты опускались на -13.
Теперь Благодетель поднимает их на +9.
9+13 = 22
И теперь он кукарекает про модерку.
−43
Жила-была маленькая либа для некого специфического IPC c Erlang, которую использовали почти все приложениями на большом-пребольшом
кластере. Писалась она во времена, когда эрланг был медленным и на прологе писаным. Использовалась приложениями она как-то так:
...
libFoo_initialize();
for(int i = 0; i<9001; i++) {
libFoo_registerStuff(bar[i]);
}
continue_my_own_business_logic();
...
В этом году обнаружили мы странный разброс нагрузки на разных узлах кластера. Профилировали-профилировали, да нашли следующее:
void libFoo_initialize(void)
{
do_stuff();
int nap = srand(5);
/* Load balancing, prevent simultaneous registration: */
sleep(nap);
}
Таким образом, наша маленькая либа балансировала нагрузку этого кластера, полного матанных приложений, сложной контрольной логики и
fault-tolerance питушни, десятки лет! Само собой, это никто выпиливать не решился, и фикс был следующим:
void libFoo_initialize2(void (*callback)(void))
{
do_stuff();
int nap = srand(5);
/* Load balancing, prevent simultaneous registration: */
sleep(nap);
callback();
sleep(5-nap);
}
Т.е. цикл с libFoo_registerStuff(bar[i]) переносился в этот колбек. Такие дела.
−22
kobenate :: (MonadVoretion m)
=> Config
-> Disjunct
-> RuleZipper
-> m Disjunct
kobenate cfg d₀ z = uphill d₀ z
where
climb t x =
case parent x of
Just x' -> uphill t x'
Nothing -> return t
uphill t x =
case label <$> parent x of
Just (LinkAnd{}) -> do
i <- downhill' cfg $ reverse $ before x
j <- downhill' cfg $ after x
climb (i \++/ t \++/ j) x
_ ->
case label x of
MultiConnector{} -> do
m <- downhill cfg (tree x)
let t' = t \++/ m
climb t' x
_ ->
climb t x
downhill' :: (MonadVoretion m)
=> Config
-> [Link]
-> m Disjunct
downhill' cfg x = foldl (\++/) ([], []) <$> mapM (downhill cfg) x
downhill :: (MonadVoretion m)
=> Config
-> Link
-> m Disjunct
downhill cfg l0@(Node label subforest) =
case label of
Optional _ ->
ifR (_decay_optional cfg)
{-then-} (downhill cfg $ head subforest)
{-else-} (return ([], []))
MultiConnector _ ->
ifR (_decay_multi cfg)
{-then-} (do
a <- downhill cfg l0
b <- downhill cfg $ head subforest
return $ a \++/ b)
{-else-} (return ([], []))
LinkOr{} ->
downhill cfg =<< pickRandom subforest
LinkAnd{} ->
downhill' cfg subforest
Cost{} ->
downhill' cfg subforest
EmptyLink ->
return ([], [])
Link{_link=i} -> do
case _linkDirection i of
Plus -> return ([], [Left i])
Minus -> return ([Left i], [])
Метод вореции дерева методом вниз, вверх и опять вниз, но сбоку. В индексе храним смещение бата правил, зожатых в отдельный файл. Ворециируем любое подходящее правило из индекса и розжимаем дерево в зиппер. Находим пачку подходящих зипперов, см. http://govnokod.ru/20195, ворециируем любой из них. Вверх идём просто, ничего не ворецируя, ибо нужную кобенацию важно сохранить, а вот сбоку идём вниз, тут уж можно любую кобенацию брать.
−24
findConnections :: LinkID
-> Link
-> [RuleZipper]
findConnections x = go . fromTree
where go z =
case label z of
Link {_link=l}
| x' =*= l -> [z]
| True -> []
_ ->
go' (firstChild z) ++ go' (next z)
go' x = (toList x) >>= go
x' = flipLink x
1) создаём кучу почти полных копий дерева (не совсем полных, т.к. есть какой-никакой tail sharing)
2) но это фиксится тем, что обход дерева заканчивается преждевременно из-за ошибки!
изящный код, который можно породить только в 3 ночи под Sabaton
−61
-- | @'resetT' m@ delimits the continuation of any 'shiftT' inside @m@.
--
-- * @'resetT' ('lift' m) = 'lift' m@
--
resetT :: (Monad m) => ContT r m r -> ContT r' m r
resetT = lift . evalContT
{-# INLINE resetT #-}
-- | @'shiftT' f@ captures the continuation up to the nearest enclosing
-- 'resetT' and passes it to @f@:
--
-- * @'resetT' ('shiftT' f >>= k) = 'resetT' (f ('evalContT' . k))@
--
shiftT :: (Monad m) => ((a -> m r) -> ContT r m r) -> ContT r m a
shiftT f = ContT (evalContT . f)
{-# INLINE shiftT #-}
.... Usage:
Prelude Control.Monad.Trans.Cont> evalCont $ callCC (\done -> reset (done "Ok") >> return "Fuck you!" )
"Fuck you!"
говно прямо в transformers
плохо зделали, тупо
хочу, чтобы возвращалось Ok
−51
data TTree k v =
TNode {
_key :: !k
, _val :: !(Maybe v)
, _eq :: !(TTree k v)
, _left :: !(TTree k v)
, _right :: !(TTree k v)
, _height :: !Int
}
| TTNil
deriving (Show, Generic)
instance (Binary k, Binary v) => Binary (TTree k v)
insertWith' :: (Ord k)
=> (v -> v -> v) -- ^ Conflict resolution function
-> [k] -- ^ Key
-> Int -- ^ Length of the key
-> v -- ^ Value
-> TTree k v -- ^ Tree
-> TTree k v
insertWith' f k1@(k:kt) h v t =
case t of
TTNil ->
insertWith' f k1 h v $ TNode {
_key = k
, _eq = TTNil
, _left = TTNil
, _right = TTNil
, _val = Nothing
, _height = h
}
node@TNode{_key=k0, _height=h0, _val=v0, _eq=eq0, _left=left0, _right=right0} ->
case compare k0 k of
EQ | null kt ->
node {
_val = Just $ maybe v (flip f $ v) v0
}
| True ->
node {
_eq = insertWith' f kt (h-1) v eq0
, _height = max h h0
}
GT ->
node {
_left = insertWith' f k1 h v left0
, _height = max h h0
}
LT ->
node {
_right = insertWith' f k1 h v right0
, _height = max h h0
}
{-# SPECIALIZE insertWith' :: (v -> v -> v)
-> [Char]
-> Int
-> v
-> TTree Char v
-> TTree Char v
#-}
а почему бы не использовать несбалансированное тернанрое дерево для индекса
вроде ничего стра
Out of memory: Kill process 2987 (govno) score 265 or sacrifice child
−39
<?php include_once "stdio.h"; ?>
int main()
{
<?php
for($i = 0; $i < 20; $i++)
echo 'printf("%d\n", '.$i.');';
?>
}
You can use PHP as a C preprocessor. The advantages are:
very similiar syntax, so syntax highlighting works.
<? and ?> are not used in standard C (with non-standard C, the only thing that gets broken is old GCC extension operator that returns min/max)
it's rich in libraries.
it's turing complete.
usage of macros is very explicit. (compared to sneaky C preprocessor macros)
For serious use though, making PHP print the #line directives is needed for debugging preprocessed code.
http://stackoverflow.com/questions/396644/replacements-for-the-c-preprocessor/16256052#16256052
ящитаю это гениально