2016-08-07 9 views
0

(Überarbeitete Version von Wumpus Q. Wumbley über Kommentare verbessert.)Minimal zweispaltigen numerische Eingabedaten für `sort` Beispiel mit unterschiedlichen Permutationen

Was die wenigsten Reihen von zweispaltigen numerischer Eingabe ist erforderlich einzigartig herzustellen vier sort Ausgänge für die folgenden vier Optionen:
1. -sn -k1 2. -sn -k2 3. -sn -k1 -k2 4. -sn -k2 -k1?

Hier ist ein 6 row Beispiel (mit 4 einzigartigen Ausgängen):

6 5 
3 7 
6 3 
2 7 
4 4 
5 2 

Als Bequemlichkeit, eine Funktion, diese vier Ausgänge 2 Spalten von Zahlen gegeben zu zählen, (erfordert moreutils), das die Anzahl druckt einzigartige Ausgänge:

# Usage: foo c1_1 c2_1 c1_2 c2_2 ... 
foo() { echo "[email protected]" | tr -s '[:space:]' '\n' | paste - - | \ 
     pee "sort -sn -k1 | md5sum" \ 
      "sort -sn -k2 | md5sum" \ 
      "sort -sn -k1 -k2 | md5sum" \ 
      "sort -sn -k2 -k1 | md5sum" | \ 
     sort -u | wc -l ; } 

So die einzigartigen Permutationen von diesem Eingang zu zählen:

8 5 
3 5 
8 4 
diese

Run:

foo 8 5 3 1 8 3 

Ausgang:

2 

(nur zwei einzigartige Ausgänge. Nicht genug ...)


Hinweis, der erste Entwurf dieses Q verwendet eine andere Komfortfunktion, (die ich fälschlicherweise angenommen, würde die gleiche Ausgabe wie die aktuelle Version produzieren würde). Da indirekt die Antwort beide Versionen vergleicht, ist hier die alte Referenz:

oldfoo() { echo "[email protected]" | tr -s '[:space:]' '\n' | paste - - | \ 
    pee "sort -k1n | md5sum" \ 
     "sort -k2n | md5sum" \ 
     "sort -k1n -k2n | md5sum" \ 
     "sort -k2n -k1n | md5sum" | \ 
    sort -u | wc -l ; } 
+0

Ihr 6-zeiliges Beispiel scheint zwischen den Zahlen unterschiedliche Leerzeichen zu enthalten. Der Abstand sieht nicht breit genug aus, um eine Registerkarte mit dem üblichen 8-Spalten-Tabstop darzustellen ... aber jetzt sehe ich, dass Sie tatsächlich Tabs in den Post setzen und das ist genau das, was der Renderer mit ihnen gemacht hat. –

+0

Ugh, ein Fehler in 'foo()' ... 'foo 1 2 10 9 1 10 2 9' gibt' 4' zurück, aber Subtraktion * 1 * in den zwei größeren Zahlen ändert die Ausgabe und 'foo 1 2 9 8 1 9 2 8' gibt "2" zurück. – agc

+1

Sie kennen den letzten Ausweg, richtig? Wolltest du '-s' benutzen? Wenn Sie nicht wollten, dass wir mit dem Whitespace spielen * oder * die Tatsache nutzen, dass 9 nach 10 im letzten Vergleich kommt, was genau war der Sinn? –

Antwort

1

ich es in 3 durch Variation der Leerzeichen tun können:

1 1 
2 1 
1 2 

Ihre foo Funktion nicht produzieren diese Art der Ausgabe, aber da es nur eine "Bequemlichkeit" und nicht ein Teil der eigentlichen Frage war, erkläre ich diese Antwort richtig und minimal!

hinterhältige Version:

2  1 
11  1 
2  2 

(Die letzte Zeile enthält eine Registerkarte, die andere nicht.)

Mit der -s Option, kann ich nicht ausnutzen nicht-numerische Vergleiche, aber dann ich kann nutzen, um die Stabilität der Art:

1 2 
2 1 
1 1 

die 1 1 Linie geht über beide der anderen, wenn beide Felder numerisch verglichen werden, unabhängig davon, welcher Vergleich zuerst durchgeführt wird. Die Reihenfolge der beiden Vergleiche bestimmt die Reihenfolge der anderen beiden Zeilen.

Wenn eines der Felder nicht zum Vergleich verwendet wird, bleibt die Zeile 1 1 unter einer der anderen Zeilen (und welche davon hängt davon ab, welches Feld für den Vergleich verwendet wird).

+0

Feh! Whitespace Tweaking ist tabu. 'foo 1 1 2 1 1 2' gibt' 2' zurück. 'foo 2 1 11 1 2 2' gibt' 3' zurück. ** + 1 ** für perveristy tho '. Ich bezweifle, dass 3 Zeilen möglich sind ... – agc

+0

Ich fühlte mich schon wie meine Hände waren gebunden durch die Einschränkung, dass die Spalten numerisch sein mussten ... –

+0

Für '-s' aktualisiert –