Einführung
In dieser Challenge solltest du eine ganze Zahl in zwei Teile teilen. Da niemand das kleinere Stück Kuchen mag, ist es Ihr Ziel, so fair wie möglich zu sein. Wenn Sie beispielsweise die Ganzzahl 7129
in zwei Teile teilen möchten , gibt es drei Möglichkeiten.
7,129
, 71,29
und es 712,9
gibt alle Möglichkeiten, aber es 71,29
ist die fairste Art, es in zwei Teile aufzuteilen, weil es den Unterschied zwischen den beiden minimiert:
7 129 -> |7-129| = 122
71 29 -> |71-29| = 42
712 9 -> |712-9| = 703
Herausforderung
Bestimmen Sie anhand einer Ganzzahl die bestmögliche Partitionierungsmethode wie oben beschrieben und geben Sie die resultierende Differenz an.
Regeln
- Das Teilen ist nur für ganze Zahlen mit einer Länge von mindestens zwei sinnvoll. Die Eingabe ist immer ≥ 10
- Die Eingabe kann entweder eine Ganzzahl, eine Ziffernliste oder eine Zeichenfolge sein
- Sie müssen keine ungültigen Eingaben verarbeiten
Testfälle
Sie müssen nur den resultierenden Unterschied melden, die Partitionierung dient nur zur Veranschaulichung:
10 -> 1,0 -> 1
11 -> 1,1 -> 0
12 -> 1,2 -> 1
13 -> 1,3 -> 2
101 -> 1,01 -> 0
128 -> 12,8 -> 4
313 -> 3,13 -> 10
1003 -> 1,003 -> 2
7129 -> 71,29 -> 42
81128 -> 81,128 -> 47
999999 -> 999,999 -> 0
9999999 -> 999,9999 or 9999,999 -> 9000
05AB1E , 9 Bytes
Code:
Verwendet die 05AB1E- Codierung. Probieren Sie es online!
Erläuterung
quelle
£
mit°‰
brauchen Sie nicht¤â
mehr.Python 2 , 64 Bytes
Probieren Sie es online!
quelle
Perl 6 , 40 Bytes
Probier es aus
Erweitert:
quelle
C 94 Bytes
Probieren Sie es online!
quelle
Python 2 , 51 Bytes
Probieren Sie es online!
quelle
Prolog (SWI) ,
195189154117112 BytesDank Eminga 35 Bytes gespart
Probieren Sie es online!
Dies ist mein erster Versuch im Prologgolf, es kann also ein bisschen schrecklich sein. So funktioniert es.
Auf höchstem Niveau haben wir
*
.*
NimmtA
undH
und bestimmt, obH
der kleinste Weg zum Teilen istA
.In der ersten Zeile wird eine Technik aus diesem SO-Post verwendet , um im Wesentlichen eine Zuordnung des Prädikats
r(A)
über die ganzen Zahlen von0
bis durchzuführenA
. Dar
die Werte der einzelnen Partitionen bestätigt werden, erhalten wir die Werte aller möglichen Partitionen plus eine ganze Ladung zusätzlichen Mülls. Alle diese Partitionen werdenL
in keiner bestimmten Reihenfolge gespeichert . Sobald dies erledigt ist, sortieren wir die Liste, um das kleinste Element zu finden. Wir verwenden dann einen Schnitt, um ein Zurückverfolgen zu verhindern.Als nächstes haben wir die Definition von
r
. Zuerstr
berechnet die beiden Ergebnisse der geteilten Namen sieX
undY
.Dann behaupten wir, dass
C
das der Unterschied von ihnen ist und positiv ist.quelle
X is div(A,10**B),Y is div(A,10**B)
geben, der immer geben wirdC=0
(die BedeutungH
wird auch immer 0 sein ). SollteY is mod(A,10**B)
ich annehmen.r(A,B,C):-Z is 10**B,divmod(A,Z,X,Y),C is abs(X-Y).
32 Bytes gespart werden (wenn Sie mindestens den SWI-Prolog verwenden, sind Sie sich bei anderen Versionen nicht sicher).A*H
anstattl(A,H)
weitere 3 zu speichern. Wenn Sie SWI verwenden, können Sie einen TIO-Link,!
brauchst, oder? Zu diesem Zeitpunkt sollte es keine Rückverfolgung geben.,!
wäre nicht notwendig, aber wenn ich das Programm teste, wird es zurückverfolgt. Es scheint, jede mögliche Bestellung von zu versuchenL
und sie alle dann zu sortieren. Das bedeutet, dass es die gleichen Antwortzeiten gibtA!
.Haskell ,
6865 BytesProbieren Sie es online!
Erläuterung
quelle
Holzkohle , 14 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Praktischerweise bekomme ich die 2-arg-Variante von
Slice
. Erläuterung:quelle
Gelee ,
98 BytesProbieren Sie es online!
-1 Byte dank Dennis. Die Eingabe ist eine Liste von Ziffern.
Erläuterung
quelle
Funky ,
15913499 BytesEigentlich passt die Spezifikation kürzer, wie es scheint.
Probieren Sie es online!
quelle
Netzhaut , 36 Bytes
Probieren Sie es online!
Erläuterung
Dadurch werden alle möglichen Partitionen in separaten Zeilen sowie eine nachfolgende Zeile mit der ursprünglichen Eingabe generiert.
Wandle jede Zahl in jeder Partition in eine unäre um.
Entferne eine maximale und gleiche Menge von
1
s von beiden Teilen jeder Partition (dh entferne das Minimum und subtrahiere es vom Maximum, was die absolute Differenz ergibt).Sortieren Sie die Zeilen.
Zähle das
1
s in der ersten Zeile, was den minimalen absoluten Unterschied ergibt.quelle
J ,
32, 27,23 Bytes-5 Bytes dank FrownyFrog! -4 Byte, wenn die Eingabe eine Zeichenfolge ist.
Probieren Sie es online!
Original: Nimmt eine Zahl als Eingabe
Wie es funktioniert:
Probieren Sie es online!
quelle
JavaScript (ES6), 64 Byte
Übernimmt die Eingabe als Zeichenfolge.
Testfälle
Code-Snippet anzeigen
Kommentiert
Nicht rekursiv (ES7), 65 Byte
Übernimmt die Eingabe als Zeichenfolge.
Testfälle
Code-Snippet anzeigen
Kommentiert
Hinweis :
l
Wird in beiden Versionen bei der ersten Iteration zu einer Zeichenfolge gezwungen. Normalerweise sollten wir vorsichtig mit führenden Nullen in einem numerischen Literal sein:0123 - 10 === 73
weil0123
es als Oktalwert analysiert wird (dies ist jetzt veraltet, aber im nicht strengen Modus immer noch gültig). Aber'0123' - '10' === 113
, die führende Null wird diesmal ignoriert. Es ist also vernünftig, dies zu tun.Aus der Spezifikation der abstrakten Operation,
ToNumber
die auf eine Zeichenfolge angewendet wird:quelle
APL (Dyalog) , 27 Bytes
Probieren Sie es online!
Wie?
¯1+≢⍵
- Länge vonn
minus 1∘.=⍨⍳
- Identitätsmatrix1,
- Voranstellen1
für jede Zeile↓
- durch Reihen geteilt⊂∘⍵¨
- Partitionieren Sie für jede Zeichenfolge die Zeichenfolge↑
- ebnen-/
- Reduziere jedes Paar durch Subtraktion|
- Absolutwerte nehmen⌊/
- MinimumAPL (Dyalog) , 35 Bytes
Probieren Sie es online!
quelle
Jelly , 11 Bytes
Probieren Sie es online!
-3 Bytes dank Dylnan
Wie es funktioniert
quelle
L=2$$Ðf
umṖLÐṂ
in diesem FallPython 2 , 58 Bytes
Probieren Sie es online!
quelle
Pyth , 15 Bytes
Probieren Sie es online!
quelle
MATL , 15 Bytes
Die Eingabe ist eine Zeichenfolge, die die Ganzzahl darstellt.
Probieren Sie es online! Oder überprüfen Sie alle Testfälle .
Erläuterung
quelle
Wolfram Language (Mathematica) , 66 Bytes
Nimmt eine Liste von Ziffern.
Probieren Sie es online!
quelle
Sauber ,
10683 BytesDefiniert die Funktion
@
, wobei eine Zeichenfolge verwendet wird.Meistens ist es selbstverständlich, dass das einzige schwierige Bit ist
f=toInt o(%)n
: Es nimmt dietoInt
Klasse der Funktionen und setzt sie (o
) mit der Klasse des Curry-Slice-Operators (%
) zusammen, die bereits mit dem ersten Argument (n
) geliefert wurde . Da es nur einen (String
äquivalenten{#Char}
) Typ gibt , der für beide überladen ist,%
undtoInt
die Zeile tatsächlich kompiliert, ist es normalerweise schwierig, Funktionen beim Golfen zu kompilieren, da dem Compiler keine kontextbezogenen Informationen zur Verfügung stehen.Probieren Sie es online!
quelle
Gelee , 12 Bytes
Ein monadischer Link, der eine Liste von Ziffern erstellt und die Ganzzahl zurückgibt.
Probieren Sie es online!
Wie?
quelle
Pyth, 10 Bytes
Testsuite
Übernimmt die Eingabe als Zeichenfolge.
Hierbei wird eine der neueren Funktionen von Pyth verwendet, nämlich, dass beim Anwenden einer Funktion auf eine Liste standardmäßig die Funktion auf die Liste abgebildet wird, sofern kein anderes Verhalten definiert ist. Dies bedeutet, dass
v
auf eine Liste von Zeichenfolgen angewendet alle Zeichenfolgen ausgewertet werden.Beachten Sie, dass die Aufteilungsliste die Aufteilung in 1 Teil zulässt. Der Wert dieser Aufteilung ist jedoch immer größer als das Minimum, sodass sie sicher ignoriert wird.
quelle
Tcl , 116 Bytes
Probieren Sie es online!
Erläuterung
Es funktioniert mit einem Regex-Trick, der einen entarteten Endfall ermöglicht, der immer größer als die minimale Differenz ist. Für "12345" sind die Werte:
quelle
lmap
stattforeach
: tio.run/##LYuxCsMgFEV3v@IOb1DaZO8/ZHItDlolBEx4qC2FkG9/...Ruby , 44 Bytes
Probieren Sie es online!
quelle
Java 8,
8882 BytesProbieren Sie es online aus.
quelle
n->{int r=-1,d,p=1;for(;n>=p;p*=10){d=Math.abs(n/p-n%p);if(r<0|d<r)r=d;}return r;}
82 BytesAPL + WIN, 31 Bytes
Fordert zur Eingabe einer Ganzzahl als Zeichenfolge auf.
Erläuterung:
quelle
Perl 5 ,
5141 + 1 (-p
) = 42 BytesProbieren Sie es online!
inspiriert von @ Nahuel-Fouilleuls Kommentar
quelle
$\--;$d=abs$``-$',$\=$\<0|$d<$\?$d:$\while//g}{
C # (.NET Core) ,
112107 + 18 = 125 ByteProbieren Sie es online!
Die Zählung umfasst die 18 Bytes in
using System.Linq;
. Nimmt Eingaben alsstring
.quelle
string.Remove
Vielleicht sparen Sie ein paar Bytes