Größte und kleinste Werte aus verketteten ganzen Zahlen

14

Dieses Problem besteht aus fünf Programmierproblemen, die jeder Software-Ingenieur in weniger als einer Stunde lösen kann. Dies ist selbst eine interessante Lektüre. Die ersten paar Probleme sind trivial, aber das vierte kann etwas interessanter sein.

Ausgehend von einer Liste von Ganzzahlen, die in der Standardeingabe durch ein einzelnes Leerzeichen getrennt sind, drucken Sie die größten und kleinsten Werte aus, die durch Verketten der Ganzzahlen in einer eigenen Zeile erhalten werden können.

Beispielsweise:

Eingang:

5 56 50

Ausgabe:

50556
56550

Verschiedene Punkte der Bestellung:

  • Die Reihenfolge der Ergebnisse ist am kleinsten als am größten.
  • Es können nur die kleinsten und größten Werte ausgedruckt werden (es ist ungültig, alle Variationen zu durchlaufen und auszudrucken).
  • Die Liste enthält immer zwei oder mehr Ganzzahlen.
  • Es ist möglich, dass das größte und das kleinste Ergebnis gleich sind. Bei der Eingabe 5 55die Nummer555 zweimal ausgedruckt werden.
  • Die ganzen Zahlen sind nicht unbedingt verschieden. 5 5ist eine gültige Eingabe.
  • Führende 0s für ganze Zahlen sind keine gültigen Eingaben. Sie müssen nicht berücksichtigen 05 55.

Da dies Codegolf ist, gewinnt der kürzeste Einstieg.


quelle
Wenn eine der Eingabenummern eine führende 0 (wie 05) enthält, betrachten wir sie als 05oder einfach 5?
Optimierer
@Optimizer führende Nullen sind keine gültigen Eingaben.
Sind führende Nullen in der Ausgabe zulässig?
Tim
@Tim Woher kämen diese, wenn die Eingabe keine führenden Nullen enthält?
Martin Ender
@ MartinBüttner ach ja, doof!
Tim

Antworten:

8

CJam, 14 13 Bytes

qS/e!:s$(N@W=

Ziemlich einfach. So funktioniert es:

qS/                  e# Split the input on spaces
   e!                e# Get all permutations of the input numbers
     :s              e# Join each permutation order into a single string
       $             e# Sort them. This sorts the strings based on each digit's value
        (N@W=        e# Choose the first and the last out of the array separated by '\n'

Probieren Sie es hier online aus

Optimierer
quelle
1
OK ich gebe auf. Ich existierte jetzt nicht e!(erscheint noch nicht einmal im Wiki).
Dennis
5
@ Dennis da Sie gehen
Optimizer
1
Sweet gelesen. Viele nützliche neue Sachen.
Dennis
Es kann hilfreich sein, die Tipps zum Golfen in CJam mit diesen zusätzlichen Tricks zu aktualisieren .
1
@MichaelT-Tipps sollten im Allgemeinen keine Antworten enthalten, die die integrierten Funktionen einer Sprache erläutern. Einige Antworten müssen möglicherweise aktualisiert werden, da sie möglicherweise von diesen neuen Funktionen profitieren.
Optimierer
5

Pyth, 14 13 Bytes

hJSmsd.pcz)eJ

Erzeugt alle Permutationen und sortiert sie, wobei das erste und das letzte Element gedruckt werden.

orlp
quelle
Assign Jinline:hJSmsd.pcz)eJ
isaacg
@isaacg Gute! Ich wusste nur, dass wir diesem dreckigen, dreckigen CJam nicht unterlegen wären!
Orlp
4

Python 2, 104 99 Bytes

Ja.

from itertools import*;z=[''.join(x)for x in permutations(raw_input().split())];print min(z),max(z)

Edit: Danke an xnor für -5 Bytes!

sirpercival
quelle
1
Das Verständnis im Inneren sortedfunktioniert ohne Klammern, aber Sie können auch das Sortieren vermeiden und einfach minund nehmen max.
xnor
hah ja Danke!
Sirpercival
3

Mathematica, 64 58 Bytes

