Визначте, чи є раціональні координати у правильному трикутнику Серпінського


9

Трикутник Серпінського являє собою набір точок на площині , яка будується, починаючи з одного трикутником і неодноразово розділивши все трикутники на чотири конгруентних трикутники і видалення центрального трикутника. Право Серпінського трикутник має кути в (0,0), (0,1)і (1,0), і виглядає наступним чином :

Трикутник Серпінського

Деякі еквівалентні визначення цього набору такі:

  • Бали в nітерації описаного вище процесу для всіх n.

  • Точки (x,y)з 0 <= x <= 1та 0 <= y <= 1таким, що для всіх натуральних чисел n, nбіт у бінарному розширенні x і y не є обома 1.

  • Дозволяє T = {(0,0),(1,0),(0,1)}

    Нехай fбуде функцією на множинах 2D точок, визначених наступним:

    f(X) = {(0,0)} ∪ {(x+t)/2 | x∈X, t∈T}

    Тоді правий Серпінського трикутник є топологічним замиканням по меншій мірі нерухомої точки (по заданій локалізації) з f.

  • Нехай Sбуде площа{(x,y) | 0<=x<=1 and 0<=y<=1}

    Нехай g(X) = S ∩ {(x+t)/2 | x∈(X), t∈T}(де Tвизначено вище)

    Тоді правильний трикутник Сєрпінського є найбільшою фіксованою точкою g.

Виклик

Напишіть програму або функцію, яка приймає 4 цілих числа a,b,c,dі дає тритипове значення, якщо (a/b,c/d)належить правильному трикутнику Сєрпінського, інакше дає значення фальси.

Оцінка балів

Це кодовий гольф. Виграє найкоротший код у байтах.

Тестові справи

У правому трикутнику Сьєрпінського наведено нижче:

0 1 0 1
0 1 12345 123456
27 100 73 100
1 7 2 7
8 9 2 21
8 15 20 63
-1 -7 2 7

У правильному трикутнику Сєрпінського не вказано:

1 1 1 1
-1 100 1 3
1 3 1 3
1 23 1 7
4 63 3 66
58 217 4351 7577
-1 -7 3 7

Чи -1 -3 1 1дійсний вхід?
xnor

Так, це коректний вклад. Я додав тестові випадки, щоб зробити це зрозумілим.
cardboard_box

Відповіді:


5

Пітон 2, 68

lambda n,d,N,D:1>=n/d>=0<=N/D<=1and(n<<abs(D*d))/d&(N<<abs(D*d))/D<1

Гарний спосіб перевірити наявність прокладки, зробив некрасивим. Якби ми гарантували, що вхідні дані невід'ємні та на одиниці квадратних, ми мали б 38:

lambda n,d,N,D:(n<<D*d)/d&(N<<D*d)/D<1

Ідея полягає в тому, що ми перевіряємо, чи лежить точка всередині прокладки, перевіряючи, чи розширюється їх бінарний дріб дрібно-І на 0. Щоб отримати перший kсимвол розширення, ми переміщуємо kбіт чисельника, що залишився перед діленням на ціле число, на знаменник . Нам потрібно зробити kдостатньо великий, щоб повторити. Зауважимо, що бінарне розширення n/dмає період максимум d, тому спільне розширення має період максимум d*D, тому k=d*Dдостатньо.

Решта - перевірити, чи є фракція в коробці, і ізолювати від входів, заданих подібним чином -1/-3.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.