2014-10-23

vak: (Улыбка)
Задачка из математического кружка:

Три фермера продавали куриц на местном рынке. У одного было 10 куриц, у второго — 16, у третьего — 26. Чтобы не конкурировать между собой, они договорились продавать куриц по одной цене. К обеду они решили, что продажи идут не так уж хорошо, поэтому они все одинаково понизили цену. К концу дня они продали всех куриц. Оказалось, что каждый из фермеров за этот день выручил 35 долларов. Какова была цена за курицу до обеда и после обеда?

Програмка на SQL от Vladimir Begun:
SQL> WITH
2 c$ AS (SELECT /*+ MATERIALIZE */ ROWNUM v FROM dual CONNECT BY LEVEL <= 3500)
3 , c1 AS (SELECT /*+ MATERIALIZE */ v - 1 v FROM c$ WHERE v <= 11)
4 , c2 AS (SELECT /*+ MATERIALIZE */ v - 1 v FROM c$ WHERE v <= 17)
5 , c3 AS (SELECT /*+ MATERIALIZE */ v - 1 v FROM c$ WHERE v <= 27)
6 , cr1 AS (
7 SELECT c.v f, (10 - c.v) s, c$1.v x, c$2.v y
8 FROM c$ c$1, c$ c$2, c1 c
9 WHERE c.v * c$1.v + (10 - c.v) * c$2.v = 3500 AND c$1.v >= c$2.v
10 )
11 , cr2 AS (
12 SELECT c.v f, (16 - c.v) s, c$1.v x, c$2.v y
13 FROM c$ c$1, c$ c$2, c2 c
14 WHERE c.v * c$1.v + (16 - c.v) * c$2.v = 3500 AND c$1.v >= c$2.v
15 )
16 , cr3 AS (
17 SELECT c.v f, (26 - c.v) s, c$1.v x, c$2.v y
18 FROM c$ c$1, c$ c$2, c3 c
19 WHERE c.v * c$1.v + (26 - c.v) * c$2.v = 3500 AND c$1.v >= c$2.v
20 )
21 SELECT /*+ USE_HASH(cr1 cr2 cr3) LEADING(cr1 cr2 cr3) */
22 cr1.f c1_f, cr1.s c1_s, cr2.f c2_f, cr2.s c2_s
23 , cr3.f c3_f, cr3.s c3_s, cr1.x / 100 x$, cr1.y / 100 y$
24 FROM cr1, cr2, cr3
25 WHERE cr1.x = cr2.x AND cr1.y = cr2.y AND cr2.x = cr3.x AND cr2.y = cr3.y
26 /
Находит решение за 34 секунды на процессоре 2.7 ГГц.

Есть также варианты на Паскале и Go. Да, я знаю что программу можно лёгким движение ускорить на пару порядков, но тогда она не будет годиться для измерения скорости разных языков и компиляторов.