Skip to content

Instantly share code, notes, and snippets.

Порождение парадигм германских сильных глаголов

Обстановка:

Есть много (порядка сорока, считая значимые диалекты и мертвые языки) германских языков. В них во всех есть похожим образом устроенная глагольная система. Глаголы делятся на два больших надкласса: сильные и слабые. Сильные глаголы образуют формы прошедшего времени и причастия, меняя гласную в корне. Выбор конкретной гласной определяется "абляутным рядом": набором из четырех гласных (или дифтонгов, или нулей), разных абляутных радов много, и конкретный их набор разнится от языка к языку.

Для построения всех форм глагола нужно знать:

  1. язык (и набор абляутных рядов этого языка)
  2. заглавную форму глагола
Незаконченная басня о воробьях.
Стояла пора гнездованья, но после долгих дней, полных тяжелой работы, воробьи сидели в вечерних лучах, расслабляясь и чирикая о том о сём.
„Мы такие маленькие и слабые. Представить себе только, как легка была бы наша жизнь, если бы у нас была сова, которая помогала бы нам вить наши гнёзда!“
„Верно!“, говорит другой, „Она бы могла нам ещё и помочь ухаживать за стариками и птенцами.“
„Она могла давать нам советы; могла бы приглядывать за соседской кошкой,“ добавил третий.
И тогда Пастус, старейшина, сказал: „давайте же пошлем разведчиков во все стороны света, пусть они поищут брошенного совёнка или совиное яйцо. Воронёнок тоже сойдет, или даже детёныш ласки. Это может стать лучшим событием в нашей истории после открытия Бесконечного Вместилища Зерна на заднем дворе“. Стая с энтузиазмом подхватила идею, воробьи повсюду зачирикали, что было мочи.
; Read a number from STDIN
; Read that many lines of input from STDIN. Print output to STDOUT
(defn shashank [s]
(- (count s) (count (partition-by identity s))))
(defn -main []
(println "give me a number of lines followed by that
many lines")
(loop [t (Integer/parseInt (read-line))]
user=> (def lazy-fib (lazy-cat [0 1] (map + lazy-fib (rest lazy-fib))))
#'user/lazy-fib
user=> (count (take 200 lazy-fib))
ArithmeticException integer overflow clojure.lang.Numbers.throwIntOverflow (Numbers.java:1424)
user=> (count (take 200 lazy-fib))
93
user=>
def comp2(f,g):
return lambda x: f(g(x))
def comp(*fs):
return reduce(comp2, fs)
def reduce(reducing_function, fs, initial_value=None):
fs = iter(fs)
v = fs.next() if initial_value is None else initial_value
for f in fs:
v = reducing_function(v, f)
return v
from functools import partial
def reduce(reducing_function, fs, initial_value=None):
fs = iter(fs)
v = fs.next() if initial_value is None else initial_value
for f in fs:
v = reducing_function(v, f)
return v
square = lambda x: x**2
def s(n):
from functools import partial
def reduce(reducing_function, fs, initial_value=None):
fs = iter(fs)
v = fs.next() if initial_value is None else initial_value
for f in fs:
v = reducing_function(v, f)
return v
square = lambda x: x**2
from functools import partial
def reduce(reducing_function, fs, initial_value=None):
fs = iter(fs)
v = fs.next() if initial_value is None else initial_value
for f in fs:
v = reducing_function(v, f)
return v
square = lambda x: x**2
main = do
getLine
pss <- read . lines . getContents
print $ foldr1 pss
-- list of numbers in the form of prime-power pairs
-- e.g. 35 would be [5 1 7 1]
gcd' _ [] = []
gcd' [] _ = []
import Prelude hiding (takeWhile)
sum :: Num a => [a] -> a
sum = foldr (+) 0
product :: Num a => [a] -> a
product = foldr (*) 1
and :: [Bool] -> Bool
and = foldr (&&) True
-- NB pointful function definitions compile just fine without type annotations
and' xs = foldr (&&) True xs