Einführung
Sie verwenden Twitter (tun wir so, als ob nicht), wobei Sie auf 140 Zeichen pro einzelnem Tweet beschränkt sind, den Sie mit der Welt teilen möchten. Wenn Sie Ihren Followern von Abraham Lincolns Gettysburg-Adresse twittern möchten, müssen Sie den Text in mehrere 140-stellige Blöcke aufteilen, um die gesamte Nachricht zu verbreiten. Diese Chunks sollten jedoch nicht immer genau 140 Zeichen lang sein. Nehmen wir zum Beispiel an, wir haben die Rede in 17-stellige Teile aufgeteilt. Am Ende würden wir folgende Tweets erhalten:
- VIER PUNKTE UND SE
- VEN JAHRE VOR UNSEREM
- VATER GEBROCHEN
- WEITER AUF DIESEM CON
- TINENT EIN NEUES NATI
- AUF IN L
- (und so weiter)
Das ist nicht gut! Wenn einzelne Wörter getrennt werden, kann es schwierig werden zu verstehen, was Sie sagen möchten. Auf der Twitter-Seite kann es auch vorkommen, dass einer Ihrer Follower auf einen bestimmten Tweet stößt und nicht merkt, dass die Nachricht mehr enthält. Daher sollten Sie Ihre Tweets nummerieren, damit sie einen Kontext haben, mit dem Sie arbeiten können (und immer noch 17-stellige Chunks verwenden) ):
- (1/7) VIER PUNKTE UND
- (2/7) VOR SIEBEN JAHREN
- (3/7) UNSERE VATER
- (4/7) WEITERGEBRACHT
- (5/7) DIESER KONTINENT A
- (6/7) NEUE NATION
- (7/7) ENTWICKELT IN ...
Sie könnten die beste Konfiguration für Ihre Tweets manuell von Hand herausfinden, aber dafür haben wir Computer!
Herausforderung
Analysieren Sie die Gettysburg-Adresse (oder einen beliebigen Text, wir werden uns jedoch an diesem Beispiel orientieren) in einem Satz von Tweets mit maximal 140 Zeichen (nehmen Sie ASCII an, da unser Beispieltext keine haben sollte) alle ungewöhnlichen / ungewöhnlichen Teile darin).
Einzelheiten
- Ihre Funktion / Programm / etc sollte ein einzelnes String-Argument aufnehmen und für jeden Tweet eine Textzeile ausgeben.
- Angenommen, diese Eingabe führt beim Parsen nie zu mehr als 99 Tweets insgesamt, unabhängig davon, wie Sie das Parsen auswählen (solange diese Auswahl noch zu den anderen Punkten der Herausforderung passt).
- Tweets müssen einen " "
tweet number
of -total tweets
Indikator im Format(x/y)
vor dem Text des Tweets enthalten.- Diese Zählung nimmt einen Teil Ihres 140-Zeichen-Platzes ein!
- Tweet-Chunks dürfen nur in Zeilenumbrüchen oder Leerzeichen aufgeteilt werden.
- Bindestriche, Punkte, Kommas oder andere Satzzeichen sind nicht zulässig, es sei denn, unmittelbar davor oder dahinter steht ein Leerzeichen oder eine neue Zeile.
- Tweets sollten aus möglichst vielen vollständigen Wörtern bestehen.
- Diese Einschränkung ist etwas flexibel, z. B. wenn Ihr endgültiger Tweet nur ein Wort enthält
- Dies ist Codegolf, also gewinnt der kürzeste Code.
Vollständiger Wortlaut der Adresse von Gettysburg
(Ihr Code sollte weiterhin in der Lage sein, alle an ihn übergebenen ASCII-Zeichenfolgen zu verarbeiten.)
VIER PUNKTE UND SIEBEN JAHRE VOR UNSEREN VATERN, DIE AUF DIESEM KONTINENT EINE NEUE NATION GEBRACHT HABEN, DIE IN DER FREIHEIT ERRICHTET WURDE, DASS ALLE MÄNNER GLEICH GESTELLT SIND. JETZT SIND WIR IN EINEN GROSSEN ZIVILKRIEG EINGEFÜGT, DER PRÜFT, OB DIESE NATION ODER JEGLICHE NATION, DIE SO ERFINDEN UND ENDIZIERT WURDEN, LANGDAUER KÖNNEN. WIR SIND AUF EINEM GROSSEN SCHLACHTFELD DIESES KRIEGES. WIR MÜSSEN EINEN TEIL DIESES GEBIETS ALS ENDGÜLTIGEN ORT FÜR JENE BESTIMMEN, DIE IHR LEBEN GEGEBEN HABEN, DASS DIESE NATION LEBEN KÖNNTE. ES PASST AUCH PASSEND UND PASSEND, DASS WIR DAS TUN SOLLTEN. ABER IM GRÖSSEREN SINNE KÖNNEN WIR NICHT BESTIMMEN, WIR KÖNNEN NICHT KONSEKRIEREN, WIR KÖNNEN DIESEN GRUND NICHT HEILEN. DIE MUTIGEN LEBENDIGEN UND TOTEN, DIE HIER UMKÄMPFEN, HABEN ES WEIT ÜBER UNSERER SCHLECHTEN KRAFT GEWÄHRT, UM ZU ADDIEREN ODER ABZULEITEN. Die Welt wird sich weder merken noch daran erinnern, was wir hier sagen, aber sie kann nie vergessen, was sie hier getan haben. ES IST FÜR UNS, DASS DAS LEBEN HIER DER UNVOLLSTÄNDIGEN ARBEIT GEWIDMET IST, DIE SIE HIER GEKRÄFT HABEN, DASS SIE SO NOCH NOCH NICHT VORGEKOMMEN SIND. Es ist vielmehr so, dass wir uns der großen Aufgabe widmen, die uns noch bevorsteht, und dass wir aufgrund dieser ehrwürdigen Tötung eine verstärkte Ablehnung vornehmen, um den Grund für die Ablehnung der letzten vollständigen Ablehnung zu finden HABEN IN VAIN GESTORBEN, DASS DIESE NATION UNTER GOTT EINE NEUE GEBURT DER FREIHEIT HAT, UND DASS DIE REGIERUNG DER MENSCHEN DURCH DIE MENSCHEN NICHT AUS DER ERDE VERGANGEN WIRD.
Antworten:
Perl, 51 Zeichen
Erfordert die Eingabeaufforderung -p, einschließlich 1 Zeichen.
Erläuterung: Fügen Sie den Zählteil vor und den Zeilenumbruch nach Wortgruppen mit bis zu 132 Zeichen ein. Fügen Sie einen Platzhalter (
~
) für die Summe ein, der dann durch eine zweite Ersetzung ersetzt wird. Dies bricht ab, wenn die Nachricht enthält~
, aber man könnte stattdessen leicht ein nicht druckbares Zeichen verwenden.Es betrügt leicht: es ermöglicht immer sieben Zeichen für den Zählabschnitt,
(nn/nn)
. Wirklich, wenn es so ist(n/n)
, sollte es zwei zusätzliche Zeichen erlauben. Eine willkürliche Lösung dieses Problems würde jedoch die Komplexität des Problems erheblich erhöhen.quelle
\G
ist hier nutzlos, nicht wahr?Python, 140
^ 140 Zeichen war eigentlich ein Zufall.
Solange noch Wörter übrig sind, erstellt die Lösung neue Tweets aus dem Wortvorrat und hängt sie an eine Liste an. Für jeden Tweet wird so lange versucht, Wörter hinzuzufügen, bis die Länge des Tweets 140 Zeichen überschreitet. Für sind zwei Zeichen reserviert
total tweets
, die später beim Drucken jedes Tweets in der Liste ausgefüllt werden.Beispielausgabe:
quelle
Ruby, 77 Zeichen
Packte die Logik in einen einzelnen regulären Ausdruck. Ausgabe von
f[text]
:quelle
Rubin, 75
Perl ist nicht zu schlagen, aber es schlägt zumindest die andere Ruby-Lösung geringfügig. Beachten Sie, dass die Tweets in umgekehrter Reihenfolge gedruckt werden (das Problem gibt keine an).
quelle
VBA, 251
Versuchte eine andere Methode ... Nicht ganz so gut wie mein Original, aber ich arbeite noch daran ...
Ausgänge:
quelle
BASH (88 Zeichen)
Falten Sie die Zeile mit 132 Zeichen (um die Anzahl unserer Tweets zu berücksichtigen) auf Leerzeichen (
-s
), lesen Sie den Text rückwärts (tac), nummerieren Sie den Text (cat -n
) und kehren Sie ihn zurück (tac
). In Awk: Erste Zeile (NR == 1) weisen Sie dem Buchstaben 'a' den Wert in der ersten Zeile zu. Löschen Sie die Nummernspalte. Drucken Sie (NR / 'a') und dann die Zeile.Ausgabe:
quelle
Javascript (nur FF), 92 Zeichen
Formatiert, das ist eine Abzocke des Perl-Skripts:
quelle
VBA, 227
Ausgänge:
quelle
Javascript (nur FF), 135 Zeichen
Formatiert, das ist:
quelle
PHP, 233
Bin ich richtig in der Annahme, dass dies die erste Antwort ist, die den Zählteil nicht betrügt?
(Es funktioniert auch mit mehr als 99 Tweets. Ich könnte zwei weitere Bytes wegschneiden, wenn ich in diesem Fall eine Endlosschleife zulasse.)
ungolfed:
quelle