Unterschiedliche Summen erstellen

10

Sie sollten ein Programm oder eine Funktion schreiben, die Ganzzahlen als Eingabe empfängt und ausgibt oder zwei Ganzzahlen zurückgibt, deren Summe die erste ist.

Es gibt noch eine weitere Anforderung: Für zwei verschiedene Eingänge kann keine Nummer Teil der Ausgabe sein .

Einzelheiten

  • Sie sollten in der Lage sein, Eingaben für mindestens den Bereich -32768 .. 32767(einschließlich) zu verarbeiten.
  • Wenn Ihr Datentyp nicht mit beliebigen ganzen Zahlen umgehen kann, ist das in Ordnung, aber Ihr Algorithmus sollte theoretisch für beliebige große und kleine Zahlen funktionieren.

Beispiele

Jeder Block zeigt einen Teil einer korrekten oder falschen Lösung im 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.

Dies ist Code Golf, so dass der kürzeste Eintrag gewinnt.

randomra
quelle
Können Sie den Eingabebereich auf -32768 .. 32767 beschränken, damit wir keine 17-Bit-Ganzzahlen verwenden müssen?
FUZxxl
@FUZxxl Mein schlechtes, das war die Absicht. Fest.
Randomra
Kann die Ausgabe eine Liste / ein Array / ein Tupel / eine Menge / usw. sein, die / die zwei Ganzzahlen enthält? (Zum Beispiel f (1) => [2, -1])
Monopol
Es scheint mehrere Lösungen zu geben, die grundsätzlich auf einer eingeschränkten Ganzzahlgröße beruhen - beispielsweise durch Multiplikation der Eingabe mit einer großen positiven und einer großen negativen Zahl. Es scheint mir, dass solche Lösungen die Anforderung nicht erfüllen, dass "Ihr Algorithmus theoretisch für beliebige große und kleine Zahlen funktionieren sollte". Verstehe ich die Frage falsch?
Mathmandan

Antworten:

9

Pyth, 8 Bytes

_J^Q3+QJ

Demonstration. Entspricht dem Python 2-Code:

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

Die Ausgabe hat also Form (-n**3, n+n**3)

Einige Ausgänge:

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

Diese sind unterschiedlich, da die Würfel so weit voneinander entfernt sind, dass das Hinzufügen nzu n**3nicht ausreicht, um die Lücke zum nächsten Würfel zu überschreiten: n**3 < n+n**3 < (n+1)**3für positiv nund symmetrisch für negativ n.

xnor
quelle
Sie brauchen das ,am Anfang nicht, zwei Zeilen scheinen erlaubt zu sein.
Maltysen
@Maltysen Ich habe versucht, es zu entfernen, aber nur die zweite Nummer wird gedruckt. Vielleicht Junterdrückt die Zuordnung das Drucken?
xnor
Oh ja, du hast recht, sorry.
Maltysen
-in pyth ist nicht der unäre negationsoperator _, es _J^Q3+QJfunktioniert also wie erwartet.
Maltysen
@Maltysen Eigentlich funktioniert das, ich brauche nur das, Jum nicht draußen zu sein. Danke, dass du mich darüber gestoßen hast.
xnor
8

Schneemann 0.1.0 , 101 Zeichen

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

Eingabe auf STDIN, durch Leerzeichen getrennte Ausgabe auf STDOUT.

Dies verwendet dieselbe Methode wie die Antwort von isaacg.

Kommentierte Version mit Zeilenumbrüchen für "Lesbarkeit":

}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

Kommentar zur allerersten Snowman-Lösung für PPCG: Ich denke, mein Designziel, meine Sprache so verwirrend wie möglich zu gestalten, wurde erreicht.

Das hätte tatsächlich viel kürzer sein können, aber ich bin ein Idiot und habe vergessen, negative Zahlen für das Parsen von Strings -> Zahlen zu implementieren. Also musste ich manuell prüfen, ob es ein -als erstes Zeichen gab und es entfernen, wenn ja.

Türknauf
quelle
1
Viel besser als Brainfuck.
Phase
1
Wie fühlt sich Strauß dabei an? ;)
Kade
6

Pyth, 15 11 Bytes

4 Bytes dank @Jakube

*RQ,hJ.aQ_J

Demonstration.

Diese Karte sieht wie folgt aus:

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

Und so weiter, immer mit n^2und n^2 + n, plus oder minus.

isaacg
quelle
5

APL, 15 Bytes

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

Dies erzeugt eine unbenannte monadische Funktion, die das Paar -n ^ 3 ( -⍵*3), n + n ^ 3 ( ⍵+⍵*3) zurückgibt .

Sie können es online versuchen .

Alex A.
quelle
2

Pyth - 11 10 Bytes

Multipliziert einfach mit 10e10 und -10e10 + 1 Vielen Dank an @xnor, dass er mir gezeigt hat, dass ich ihn CGfür die Zahl verwenden kann.

*CGQ_*tCGQ

Probieren Sie es hier online aus .

Maltysen
quelle
Sie können eine entsprechend große Zahl als machen CG.
xnor
@xnor zur Liste der Tipps hinzufügen.
Maltysen
2

O , 17 15 9 Bytes

Verwendet einige neue Funktionen von O.

Q3 ^ .Q + p_p

Ältere Version

[i # .Z3 ^ * \ Z3 ^) _ *] o
Phase
quelle
1
Ich fange an, diese O-Antworten zu genießen, obwohl es mir mehr gefallen würde, wenn der Interpreter nicht in Java geschrieben wäre ...;)
kirbyfan64sos
@ kirbyfan64sos Es ist nicht so klein wie Pyth, aber es kann CJam & GolfScript in einigen Fällen schlagen. Es kann trotzig alles schlagen, was mit Arrays zu tun hat, da sie so mächtig sind.
Phase
1

Python 3, 29 27

Bearbeiten: Erfüllt nicht die Anforderung im 2. Aufzählungspunkt "Details"

Bonus: Es funktioniert von -99998 bis einschließlich 99998


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

Dadurch wird eine anonyme Funktion * erstellt, die Sie verwenden können, indem Sie in Klammern setzen und das Argument anschließend wie folgt in Klammern setzen:

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

* Danke an @ vioz- für den Vorschlag.


Beispiel Eingabe / Ausgabe:

>>> (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]
Monopol
quelle
1
Netter Post! Damit Sie wissen, können Sie das entfernen f=und als anonyme Funktion belassen, was immer noch eine gültige Antwort ist. Dann können Sie Ihre Byteanzahl auf 27 reduzieren :)
Kade
1
"... Ihr Algorithmus sollte theoretisch für beliebige große und kleine Zahlen funktionieren." Offensichtlich (lambda n:[99999*n,-99998*n])(99999)und (lambda n:[99999*n,-99998*n])(-99998)wird in der Theorie (und in der Praxis) kollidieren.
Mathmandan
@mathmandan Du hast recht, ich werde meinen Beitrag bearbeiten, um klar zu machen, dass er nicht den Anforderungen entspricht. Ich würde versuchen, neuen Code zu schreiben und zu testen, aber ich bin nicht auf meinem Computer unterwegs.
Monopol
0

Haskell, 16 Bytes

Ich habe schamlos die Methode von @ xnor kopiert. Es gibt wahrscheinlich nicht viel besseres als das.

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