Skip to content

Instantly share code, notes, and snippets.

@plonk
plonk / kakko.rb
Created February 11, 2014 17:46
(,)言語パーザ
#!/usr/bin/ruby
# encoding: utf-8
# str の位置 i から読み込んで対応する ( , ) の位置を表す
# 三つ組の配列と、終了した位置を返す。
#
# kakko_ten_kokka("(,)", 0)
# => [[[0,1,2]], 3]
def kakko_ten_kokka(str, i)
if str[i] == '('
kakko = i
#!/usr/bin/ruby
# encoding: utf-8
def show(val)
if val.is_a? Array
"(" + val.map {|x| show(x)}.join(',') + ")"
elsif val.is_a? String
val
else
raise TypeError
@plonk
plonk / abcabc.rb
Created February 11, 2014 23:08
(,)言語の文に対して (A*B)*C -> A*(B*C) 変換を行う。
#!/usr/bin/ruby
# encoding: utf-8
=begin
(,)言語の文に対して (A*B)*C -> A*(B*C) 変換を行う。
(... , ...) の形の物をコンマ式と呼ぶ。
... の部分は空であるか、別のコンマ式である。
=end
class CommaExp
@plonk
plonk / brainfuck.rb
Created February 14, 2014 08:33
brainf*ck interpreter
module Keyboard
@@buf = []
def self.getchar
if @@buf.empty?
@@buf += gets.chars
end
@@buf.shift
end
end
@plonk
plonk / bfs.rb
Created March 3, 2014 17:44
BFS in Ruby
adjacent = {
:A => %i(B C),
:B => %i(A C D),
:C => %i(A B E),
:D => %i(B E F),
:E => %i(C D G),
:F => %i(D),
:G => %i(E)
}
@plonk
plonk / batchsystem.lisp
Last active August 29, 2015 13:56
バッチシステム
(defun nub (lst)
(cond
((null lst) nil)
(t (destructuring-bind (x &rest xs) lst
(cons x (nub (remove-if (lambda (y) (equal y x)) xs)))))))
(defun iota (n m)
(if (> n m)
nil
(cons n (iota (1+ n ) m))))
@plonk
plonk / stockhistory.lisp
Created March 4, 2014 01:58
StockHistory
(defun zip (&rest llist)
(if (some #'null llist)
nil
(cons (mapcar #'car llist)
(apply #'zip (mapcar #'cdr llist)))))
(defun list-last (ls)
(car (last ls)))
(defun but-last (ls)
@plonk
plonk / slice_before.rb
Created March 11, 2014 04:57
slice_before
# -*- coding: utf-8 -*-
# 手続的
def slice_before1 enum, pred
result = []
this = []
enum.each do |item|
if pred.call item
result << this unless this.empty?
this = [item]
else
@plonk
plonk / pronoun_macro.lisp
Last active August 29, 2015 13:57
複雑な式を、アナフォリックな参照のある複数の式に分割して書けるマクロ
;; start で始まり end で終わる数値のリストを作る。
(defun iota (start end)
(if (<= start end)
(cons start (iota (1+ start) end))
nil))
;; 代名詞 % を使って式を細かく区切るマクロ。
(defmacro ->% (dat &rest xs)
(if xs
`(->% ,(substitute dat '% (car xs)) ,@(cdr xs))
@plonk
plonk / rec_macro.lisp
Created March 12, 2014 06:00
末尾再帰を行う局所関数に処理を丸投げするような関数を簡潔に書くためのマクロ
;; 目的: ツリーの葉を置き換える。
;;
;; 例: (rsub 'x 'a '(9 (a '(a b) c) 10))
;; => (9 (X '(X B) C) 10)
;;
;; 引数: オブジェクト, オブジェクト, リスト -> リスト
;;
(defun rsub (new old ls)
(mapcar (lambda (item)
(if (equal item old)