Висхідна матриця


17

"Висхідна матриця" - це нескінченна матриця цілих чисел (включено 0), в якій будь-який елемент є найменшим доступним елементом, який раніше не використовувався у відповідному рядку та стовпці:

  | 1 2 3 4 5 6 ...
--+----------------
1 | 0 1 2 3 4 5 ...
2 | 1 0 3 2 5 4 ...
3 | 2 3 0 1 6 7 ...
4 | 3 2 1 0 7 6 ...
5 | 4 5 6 7 0 1 ...
6 | 5 4 7 6 1 0 ...
. | ...............

Ваше завдання - написати програму, яка буде виводити елемент, знайдений у рядку та стовпці, визначених вхідними даними. (стандартний вхід і вихід)

Тестові приклади:

5 3 -> 6
2 5 -> 5

Діють правила гольф-коду - виграє найкоротший код.

PS Навіть якщо це має алгоритмічну природу, код може бути дуже, дуже стислим.

EDIT: Я не очікував побачити рішення xor так рано. Я дуже сподівався побачити 10 публікацій з алгоритмічним підходом, а потім рішення xor. Тепер, маючи на увазі, що не так весело бачити, як писати xor на різних мовах, рекомендую також спробувати алгоритмічний підхід.

Так, так, я думаю, зараз ніхто не може перемогти позначку 5 символів - тому я вітаю Ільмарі Каронен за найрозумніше і найкоротше рішення. Але попереду новий виклик: написати найкоротший алгоритмічний розв’язок .


5
Xor - алгоритмічний.
Пітер Тейлор

Відповіді:


10

GolfScript, 5 символів

~(\(^

Дійсно, це завдання стає дуже простим, як тільки ви розпізнаєте шаблон. Єдиний незручний біт - індексація на основі 1 - якби вхідні індекси були нульовими, цього 2-символьного рішення буде достатньо:

~^

Щоб пояснити це читачам, незнайомим GolfScript, ~команда оцінює вхід, залишаючи два числа у стеку. ^потім XOR - два найвищих числа на стеку разом, залишаючи результат для виведення. Щоб мати справу з введенням на основі 1, потрібні ще дві команди: (зменшення найвищого числа в стеку на одну, в той час як \підміняє два верхні елементи на стеку.


1
Не могли б ви пояснити ^? Я посилався на вбудовану сторінку GolfScript та симетричну різницю ; використання цієї операції з двома наборами масивів має сенс, але я не розумію, як це працює лише для двох окремих чисел.
Роб

1
@Mike: При застосуванні до чисел ^оператор повертає їх побітовий XOR .
Ільмарі Каронен

Це дуже круті стосунки :)
beary605

1
Ви правильно оцінили мою відповідь, яку я з тих пір усунув, що ґрунтувався на неправильному читанні виклику.
DavidC

2

Математика 10 44

Редагувати

Моя перша відповідь ґрунтувалася на нерозумінні природи виклику, як зазначив Ілмарі. Ось ще одна спроба.

Використання

f[n___, 1, n___] := n - 1;
j_~f~k_ := BitXor[j - 1, k - 1]

@IlmariKaronen Я думаю, що цього разу зрозумів. Але це навіть не наближається до розміру вашого рішення.
DavidC

2

К, 31

{0b/:{(x|y)&~x~y}. 0b\:'-1+x,y}

Викрав логіку Ілмарі Каронена XOR, яку я ніколи не помітив би сам.


2

PHP, 38

Просто проста реалізація XOR Ільмарі Каронена

<?php echo --$_GET['a']^--$_GET['b']?>

Використання:

... / xor.php? a = 4 & b = 7

буде надруковано 6


2

Haskell 174

Подумав, що я прийму рішення, яке не покладається на XOR. Занадто ліниво грати в нього належним чином.

a 0 0=0
a b c
 |m==n=a(b-m)(c-n)
 |m>n=m+a(b-m)c
 |m<n=n+a b(c-n)
 where{g f=until(>f)(*2)1`div`2;m=g b;n=g c;}
main=do
 [x,y]<-fmap(map read.words)getLine
 print$a(x-1)(y-1)

Редагувати: Я через день зрозумів, що це просто обчислення XOR. Таким чином, якщо це вважатиметься алгоритмічним рішенням, так це має бути і Ільмарі Каронен.


2
Занадто ліниво грати в нього належним чином. - будь ласка, гольф подання, щоб воно було серйозним суперником.
Джонатан Фрех

2

Пітон 2, 36

Я думаю, оскільки я тільки починаю дізнаватися Python, що це був ідеальний час, коли я надішлю свою першу відповідь, використовуючи її (і ніхто не відповів, використовуючи Python), і, можливо, я міг би отримати якісь відгуки.

Дякую @IlmariKaronen за дуже класний ярлик.

Дякуємо @Gareth за наведений нижче код.

import sys
print(input()-1^input()-1)

Пітон 3, 56

Оригінальна програма, яку я написав.

import sys
x=int(input())
y=int(input())
x-=1
y-=1
print(x^y)

IDEONE з 2 і 5

IDEONE з 3 і 3


Я припускаю, що ви використовуєте Python 2, а не Python 3 - якщо не ігнорувати цей коментар. inputвже оцінює вхід, тому це int()не повинно бути необхідним. Крім того, оскільки ви отримуєте Int безпосередньо від input()вас, ви можете зробити це -1відразу. Ви також можете повністю позбутися змінних посередників і піти правильно print(input()-1^input()-1). Щодо того, чи потрібен імпорт чи ні - інші користувачі Python на цьому веб-сайті не включають його для програм, які використовують input(), але я не програміст Python, тому я не можу сказати, потрібен він чи ні.
Гарет

@Gareth Насправді я використовував Python 3, але мені подобається використовувати вашу пропозицію print(input()-1^input()-1). Дякую за допомогу!
Роб

Чи можу я запитати, чому ви імпортуєте sys?
Джонатан Фрех




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