Створення чітких сум


10

Ви повинні написати програму або функцію, яка отримує цілі числа у вигляді введення та виведення або повертає два цілі числа, сума яких є першим.

Є ще одна вимога: жодне число не може бути частиною виводу для двох різних входів .

Деталі

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

Приклади

Кожен блок показує частину правильного чи неправильного рішення у форматі input => output.

1 => 6 -5
2 => -2 4
15 => 20 -5

Incorrect, as `-5` is used in two outputs.

-5 => -15 10
0 => 0 0
1 => 5 6
2 => -5 7

Incorrect, as `5 + 6` isn't `1`.

-1 => -1 0
0 => 6 -6
2 => 1 1

Can be correct if other outputs doesn't collide.

Це кодовий гольф, тому найкоротший запис виграє.


Чи можете ви обмежити діапазон введення до -32768 .. 32767, тому нам не доведеться використовувати 17-бітні цілі числа?
FUZxxl

@FUZxxl Мій поганий, таким був намір. Виправлено.
randomra

Чи може виведенням бути список / масив / кортеж / набір / тощо, що містить два цілі числа? (Наприклад, f (1) => [2, -1])
монополь

Здається, існує кілька рішень, які принципово покладаються на обмежений цілий розмір - наприклад, шляхом множення введення на велике додатне і велике від’ємне число. Мені здається, що такі рішення не відповідають вимозі, що "ваш алгоритм повинен теоретично працювати для довільних великих і малих чисел". Я неправильно читаю питання?
mathmandan

Відповіді:


9

Pyth, 8 байт

_J^Q3+QJ

Демонстрація. Еквівалентний коду Python 2:

Q=input()
J=Q**3
print -J
print Q+J

Отже, вихід має форму (-n**3, n+n**3)

Деякі результати:

-5 (125, -130)
-4 (64, -68)
-3 (27, -30)
-2 (8, -10)
-1 (1, -2)
 0 (0, 0)
 1 (-1, 2)
 2 (-8, 10)
 3 (-27, 30)
 4 (-64, 68)
 5 (-125, 130)

Вони відрізняються тим, що кубики є достатньо рознесеними, що додавання nдо n**3недостатньо, щоб перетнути проміжок до наступного куба: n**3 < n+n**3 < (n+1)**3для позитивного nта симетрично для негативного n.


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

@Maltysen Я спробував її видалити, але друкується лише друге число. Можливо, Jзавдання пригнічує друк?
xnor

О так, ти маєш рацію, вибач.
Мальтісен

-у pyth не є одинарним оператором заперечення, його _так _J^Q3+QJпрацює, як очікувалося.
Мальтісен

@Maltysen Насправді це працює, мені просто потрібно, Jщоб не бути зовні. Дякую за те, що тикаєш мені про це.
xnor

8

Сніговик 0,1,0 , 101 символ

}vg0aa@@*45,eQ.:?}0AaG0`NdE`;:?}1;bI%10sB%nM2np`*`%.*#NaBna!*+#@~%@0nG\]:.;:;bI~0-NdEnMtSsP" "sP.tSsP

Вхід на STDIN, вихід з пробілом на STDOUT.

Для цього використовується той самий метод, що і відповідь isaacg.

Коментована версія з новими рядками для "читабельності":

}vg0aa          // get input, take the first char
@@*45,eQ.       // check if it's a 45 (ASCII for -) (we also discard the 0 here)
// this is an if-else
:               // (if)
  ?}0AaG        // remove first char of input (the negative sign)
  0`NdE`        // store a -1 in variable e, set active vars to beg
;
:               // (else)
  ?}1           // store a 1 in variable e, set active vars to beg
;bI             // active variables are now guaranteed to be beg
%10sB           // parse input as number (from-base with base 10)
%nM             // multiply by either 1 or -1, as stored in var e earlier
2np`*`          // raise to the power of 2 (and discard the 2)
%.              // now we have the original number in b, its square in d, and
                //   active vars are bdg
