Farklı Toplamlar Yaratma


10

Girdi olarak bir tamsayı alan ve toplamı ilk olan iki tamsayı döndüren bir program veya işlev yazmalısınız.

Başka bir gereklilik daha vardır: iki farklı giriş için hiçbir sayı çıktının bir parçası olamaz .

ayrıntılar

  • En azından aralık -32768 .. 32767(dahil) için girdileri işleyebilmelisiniz .
  • Veri türünüz rastgele tam sayıları işleyemiyorsa, sorun değil, ancak algoritmanız teoride rastgele büyük ve küçük sayılarda çalışmalıdır.

Örnekler

Her blok, doğru veya yanlış bir çözümün biçimini gösterir 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.

Bu kod golf yani en kısa giriş kazanır.


17 bit tam sayıları kullanmak zorunda kalmamak için giriş aralığını -32768 .. 32767 ile sınırlayabilir misiniz?
FUZxxl

@FUZxxl Kötüüm, niyet buydu. Sabit.
randomra

Çıktı iki tamsayı içeren bir liste / dizi / grup / set / vb olabilir mi? (Örneğin, f (1) => [2, -1])
tekel

Temel olarak sınırlı bir tamsayı boyutuna dayanan birkaç çözüm var gibi görünmektedir - örneğin, girdiyi büyük bir pozitif ve büyük bir negatif sayı ile çarparak. Bana öyle geliyor ki, bu tür çözümler "algoritmanız teoride rastgele büyük ve küçük sayılar için çalışmalıdır". Soruyu yanlış mı okuyorum?
mathmandan

Yanıtlar:


9

Pyth, 8 bayt

_J^Q3+QJ

Gösteri. Python 2 koduna eşdeğerdir:

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

Yani, çıktıda (-n**3, n+n**3)

Bazı çıktılar:

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

Küpleri bugüne kadar ilave olduğunu aralıklı olduğundan, bu farklı olan niçin n**3: aşağıdaki küp için boşluk çapraz yeterli değildir n**3 < n+n**3 < (n+1)**3pozitif birleştirilmesi için n, ve simetrik negatif için n.


,Başlangıçta gerekmez , iki satıra izin verilir.
Maltysen

@Maltysen Çıkarmayı denedim, ancak sadece ikinci sayı yazdırılıyor. Belki de Jgörev baskıyı bastırıyor?
xnor

Ah evet haklısın özür dilerim.
Maltysen

-pyth içinde tekli olumsuzlama operatörü değil _, bu yüzden _J^Q3+QJbeklendiği gibi çalışır.
Maltysen

@Maltysen Aslında, bu işe yarıyor, sadece Jdışarıda olmamalı. Bana bu konudan bahsettiğiniz için teşekkürler.
xnor

8

Kardan Adam 0.1.0 , 101 karakter

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

STDIN üzerinde giriş, STDOUT üzerinde boşlukla ayrılmış çıkış.

Bu, isaacg'nin cevabı ile aynı yöntemi kullanır.

"Okunabilirlik" için yeni satırlı yorumlu sürüm:

}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

PPCG'deki ilk Snowman çözümü hakkında yorum: Bence dilimi mümkün olduğunca kafa karıştırıcı hale getirme tasarım hedefime ulaşıldı.

Bu aslında çok daha kısa olabilirdi, ama ben bir aptalım ve string -> sayı ayrıştırma için negatif sayılar uygulamayı unuttum. Bu yüzden -ilk karakter olarak bir olup olmadığını elle kontrol etmek ve varsa kaldırmak zorunda kaldı.


1
Brainfuck'tan çok daha iyi.
Aşama

1
Devekuşu bu konuda ne düşünüyor? ;)
Kade

6

Pyth, 15 11 bayt

@Jakube sayesinde 4 bayt

*RQ,hJ.aQ_J

Gösteri.

Bu harita aşağıdaki gibidir:

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

Ve böylece, her zaman ilgili n^2ve n^2 + nartı veya eksi.


5

APL, 15 bayt

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

Bu, -n ^ 3 ( -⍵*3), n + n ^ 3 ( ⍵+⍵*3) çiftini döndüren adsız bir monadic işlevi oluşturur .

Şunları yapabilirsiniz çevrimiçi denemek .


2

Pyth - 11 10 bayt

Sadece ile çarpar 10e10 ve -10e10 + 1 ile çarpar. Sayı için kullanabileceğimi gösterdiğim için @xnor'a teşekkürler CG.

*CGQ_*tCGQ

Buradan çevrimiçi deneyin .


Oldukça büyük bir sayı yapabilirsiniz CG.
xnor

@xnor ipuçları listesine ekleniyor.
Maltysen

2

O , 17 15 9 bayt

O'nun bazı yeni özelliklerini kullanır.

Q3 ^ SORU + p_p

Eski versiyon

[İ # .Z3 ^ * \ Z3 ^) = *] o

1
Bu O cevapların tadını çıkarmaya başlıyorum, ancak yorumlayıcı Java ile yazılmamışsa daha çok istiyorum ...;)
kirbyfan64sos

@ kirbyfan64sos Pyth kadar küçük değil, ancak bazı durumlarda CJam & GolfScript'i yenebilir. Meydan okurcasına, çok güçlü oldukları için dizilerle ilgili her şeyi yenebilir.
faz

1

Python 3, 29 27

Düzenleme: 2. "Ayrıntılar" madde işareti noktasındaki gereksinimi karşılamıyor

Bonus: -99998'den 99998'e kadar çalışır


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

Bu, parantez içine alındıktan sonra argümanı daha sonra aşağıdaki gibi parantez içine alarak kullanabileceğiniz anonim bir işlev * oluşturur:

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

* Bunu önerdiği için @ vioz- 'e teşekkürler.


Örnek giriş / çıkış:

>>> (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
Güzel mesaj! Bildiğiniz gibi, onu kaldırabilir f=ve anonim bir işlev olarak bırakabilirsiniz, ki bu hala geçerli bir cevaptır. Sonra bayt sayınızı 27'ye düşürebilirsiniz :)
Kade

1
“... algoritmanız teoride büyük ve küçük sayılarda rasgele çalışmalıdır.” Açıkçası (lambda n:[99999*n,-99998*n])(99999)ve (lambda n:[99999*n,-99998*n])(-99998)teoride (ve pratikte) çarpışacaktır.
mathmandan

@mathmandan Haklısın, gönderiyi gereksinimleri karşılamadığını açıkça belirtmek için düzenleyeceğim. Yeni kod yazmaya ve test etmeye çalışırdım ama bilgisayarımdan uzaktayım.
tekel

0

Haskell, 16 bayt

Utanmadan @ xnor'ın yöntemini kopyaladım. Muhtemelen bundan daha iyisi yoktur.

f x=(-x^3,x^3+x)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.