Tworzenie odrębnych sum

10

Powinieneś napisać program lub funkcję, która odbiera liczby całkowite jako dane wejściowe i wyjściowe lub zwraca dwie liczby całkowite, których suma jest pierwsza.

Jest jeszcze jeden wymóg: żadna liczba nie może być częścią wyniku dla dwóch różnych danych wejściowych .

Detale

  • Powinieneś być w stanie obsłużyć dane wejściowe przynajmniej dla zakresu -32768 .. 32767(włącznie).
  • Jeśli twój typ danych nie obsługuje dowolnych liczb całkowitych, nie ma problemu, ale algorytm powinien działać teoretycznie na dowolne duże i małe liczby.

Przykłady

Każdy blok pokazuje część poprawnego lub niepoprawnego rozwiązania w formacie 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.

To jest golf golfowy, więc wygrywa najkrótszy wpis.

randomra
źródło
Czy możesz ograniczyć zakres wejściowy do -32768 .. 32767, abyśmy nie musieli używać 17-bitowych liczb całkowitych?
FUZxxl,
@FUZxxl Mój zły, taki był zamiar. Naprawiony.
randomra
Czy wyjściem może być lista / tablica / krotka / zestaw / etc zawierające dwie liczby całkowite? (Na przykład f (1) => [2, -1])
monopole
Wydaje się, że istnieje kilka rozwiązań, które zasadniczo opierają się na ograniczonej liczbie całkowitej - na przykład poprzez pomnożenie wejścia przez dużą liczbę dodatnią i dużą liczbę ujemną. Wydaje mi się, że takie rozwiązania nie spełniają wymogu, że „twój algorytm powinien działać teoretycznie na dowolne duże i małe liczby”. Czy źle interpretuję pytanie?
matematyk

Odpowiedzi:

9

Pyth, 8 bajtów

_J^Q3+QJ

Demonstracja. Odpowiednik kodu Python 2:

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

Dane wyjściowe mają formę (-n**3, n+n**3)

Niektóre wyjścia:

-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)

Te różnią się, ponieważ kostki są oddalone na tyle daleko, że dodanie ndo n**3nie wystarcza, aby przejść przez szczelinę do kolejnej kostki: n**3 < n+n**3 < (n+1)**3na dodatnie ni symetrycznie na ujemny n.

xnor
źródło
Na początku nie potrzebujesz ,, dwie linie wydają się być dozwolone.
Maltysen
@Maltysen Próbowałem go usunąć, ale drukowany jest tylko drugi numer. Może to Jzadanie pomija drukowanie?
xnor
O tak, masz rację, przepraszam.
Maltysen
-w pyth nie jest jednostronnym operatorem negacji _, więc _J^Q3+QJdziała zgodnie z oczekiwaniami.
Maltysen
@Maltysen Właściwie to działa, po prostu muszę Jnie być na zewnątrz. Dzięki za pogłaskanie mnie w tej sprawie.
xnor
8

Bałwan 0.1.0 , 101 znaków

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

Wejście na STDIN, wyjście rozdzielone spacją na STDOUT.

Używa tej samej metody co odpowiedź Isaacga.

Skomentowana wersja z nowymi wierszami dla „czytelności”:

}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

Komentarz do pierwszego rozwiązania Snowman w PPCG: Myślę, że mój projekt polegał na tym, aby mój język był jak najbardziej zagmatwany.

To mogło być znacznie krótsze, ale jestem idiotą i zapomniałem zaimplementować liczby ujemne dla parsowania ciągów -> liczb. Musiałem więc ręcznie sprawdzić, czy był to -pierwszy znak i usunąć go, jeśli tak jest.

Klamka
źródło
1
O wiele lepszy niż Brainfuck.
faza
1
Co myśli o tym Struś? ;)
Kade
6

Pyth, 15 11 bajtów

4 bajty dzięki @Jakube

*RQ,hJ.aQ_J

Demonstracja.

To mapy w następujący sposób:

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

I tak dalej, zawsze angażując n^2i n^2 + n, plus lub minus.

isaacg
źródło
5

APL, 15 bajtów

{(-⍵*3)(⍵+⍵*3)}

To tworzy nienazwaną funkcję monadyczną, która zwraca parę -n ^ 3 ( -⍵*3), n + n ^ 3 ( ⍵+⍵*3).

Możesz spróbować online .

Alex A.
źródło
2

Pyth - 11 10 bajtów

Wystarczy pomnożyć przez 10e10 i -10e10 + 1 Dzięki @xnor za pokazanie mi, że mogę użyć CGtej liczby.

*CGQ_*tCGQ

Wypróbuj online tutaj .

Maltysen
źródło
Możesz zrobić odpowiednio dużą liczbę jako CG.
xnor
@xnor dodaje do listy porad.
Maltysen
2

O , 17 15 9 bajtów

Korzysta z niektórych nowych funkcji O.

Q3 ^ .Q + p_p

Starsza wersja

[i # .Z3 ^ * \ Z3 ^) _ *] o
faza
źródło
1
Zaczynam cieszyć się tymi odpowiedziami O, choć bardziej bym chciał, gdyby tłumacz nie był napisany w Javie ...;)
kirbyfan64sos
@ kirbyfan64sos Nie jest tak mały jak Pyth, ale w niektórych przypadkach może pokonać CJam i GolfScript. Zdecydowanie może pokonać wszystko, co ma związek z tablicami, ponieważ są tak potężne.
faza
1

Python 3, 29 27

Edycja: nie spełnia wymagań drugiego punktu „Szczegóły”

Bonus: działa od -99998 do 99998 włącznie


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

Spowoduje to utworzenie anonimowej funkcji *, której można użyć, umieszczając ją w nawiasach, a następnie umieszczając argument w nawiasach w następujący sposób:

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

* Dzięki @ vioz- za zasugerowanie tego.


Przykładowe wejście / wyjście:

>>> (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]
monopole
źródło
1
Niezły post! Po prostu wiesz, możesz usunąć f=i pozostawić jako funkcję anonimową, co nadal jest poprawną odpowiedzią. Następnie możesz zmniejszyć liczbę bajtów do 27 :)
Kade
1
„... twój algorytm powinien działać teoretycznie na dowolne duże i małe liczby”. Oczywiście (lambda n:[99999*n,-99998*n])(99999)i (lambda n:[99999*n,-99998*n])(-99998)zderzą się w teorii (i w praktyce).
matematyk
@mathmandan Masz rację, zredaguję mój post, aby było jasne, że nie spełnia wymagań. Spróbowałbym napisać i przetestować nowy kod, ale jestem na telefonie komórkowym z dala od komputera.
monopole
0

Haskell, 16 bajtów

Bezwstydnie skopiowałem metodę @ xnor. Prawdopodobnie nie ma nic lepszego niż to.

f x=(-x^3,x^3+x)
Lynn
źródło