*#NaBna!*+#     // add abs(input number) to the square (without modifying the
                //   input variable, by juggling around permavars)
@~%@0nG\]       // active vars are now abcfh, and we have (0>n) in c (where n is
                //   the input number)
:.;:;bI         // if n is negative, swap d (n^2) and g (n^2+n)
~0-NdEnM        // multiply d by -1 (d is n^2 if n is positive, n^2+n otherwise)
tSsP            // print d
" "sP           // print a space
.tSsP           // print g

Коментар до самого першого рішення Snowman щодо PPCG: Я думаю, що моя мета дизайну зробити мою мову якомога заплутанішою.

Це насправді могло бути набагато коротше, але я ідіот і забув застосувати негативні числа для розбору рядків -> числа. Тому мені довелося вручну перевірити, чи був -перший символ, і видалити його, якщо так.


1
Шлях краще, ніж Brainfuck.
фаза

1
Як почувається страус з цього приводу? ;)
Каде

6

Pyth, 15 11 байт

4 байти завдяки @Jakube

*RQ,hJ.aQ_J

Демонстрація.

Це карта наступним чином:

0  -> 0, 0
1  -> 2, -1
-1 -> -2, 1
2  -> 6, -4
-2 -> -6, 4

І ось, завжди з участю n^2і n^2 + n, плюс або мінус.




2

О , 17 15 9 байт

Використовує деякі нові риси О.

Q3 ^ .Q + p_p

Старіша версія

[i # .Z3 ^ * \ Z3 ^) _ *] о

1
Я починаю насолоджуватися цими відповідями на О, хоча мені більше хотілося б, якби перекладач не був написаний на Java ...;)
kirbyfan64sos

@ kirbyfan64sos Це не так мало, як Pyth, але він може перемогти CJam & GolfScript в деяких випадках. Це викликає загрозу будь-що, що стосується масивів, оскільки вони такі потужні.
фаза

1

Пітон 3, 29 27

Редагувати: не відповідає вимозі в 2-й точці відмітки "Деталі"

Бонус: працює від -99998 до 99998 включно


lambda n:[99999*n,-99998*n]

Це створює анонімну функцію *, яку ви можете використовувати, уклавши в дужки, а потім розмістивши аргумент у дужках, як це:

(lambda n:[99999*n,-99998*n])(arg)

* Завдяки @ vioz- за те, що він запропонував це.


Приклад введення / виводу:

>>> (lambda n:[99999*n,-99998*n])(1)
[99999, -99998]
>>> (lambda n:[99999*n,-99998*n])(2)
[199998, -199996]
>>> (lambda n:[99999*n,-99998*n])(0)
[0, 0]
>>> (lambda n:[99999*n,-99998*n])(-1)
[-99999, 99998]
>>> (lambda n:[99999*n,-99998*n])(-2)
[-199998, 199996]
>>> (lambda n:[99999*n,-99998*n])(65536)
[6553534464, -6553468928]

1
Гарний пост! Тільки щоб ви знали, ви можете видалити f=та залишити його як анонімну функцію, що все ще є дійсною відповіддю. Тоді ви можете зменшити кількість байтів до 27 :)
Каде

1
"... ваш теоретичний алгоритм повинен теоретично працювати для довільних великих і малих чисел." Очевидно (lambda n:[99999*n,-99998*n])(99999)і (lambda n:[99999*n,-99998*n])(-99998)зіткнеться в теорії (і на практиці).
mathmandan

@mathmandan Ви маєте рацію, я відредагую своє повідомлення, щоб зрозуміти, що воно не відповідає вимогам. Я б спробував написати і перевірити новий код, але я перебуваю на мобільному, далеко від комп'ютера.
монополь

0

Хаскелл, 16 байт

Я безсоромно скопіював метод @ xnor. Мабуть, не набагато краще, ніж це.

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