Menciptakan Jumlah Yang Berbeda

10

Anda harus menulis sebuah program atau fungsi yang menerima bilangan bulat sebagai input dan menghasilkan atau mengembalikan dua bilangan bulat yang jumlahnya adalah yang pertama.

Ada satu persyaratan lebih lanjut: nomor tidak dapat menjadi bagian dari output untuk dua input yang berbeda .

Detail

  • Anda harus dapat menangani input untuk setidaknya rentang -32768 .. 32767(inklusif).
  • Jika tipe data Anda tidak bisa menangani bilangan bulat acak, itu bagus tapi algoritma Anda harus bekerja untuk bilangan besar dan kecil yang berubah-ubah secara teori.

Contohnya

Setiap blok menunjukkan bagian dari solusi yang benar atau salah dalam format 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.

Ini adalah kode golf sehingga entri terpendek menang.

randomra
sumber
Bisakah Anda membatasi rentang input ke -32768 .. 32767 jadi kami tidak harus menggunakan bilangan bulat 17 bit?
FUZxxl
@ FuZxxl Buruk saya, itu niatnya. Tetap.
randomra
Bisakah output menjadi daftar / array / tuple / set / etc yang mengandung dua bilangan bulat? (Misalnya, f (1) => [2, -1])
monopole
Tampaknya ada beberapa solusi yang secara fundamental bergantung pada ukuran bilangan bulat terbatas - misalnya, dengan mengalikan input dengan jumlah positif dan negatif yang besar. Sepertinya saya bahwa solusi seperti itu gagal dengan persyaratan bahwa "algoritma Anda harus bekerja untuk angka besar dan kecil yang sewenang-wenang dalam teori". Apakah saya salah membaca pertanyaan?
mathmandan

Jawaban:

9

Pyth, 8 byte

_J^Q3+QJ

Demonstrasi. Setara dengan kode Python 2:

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

Jadi, hasilnya berbentuk (-n**3, n+n**3)

Beberapa output:

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

Ini berbeda karena batu yang cukup jauh jarak yang menambahkan nuntuk n**3tidak cukup untuk menyeberangi celah untuk kubus berikutnya: n**3 < n+n**3 < (n+1)**3untuk positif n, dan simetris untuk negatif n.

Tidak
sumber
Anda tidak perlu ,di awal, dua baris tampaknya diizinkan.
Maltysen
@Maltysen Saya mencoba menghapusnya, tetapi hanya angka kedua yang dicetak. Mungkin Jtugas menekan pencetakan?
xnor
Oh ya kamu benar, maaf.
Maltysen
-di pyth bukan operator negasi unary, itu _, jadi _J^Q3+QJberfungsi seperti yang diharapkan.
Maltysen
@Maltysen Sebenarnya, itu berhasil, saya hanya perlu Juntuk tidak berada di luar. Terima kasih telah menyodok saya tentang ini.
xnor
8

Snowman 0.1.0 , 101 chars

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

Input pada STDIN, output yang dipisahkan ruang pada STDOUT.

Ini menggunakan metode yang sama dengan jawaban isaacg.

Versi komentar dengan baris baru, untuk "keterbacaan":

}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

Komentar tentang solusi Snowman pertama di PPCG: Saya pikir tujuan desain saya membuat bahasa saya membingungkan mungkin telah tercapai.

Ini sebenarnya bisa saja jauh lebih pendek, tapi saya bodoh dan lupa menerapkan angka negatif untuk string -> penguraian angka. Jadi saya harus memeriksa secara manual apakah ada -karakter pertama dan hapus jika ada.

Gagang pintu
sumber
1
Jauh lebih baik daripada Brainfuck.
fase
1
Bagaimana perasaan burung unta tentang ini? ;)
Kade
6

Pyth, 15 11 byte

4 byte berkat @Jakube

*RQ,hJ.aQ_J

Demonstrasi.

Ini memetakan sebagai berikut:

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

Jadi, aktif, selalu melibatkan n^2dan n^2 + n, plus atau minus.

isaacg
sumber
5

APL, 15 byte

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

Ini menciptakan fungsi monadik tanpa nama yang mengembalikan pasangan -n ^ 3 ( -⍵*3), n + n ^ 3 ( ⍵+⍵*3).

Anda dapat mencobanya secara online .

Alex A.
sumber
2

Pyth - 11 10 byte

Cukup kalikan dengan 10e10 dan -10e10 +1 Terima kasih kepada @xnor karena telah menunjukkan kepada saya bahwa saya dapat menggunakan CGnomor tersebut.

*CGQ_*tCGQ

Cobalah online di sini .

Maltysen
sumber
Anda dapat membuat jumlah yang sangat besar sebagai CG.
xnor
@xnatau tambahkan ke daftar kiat.
Maltysen
2

O , 17 15 9 byte

Menggunakan beberapa fitur baru O.

Q3 ^ .Q + p_p

Versi Lebih Lama

[i # .Z3 ^ * \ Z3 ^) _ *] o
tahap
sumber
1
Saya mulai menikmati jawaban O ini, meskipun saya lebih suka jika penerjemahnya tidak ditulis di Jawa ...;)
kirbyfan64sos
@ kirbyfan64sos Ini tidak sekecil Pyth, tetapi bisa mengalahkan CJam & GolfScript dalam beberapa kasus. Itu menantang bisa mengalahkan apa pun yang berkaitan dengan array, karena mereka begitu kuat.
fase
1

Python 3, 29 27

Sunting: tidak memenuhi persyaratan pada poin "Rincian" ke-2

Bonus: bekerja mulai dari -99998 hingga 99998 inklusif


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

Ini menciptakan fungsi anonim *, yang dapat Anda gunakan dengan melampirkan tanda kurung dan kemudian menempatkan argumen dalam tanda kurung setelahnya seperti ini:

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

* Terima kasih kepada @ vioz- untuk menyarankan ini.


Contoh input / output:

>>> (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
sumber
1
Pos yang bagus! Asal tahu saja, Anda dapat menghapus f=dan membiarkannya sebagai fungsi anonim, yang masih merupakan jawaban yang valid. Kemudian Anda dapat menghitung jumlah byte Anda menjadi 27 :)
Kade
1
"... algoritmemu seharusnya bekerja untuk angka besar dan kecil yang berubah-ubah dalam teori." Jelas (lambda n:[99999*n,-99998*n])(99999)dan (lambda n:[99999*n,-99998*n])(-99998)akan bertabrakan dalam teori (dan dalam praktiknya).
mathmandan
@mathmandan Anda benar, saya akan mengedit posting saya untuk menjelaskan bahwa itu tidak memenuhi persyaratan. Saya akan mencoba menulis & menguji kode baru tetapi saya sedang mobile jauh dari komputer saya.
monopole
0

Haskell, 16 byte

Saya tanpa malu-malu menyalin metode @ xnor. Mungkin tidak ada yang lebih baik dari ini.

f x=(-x^3,x^3+x)
Lynn
sumber