Создание разных сумм


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 Мое плохое, это было намерение. Исправлена.
рандома

Может ли вывод быть списком / массивом / кортежем / множеством и т. Д., Содержащим два целых числа? (Например, f (1) => [2, -1])
монополь

Кажется, есть несколько решений, которые в основном полагаются на ограниченный целочисленный размер - например, путем умножения входных данных на большое положительное и большое отрицательное число. Мне кажется, что такие решения не соответствуют требованию, что «ваш алгоритм должен работать для произвольных больших и малых чисел в теории». Я неправильно понял вопрос?
Матмандан

Ответы:


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

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

Ах да, ты прав, извини.
Maltysen

-в pyth не унарный оператор отрицания, его _, так _J^Q3+QJработает, как и ожидалось.
Maltysen

@ 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
Как страус относится к этому? ;)
Kade

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

Pyth - 11 10 байт

Просто умножаем на 10e10 и -10e10 + 1 Спасибо @xnor за то, что показали мне, что я могу использовать CGдля числа.

*CGQ_*tCGQ

Попробуйте это онлайн здесь .


Вы можете сделать подходящее огромное количество как CG.
xnor

@xnor добавление в список советов.
Maltysen

2

О , 17 15 9 байт

Использует некоторые новые функции O.

Q3 ^ .Q + p_p

Старая версия

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

1
Я начинаю получать удовольствие от этих ответов, хотя мне бы хотелось, чтобы переводчик не был написан на Java ...;)
kirbyfan64sos

@ kirbyfan64sos Он не такой маленький, как Pyth, но в некоторых случаях он может побить CJam & GolfScript. Это вызывающе может побить все, что связано с массивами, так как они такие мощные.
этап

1

Python 3, 29 27

Изменить: не соответствует требованию во втором пункте «Сведения»

Бонус: работает с -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 :)
Kade

1
«... ваш алгоритм должен работать для произвольных больших и малых чисел в теории». Очевидно (lambda n:[99999*n,-99998*n])(99999)и (lambda n:[99999*n,-99998*n])(-99998)столкнется в теории (и на практике).
Матмандан

@mathmandan Вы правы, я отредактирую свой пост, чтобы было ясно, что он не соответствует требованиям. Я бы попытался написать и протестировать новый код, но я на мобильном телефоне вдали от своего компьютера.
Монополь

0

Haskell, 16 байт

Я беззастенчиво скопировал метод @ xnor. Там, вероятно, не намного лучше, чем это.

f x=(-x^3,x^3+x)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.