2016-05-09 14 views
0

So auf einem dorky wenig arbeite ich algorithm-- den Punkt davon ist sehr langweilig. Alles was ich wissen will ist warum ich den Buchstaben "D" an den Ausgang am Terminal angehängt habe.Alien-Invasion von Python-Code im Terminal - (?, Warum es die Buchstaben D mit dem Ausgang anhängt)

Wenn die Antwort ist 1, es gibt mir 1D zurück. Wenn die Antwort 2 ist, spuckt sie 2D usw. aus. Warum?

Ich glaube nicht, dass viel mit dem Code zu tun hat. Der Code ist unten, wenn du denkst. Es könnte damit zu tun haben, wie ich den Eingabestream beende, indem ich Strg + D (Mac) drücke. Es gibt mir nicht 1^D, es gibt mir 1D. Warum?

if __name__ == '__main__': 
    input = sys.stdin.read() 
    n, *data = map(int, input.split()) 
    segments = list(map(lambda x: Segment(x[0], x[1]), zip(data[::2], data[1::2]))) 
    points = optimal_points(segments) 
    print(int(len(points))) 
    for p in points: 
     print(p, end=' ') 

Es sagt im Grunde, bla bla bla, bekommen eine Liste von Nummern aus dem Eingangsstrom/Terminal, wie folgt aus:

3 
1 3 
2 5 
3 6 

und tun dies, um es:

def is_between(num_to_check, start, end): 
    return num_to_check >= start and num_to_check <= end 

def optimal_points(segments): 
    end_first_segements = sorted(segments, key=attrgetter('end')) 

    count = 1 
    i = 1 
    current_end = end_first_segements[i -1 ].end 
    next_seg = end_first_segements[i] 
    end_points=[current_end] 
    while i <len(end_first_segements): 
     s = next_seg.start 
     e = next_seg.end 
     if(is_between(current_end, s, e)): 
      try: 
       i += 1 
       next_seg = end_first_segements[i] 
      except IndexError: 
       break; 
     else: 
      try: 

       count +=1 
       end_points.append(next_seg.end) 
       next_seg = end_first_segements[i+1] 
       current_end = next_seg.end 


      except IndexError: 
       break; 
    return end_points 

Sehen Sie, es gibt nichts im Code, der sagt, "hey, Sie sollten den Buchstaben D ohne Grund an den Ausgang anhängen".

Ich halte dies auch in anderen kleinen Programmen zu sehen, ich auch getan habe. Also ich denke, es hat mit der Terminal-Verse irgendeinen Code zu tun, den ich schreibe. Gedanken?

Die gesamte Py-Datei:

# Uses python3 
import sys 
from collections import namedtuple 
from operator import attrgetter 

Segment = namedtuple('Segment', 'start end') 


def is_between(num_to_check, start, end): 
    return num_to_check >= start and num_to_check <= end 

def optimal_points(segments): 
    end_first_segements = sorted(segments, key=attrgetter('end')) 

    count = 1 
    i = 1 
    current_end = end_first_segements[i -1 ].end 
    next_seg = end_first_segements[i] 
    end_points=[current_end] 
    while i <len(end_first_segements): 
     s = next_seg.start 
     e = next_seg.end 
     if(is_between(current_end, s, e)): 
      try: 
       i += 1 
       next_seg = end_first_segements[i] 
      except IndexError: 
       break; 
     else: 
      try: 

       count +=1 
       end_points.append(next_seg.end) 
       next_seg = end_first_segements[i+1] 
       current_end = next_seg.end 


      except IndexError: 
       break; 
    return end_points 


if __name__ == '__main__': 
    input = sys.stdin.read() 
    n, *data = map(int, input.split()) 
    segments = list(map(lambda x: Segment(x[0], x[1]), zip(data[::2], data[1::2]))) 
    points = optimal_points(segments) 
    print(int(len(points))) 
    for p in points: 
     print(p, end=' ') 
+0

ich nicht wiedergeben kann. Ich bekomme '^ D \ n1 \ n3' von Ihrer Beispieleingabe. Sie sollten versuchen, eine andere Methode zum Lesen der Eingabe zu verwenden. Das '^ D' wird immer angezeigt, wenn Sie Strg + D drücken. –

+0

Ich würde vorschlagen, das Programm auf ein minimales Beispiel zu reduzieren, das das Verhalten zeigt, das Ihnen hilft Leute diagnostizieren irgendwelche Probleme. Leider habe ich keinen Zugriff auf einen Mac und kann das Problem nicht reproduzieren. Siehe eine mögliche Lösung in meiner Antwort ... – Gavin

+0

@MorganThrapp "Das^D wird immer angezeigt, wenn Sie Strg + D drücken." Das ist nicht genau, wenn Sie Strg + D in verschiedenen Kontexten drücken. Dieses Problem einer dieser Kontexte –

Antwort

0

Ich kann Ihr genaues Problem nicht genau reproduzieren, aber ich sehe etwas seltsam, wo die letzte Zeile der Ausgabe mit einem% -Zeichen in Linux endet.

Also mein minimal funktionierendes Beispiel dieses Verhalten zu reproduzieren ist einfach:

print('1 2', end=' ') 

Wenn ich eine leere Druck Erklärung am Ende des Programms dies entfernt das Verhalten hinzufügen, dh durch print() am Ende hinzufügen.

+0

Ich bin bereit zu wetten, dass der Hack auch .. gegeben mac Untermauerung auf meinem Mac arbeiten. Danke für den Vorschlag. –

Verwandte Themen