Print/@Sort[""<>#&/@Permutations@StringSplit@#][[{1,-1}]]&

Dies definiert eine unbenannte Funktion, die eine Zeichenfolge verwendet und die beiden Zeilen druckt. Es ist ziemlich einfach wie die anderen: alle Permutationen abrufen, zusammenfügen, sortieren und das erste und letzte Ergebnis drucken.

Dank Alephalpha werden sechs Bytes gespart.

Martin Ender
quelle
{#&@@#,Last@#}=>#[[{1,-1}]]
alephalpha
@alephalpha Manchmal ist einfacher besser. Vielen Dank! : D
Martin Ender
2

JavaScript (ES6) 54 72 85

Das ist einfacher als es scheint. Sortieren Sie sie einfach lexikografisch. Die gute Nachricht ist: Genau so funktioniert einfaches Javascript. Naja ... nein, das ist falsch ... trotzdem kann ein (verschachtelterer) Lexikographenvergleich den Job machen.

Hinweis: Wenn a und b numerisch sind, ist a + [b] eine Abkürzung für a + '' + b, da wir eine Zeichenfolgenverkettung und keine Summe benötigen.
Anmerkung 2: Der Zeilenvorschub in `` ist signifikant und muss gezählt werden

Bearbeiten Diskutiere nicht mit einem Moderator (... nur ein Scherz)

Edit2 Fixed I / O-Format mit Popups (siehe Standard für Code Golf: Eingabe- / Ausgabemethoden )

// Complete program with I/O
// The sorting function is shorter as input are strings

alert((l=prompt().split(' ')).sort((a,b)=>a+b>b+a).join('')+`
`+l.reverse().join(''))

// Testable function (67 chars)
// With an integer array parameter, the sorting function must convert to string 

F=l=>(l.sort((a,b)=>a+[b]>b+[a]).join('')+`
`+l.reverse().join(''))

Test In der Firefox / FireBug-Konsole

F([50, 2, 1, 9])
F([5,56,50])
F([52,36,526])
F([52,36,525])
F([52,36,524]

12509
95021

50556
56550

3652526
5265236

3652525
5255236

3652452
5252436

edc65
quelle
1
Ich denke dein Eingabeformat ist falsch. Sollte "Ganzzahlen sein, die in der Standardeingabe durch ein einzelnes Leerzeichen getrennt sind".
nimi
@ nimi du hast recht.Fixed
edc65
2

J, 34, 36 , 42 Bytes

einfache rohe Gewalt:

h=:3 :'0 _1{/:~;"1":&.>y A.~i.!#y'

h 5 50 56
50556 
56550

h 50 2 1 9
12509
95021
Eelvex
quelle
1

Haskell, 98 Bytes

import Data.List
g=sort.map concat.permutations.words
h i=unlines[g i!!0,last$g i]
main=interact h

Teilen Sie die Eingabezeichenfolge in Leerzeichen auf, verketten Sie jede Permutation und Sortierung. Erstes und letztes Element drucken.

nimi
quelle
1

Julia, 77 Bytes

v->(Q=extrema([int(join(x)) for x in permutations(v)]);print(Q[1],"\n",Q[2]))

Dadurch wird eine unbenannte Funktion erstellt, die einen Vektor als Eingabe akzeptiert und das Minimum und Maximum der Permutationen der verbundenen Elemente ausgibt. Um es zu nennen, geben Sie ihm einen Namen, z f=v->....

Ungolfed + Erklärung:

function f(v)
    # Create an integer vector of the joined permutations using comprehension,
    # then get the minimum and maximum as a tuple using extrema().

    Q = extrema([int(join(x)) for x in permutations(v)])

    # Print the minimum and the maximum, separated by a newline.
    print(Q[1], "\n", Q[2])
end

Vorschläge sind willkommen!

Alex A.
quelle
1

Javascript ( ES6 ) 134

Leider gibt es in JS keine eingebaute Permutationsfunktion :(

f=(o,y,i,a)=>y?o.concat(a[1]?a.filter((k,j)=>j^i).reduce(f,[]).map(z=>y+z):y):(q=o.split(' ').reduce(f,[])).sort().shift()+`
`+q.pop()
<!-- Snippet Demo (Firefox only) -->

<input id="input" value="5 56 50" />
<input type="button" onclick="output.innerHTML=f(input.value)" value="Run" />
<pre id="output"></pre>

nderscore
quelle
1

R, 59 Bytes

write(range(combinat:::permn(scan(),paste,collapse="")),"")
Flodel
quelle
1
Gute Arbeit. Sie können ein Byte speichern, indem Sie nur zwei Doppelpunkte verwenden, d combinat::permn. H.
Alex A.
Ich dachte, ::dass das Paket geladen werden muss (über libraryoder require), aber nicht :::. Ich könnte falsch liegen; müssen ein wenig mehr darüber lesen. Vielen Dank.
Flodel
Wenn die Bibliothek geladen ist, benötigen Sie die Doppelpunkte überhaupt nicht. Sie können die Funktion einfach direkt aufrufen, da das Paket an den Namespace angehängt ist. Wenn das Paket installiert, aber nicht geladen ist, können Sie Funktionen in einem bestimmten Paket mit zwei Doppelpunkten referenzieren.
Alex A.
So kann es sein. Ich würde mir nicht erlauben, permndirekt ohne ein library(combinat).
Flodel
Ja, weil Sie die Bibliothek erst laden müssen, library(combinat)bevor Sie sie permntrotzdem verwenden können. ;)
Alex A.
1

Ruby 75

Nicht meine 'Muttersprache', aber eine, die ich ausprobiert habe ... daher könnte dies (möglicherweise) einige Golftipps gebrauchen. Trotzdem kein schlechter Teilnehmer.

puts STDIN.read.split(" ").permutation.map{|x|x.join}.sort.values_at(0,-1)

Ich würde nicht sagen, dass es elegant ist, wenn alles in die Sprache eingebaut ist. Es sollte ziemlich offensichtlich sein, wie das genau funktioniert.


quelle
Sie können ersetzen {|x|x.join}mit (&:join)für eine 3 - Byte - Einsparungen.
Andrew sagt Reinstate Monica
Noch ein paar Ruby-Shortcuts für 48 Bytes:puts$<.read.split.permutation.map(&:join).minmax
blutorange
gets ist noch kürzer für das lesen von eingaben:puts gets.split.permutation.map(&:join).minmax
blutorange
1

Perl, 79, 70B (68 + 2)

use Math::Combinatorics;say for(sort map{join'',@$_}permute@F)[0,-1]

Mit anrufen echo 13 42 532 3 6|perl -M5.10.0 -an scratch.pl. Es gibt eine 2-Byte-Strafe für -an. Schade um die Länge des Modulnamens ...

Alexander-Brett
quelle
0

JavaScript (ES6), 85 Byte

F=a=>(c=a.split(" ").sort((b,a)=>b+a-(a+b)),`${c.join("")}
${c.reverse().join("")}`)

Verwendung:

F("50 2 1 9")
/*
    12509
    95021
*/
Royhowie
quelle
1
Verlieben Sie sich nicht in Template-Strings. a + `` + b ist kürzer als `$ {a} $ {b}`
edc65