Meine Hausaufgabe ist es, eine Schnur zu nehmen und sie bei jeder neuen Zeile in Stücke zu teilen. Ich habe keine Ahnung, was ich tun soll! Bitte helfen Sie!
Hinweis: Dies ist eine Code-Trolling- Frage. Bitte nehmen Sie die Frage und / oder die Antworten nicht ernst. Mehr Infos hier .
code-trolling
Turion
quelle
quelle
Antworten:
C
Schwieriges Problem für einen C-Programmierkurs! Zunächst müssen Sie einige Grundlagen zu diesem komplizierten Thema verstehen.
Eine Zeichenfolge besteht nur aus Zeichen . Dies bedeutet, dass Programmierer eine spezielle Folge von Zeichen verwenden müssen, um eine "unsichtbare" Sache anzuzeigen (das ist kein Leerzeichen, das als Zeichen zählt), um diese unsichtbare Sache zu bezeichnen.
Unter Windows ist die neue Zeile eine Folge von zwei Zeichen in der Zeichenfolge: Backslash und n (oder die Zeichenfolge
"\n"
)Auf Linux- oder OS / X-Macs ist dies eine Folge von vier Zeichen: Backslash, n, Backslash und dann r: (oder
"\n\r"
).(Interessanter historischer Hinweis: Auf älteren Macintosh-Rechnern war es eine andere Folge von vier Zeichen: "\ r \ n" ... ganz anders als unter Unix! Die Geschichte geht seltsame Wege.)
Es mag den Anschein haben, dass Linux verschwenderischer ist als Windows, aber es ist eine bessere Idee, eine längere Sequenz zu verwenden. Da Windows eine so kurze Sequenz verwendet, kann die C-Laufzeit die tatsächlichen Buchstaben nicht
\n
ohne spezielle Systemaufrufe ausdrucken . Sie können in der Regel auf Linux tun , ohne einen Systemaufruf (es kann sogar drucken\n\
oder\n\q
... alles andere als\n\r
). Da C jedoch plattformübergreifend sein soll, wird der kleinste gemeinsame Nenner erzwungen. So werden Sie immer\n
in Ihrem Buch zu sehen.(Hinweis: Wenn Sie sich fragen, wie wir reden,
\n
ohne jedes Mal neue Zeilen zu erhalten, ist StackOverflow fast vollständig in HTML geschrieben ... nicht in C. Es ist also viel moderner. Viele dieser alten Aspekte von C sind Sie werden von Dingen angesprochen, von denen Sie vielleicht gehört haben, wie CLANG und LLVM.)Aber zurück zu dem, woran wir arbeiten. Stellen wir uns eine Saite mit drei Stücken und zwei Zeilenumbrüchen vor:
Sie können sehen, dass die Länge dieser Zeichenfolge 3 + 2 + 3 + 2 + 3 = 13 ist. Sie müssen also einen Puffer mit der Länge 13 erstellen , und C-Programmierer fügen aus Sicherheitsgründen immer einen zur Größe ihrer Arrays hinzu. Machen Sie also Ihren Puffer und kopieren Sie den String hinein:
Nun müssen Sie nach dem zweistelligen Muster suchen, das die neue Zeile darstellt. Sie sind nicht zu suchen erlaubt nur einen Schrägstrich. Da C häufig zum Teilen von Strings verwendet wird, wird beim Versuch eine Fehlermeldung ausgegeben. Sie können dies sehen, wenn Sie versuchen zu schreiben:
(Hinweis: Im Compiler gibt es eine Einstellung für Programme, die nur nach Backslashes suchen. Dies ist jedoch äußerst selten. Backslashes werden sehr selten verwendet, weshalb sie für diesen Zweck ausgewählt wurden. Wir werden das nicht ändern einschalten.)
Lasst uns also das Muster erstellen, das wir wirklich wollen:
Wenn wir zwei Zeichenfolgen mit einer bestimmten Länge vergleichen möchten, verwenden wir
strncmp
. Es vergleicht eine bestimmte Anzahl von Zeichen einer möglicherweise größeren Zeichenfolge und gibt an, ob sie übereinstimmen oder nicht. Sostrncmp("\nA", "\nB", 2)
gibt 1 (true). Dies ist auch dann der Fall, wenn die Zeichenfolgen über die Länge von drei nicht ganz gleich sind ... sondern nur zwei Zeichen sein müssen.Also lassen Sie sich Schritt für Schritt durch unsere Puffer, ein Zeichen zu einem Zeitpunkt, die Suche nach den zwei Zeichen Matchs zu unserem Muster. Jedes Mal, wenn wir eine zweistellige Folge eines Backslashs, gefolgt von einem n, finden, verwenden wir den speziellen Systemaufruf (oder "syscall")
putc
, um eine spezielle Art von Zeichen auszulesen : ASCII-Code 10 , um eine physikalische Newline zu erhalten .Die Ausgabe dieses Programms ist das gewünschte Ergebnis ... der String-Split!
\t
ist für \ trolling ......
...
...
quelle
Herzliche Glückwünsche! Ihre Zeichenfolge sollte jetzt geteilt sein. Wenn nicht, wiederholen Sie die Schritte, bis es ist. Wenn Sie die Schritte ein paar Mal wiederholt haben und die Saite nicht gespalten ist, verwenden Sie eine schärfere Schere.
HAFTUNGSAUSSCHLUSS: Ich bin nicht verantwortlich für Schäden, die Ihnen während des Prozesses entstanden sind.
quelle
Python
Ich fühle mich so schlecht, dass Ihnen eine so offensichtliche Trickfrage als Hausaufgabe gestellt wurde. Eine hochentwickelte Sprache wie Python macht dies zu einem einfachen Doppelliner:
Bitte stimme zu und akzeptiere.
quelle
C
In C ist es wirklich einfach:
Nenne es so:
Arbeitsbeispiel:
http://codepad.org/GBHdz2MR
Warum ist es böse:
printf
Funktion zum Teilen der Zeichenfolgen#define
(und auch diejenigen, die es tun)quelle
Dies kann in wenigen Codezeilen mit dem folgenden einfachen Algorithmus erfolgen:
Dies ist jedoch verschwenderisch. Dies ist im Wesentlichen ein linearer Suchalgorithmus mit linearer Zeitkomplexität (O (n)). Ich werde Sie mit einer fortgeschritteneren Technik vertraut machen: der binären Suche . Die binäre Suche ist viel effizienter als die lineare Suche: Sie hat nur eine logarithmische Zeitkomplexität (O (log (n)). Wenn der Suchraum doppelt so groß ist, wird die Suchzeit nicht verdoppelt, sondern nur um das Doppelte erhöht eine feste Menge!
Der Code für die binäre Suche ist etwas komplizierter, da er die fortschrittlichen Techniken der Rekursion und der Division und Eroberung verwendet . Aber es lohnt sich auf jeden Fall für den Leistungsvorteil. Wenn Sie dies einreichen, werden Sie voraussichtlich zusätzliche Gutschriften erhalten.
Der Kern des Algorithmus lautet wie folgt:
Sie haben keine Sprache angegeben, deshalb habe ich sie in Python geschrieben. In der realen Welt schreiben die Leute natürlich nicht in Python - verwenden Sie C oder C ++ (oder noch besser die Assemblersprache) für echte Leistung. Mach dir keine Sorgen, wenn du nicht verstehst, was der gesamte Code tut - das ist definitiv fortgeschrittenes Zeug.
Natürlich sind alle Aussagen zur Leistung falsch. Der "einfache" Algorithmus kann linear oder quadratisch sein, je nachdem, wie Sie ihn interpretieren. Der "fortgeschrittene" Algorithmus ist Θ (n × log (n)) (in der Praxis ziemlich nahe an linear), aber Junge, ist die multiplikative Konstante hoch aufgrund des unaufhörlichen Neuaufbaus der Liste (was die Implementierung ein wenig in die Quere bringt) ).
Der Python-Stil, der Kommentar-Stil, die Aussagen über die Sprachauswahl und so ziemlich alles in diesem Beitrag spiegeln auch nicht meine tatsächliche Meinung oder Gewohnheit wider.
quelle
Visual Basic
Die
IO
Monade hat eine Funktion, um das zu tun!quelle
C ++
std::strstream
strstream
std::
Präfixquelle
Python 3 (ordentlich und sauber)
quelle
#define
s? ;-)Rubin
Nun, du siehst zuerst, dass du es in ein Array wie dieses schaffen musst
Jetzt müssen Sie die Elemente als Zeichenfolgen einfügen
Oh, entferne auch das letzte Komma
Hoppla, vergessen Sie, müssen Sie die Klammern setzen, um ein Array zu sein
Verwenden Sie jetzt einfach die Zeichenfolge und Sie sind fertig
Übelkeit:
split
eval
'
oder enthält,
quelle
Lua
Beispiel Eingabe:
"Hello\nworld\nstuff"
Ausgabe:
{"pieces","pieces","pieces","pieces","pieces","pieces"}
Oh und ich habe vergessen zu erwähnen, dass der Code O ist (n ^ 2)
quelle
Node.JS
Das ist so einfach, jeder Programmierer könnte das -.-.
Zuerst müssen wir die
hosts
Datei so ändern , dass die.com, .net, .org
Karte auf127.0.0.1
.und der Rest ist grundlegendes Javascript, das jeder Noob verstehen könnte.
So ist es richtig :)
quelle
string.split('/n');
, um den theoretischen Schüler zu verwirren :).Rubin
Zeichenketten in der Programmierung bestehen aus Einsteintanium. Als solche sind sie extrem schwer zu trennen.
Zum Glück für Sie habe ich einen Doktortitel in Chemie und Programmierung, damit ich helfen kann.
Wir werden dafür Ruby verwenden.
Das ist böse, weil:
quelle
SplitStr
spalten sich immer durch Zeilenumbrüche, egal was das Argument ist, nicht sicher, ob absichtlichC ++
Dank der leistungsstarken neuen Funktionen der Programmiersprache C ++ kann dies mit der Standardbibliothek problemlos gelöst werden. Denken Sie daran, das Rad nicht neu zu erfinden .
Bearbeiten: Diese Antwort versucht offensichtlich nur, etwas dummes Komplexes für eine triviale Aufgabe zu erstellen und dabei so viele Werkzeuge wie möglich zu missbrauchen, während ich noch in der Lage bin, den Code zu schreiben.
Hier sind ein paar Dinge zu beachten:
quelle
C #
Hierbei wird die Technologie der Rekursion verwendet, um die Zeilenumbrüche in Kommas umzuwandeln. Die resultierende CSV-Zeichenfolge kann leicht in ein Array aufgeteilt werden.
quelle
C ++
Sieht absolut glaubwürdig und lehrbuchmäßig bis zum letzten Ausdruck aus. Es ist sogar richtig, versuchen Sie einfach, dies Ihrem Lehrer zu erklären.
Es gibt natürlich keine Rechtfertigung dafür
std::for_each
, aber es erlaubt uns, ein Lambda falsch zu verwenden. Das Lambda sieht so aus, als würde es etwas zurückgeben, in Wirklichkeit aber nicht. Der ternäre Operator ist nur für die Nebenwirkungen da.quelle
In Ordung! So wird dieses Problem durch die Verwendung einiger weniger bekannter Funktionen von Python, einschließlich #define-Anweisungen (die kürzlich von C ++ übernommen wurden) und der automatischen Registrierung von Methoden für eingebaute Klassen, sehr einfach.
Wie schön ist das denn
Erläuterung
... es gibt hier eine ziemlich große Liste der Trolling.
Tatsächlich funktioniert das Programm (zumindest in Python 3.3.0 und abgesehen vom Problem der Eingabe über eine Zeile), da eine Reihe von Dingen, die dazu führen, dass es nicht das tut, was es sagt, dazu führen, dass es tatsächlich funktioniert.
quelle
Ziel LOLCODE
quelle
ANSI C
Dies ist eine Standardaufgabe, die wir alle erledigt haben. Dies ist die allgemein akzeptierte Lösung.
Sie müssen die Bibliothek mit der richtigen Funktion zum Teilen und Drucken einbinden.
#include <stdio.h>
Erstellen Sie die Zeichenfolge, die Sie teilen möchten:
const char * input = "First Line\nSecond Line\nThird Line\n";
Beachten Sie, wie ich dasconst
Schlüsselwort verwendet habe, um zu veranschaulichen, dass printf keine Möglichkeit hat, Ihre Eingabe zu ändern. Dies ist wichtig, da Sie die Benutzereingabe aus rechtlichen Gründen immer in ihrer ursprünglichen Form beibehalten möchten.printf("%s", input);
übernimmt die Aufteilung für Sie, wie Sie in der Konsolenausgabe sehen können.getchar();
Dies ist nur ein kleiner zusätzlicher Trick, um die Konsole beim Überprüfen der Ausgabe am Laufen zu halten.Die Eingabe:
"First Line\nSecond Line\nThird Line\n"
Erzeugt die Ausgabe:
quelle
Python
Wir können die String-
find()
Methode von Python iterativ verwenden , um den String bei jeder neueninput_str
Zeileninstanz zu teilen (beachten Sie, dass der Eingabe-String fest codiert ist , aber durch raw_input () ersetzt werden kann):Wenn Sie das obige Skript ausführen, erhalten Sie die erwartete Ausgabe (beachten Sie, dass sowohl das führende als auch das nachfolgende Leerzeichen mit dem Aufteilen der Zeichenfolge bei jedem Auftreten einer neuen Zeile konsistent sind):
quelle
PHP / GD
Das Aufteilen von Strings ist eine sehr komplizierte Angelegenheit. Trotzdem haben wir eine ziemlich einfache Implementierung für dieses so wichtige Hausaufgabenproblem gemacht.
Läuft ohne Abhängigkeiten von einer neueren PHP-Version: Anzahl der Beispiele im veröffentlichten Code begrenzt, da wir hier ein Zeichenlimit von ca. 40.000 Zeichen haben, das nicht für eine angemessene Anzahl von Demonstrationszeichenfolgen geeignet ist.
Beispielversion:
http://codepad.viper-7.com/YnGvCn
Bestätigt genau zu Ihren Spezifikationen.
quelle
Ich möchte nicht gemein sein, also hier ist ein funktionierender Teil des Python-Codes, der Ihren String in Teile aufteilt. Da Sie jedoch nicht angegeben haben, wo es aufgeteilt werden soll, wähle ich nur zufällige Orte aus. Ich hoffe, das ist in Ordnung mit dir.
quelle
Python
quelle
Für Sprachen, die reguläre Ausdrücke unterstützen und über eine
split
sofort verfügbare Funktion verfügen, sollten Sie diese immer zum Teilen einer Zeichenfolge verwenden. Dies hilft Ihnen, das Rad nicht neu zu erfinden und Ihren Code kurz und bündig zu halten. Mit regulären Ausdrücken können Sie Ihren Code auch in eine andere Sprache portieren, ohne Ihre regulären Ausdrücke zu ändern.Schlechte lösung
Es gibt diese offensichtliche Lösung, bei der Sie aufteilen nach
\n
oder\r\n
:Java
PHP
Diese Lösung ist Müll und sollte niemals verwendet werden. In der heutigen Zeit ist es sinnlos, Unicode zu vermeiden. Stattdessen sollte jeder Programmierer es akzeptieren und sicherstellen, dass Ihre Anwendung Unicode-fähig ist. Wenn Sie nur
\n
oder\r\n
als Trennzeichen für neue Zeilen betrachten, schreiben Sie Software in den 90er Jahren. In diesem Unicode-Zeitalter müssen Sie U + 0085, U + 2028, U + 2029 als gültiges Zeilentrennzeichen betrachten. Da Unicode von Zeit zu Zeit aktualisiert wird und es normalerweise einige Zeit dauert, bis Sie feststellen, dass es aktualisiert wurde, wird Unicode möglicherweise ein neuer Zeilentrenner hinzugefügt. Ärgern Sie sich nicht, denn alle regulären Ausdrucksmodule sind Unicode-fähig und werden regelmäßig aktualisiert, um dem neuesten Unicode-Standard zu entsprechen. Wenn Sie also eine interpretierte Sprache verwenden, ist Ihr Code auf dem neuesten Stand, ohne dass Sie etwas unternehmen.Empfohlene Lösung
Geben Sie den regulären Ausdruck
^
und den angegebenenMULTILINE
Modus an , um eine Zeichenfolge nach dem Zeilenende zu trennen und mit der Entwicklung von Unicode auf dem neuesten Stand zu bleiben .Standardmäßig
^
stimmt nur mit dem Anfang der Zeichenfolge überein. ImMULTILINE
Modus stimmt^
auch der Zeilenanfang überein, dh nach einem Zeilenabschluss.Beispielsweise:
Java
PHP
Beachten Sie, dass sich vor dem Eintrag ein zusätzlicher leerer String befindet. Entfernen Sie ihn einfach oder entfernen Sie die Schleife aus Index 1.
Erläuterung
Auf den ersten Blick scheint dies eine gute Antwort mit einer (etwas) funktionierenden Lösung zu sein, verbunden mit einer Erläuterung mit einigen Empfehlungen zur Codierung von Best Practices. Die Lösung selbst ist jedoch ein Troll ( "Ich weiß, ich werde reguläre Ausdrücke verwenden." Jetzt haben sie zwei Probleme. ), Und der gesamte Beitrag ist mit subtil falschen Informationen übersät, die jeden Neuling in die Programmierung einflößen werden.
MULTILINE
Modus ist das Verhalten von^
und$
abhängig von der Definition von "Leitungsabschluss". Java hält\r\n
,\n
,\r
,\u0085
,\u2028
,\u2029
Leitungsabschluss zu sein, wo\r\n
Sequenz Atom betrachtet wird. JavaScript hält\n
,\r
,\u2028
,\u2029
Linie Terminatoren zu sein. Ruby betrachtet nur\n
als Zeilenabschluss.split
Funktion kann unterschiedliche Semantik in verschiedenen Sprachen für Eckfälle haben. Python teilt nicht bei leeren Übereinstimmungen auf, Java entfernt nachgestellte leere Zeichenfolgen (es sei denn, Sie geben ein negatives Limit an), JavaScript teilt nicht bei einer leeren Zeichenfolgenübereinstimmung bei Index 0 auf.quelle
Bash-Skript
Dies teilt die Zeichenfolge durch Zeilenumbrüche. Wenn Sie das Echo
$new_string
, werden Sie feststellen, dass es neue Zeile in Array-Trennzeichen ersetzt.Beispielausgabe:
quelle
Java
Dies liest nicht aus einer Datei. Reguläre Ausdrücke werden verwendet. Der Code geht davon aus, dass die gelesene Zeichenfolge das Zeichen '\ n' enthält, um die neue Zeile anzugeben. Die Zahlen 1,2,3,4 geben die Aufteilung an.
quelle
C #
quelle
Sie geben nicht an, ob bei der "neuen Zeile", in die Sie Ihre Zeichenfolge aufteilen möchten, zwischen Groß- und Kleinschreibung unterschieden wird. Ich nehme an, unempfindlich.
quelle
Alter, das ist in Powershell ganz einfach.
Holen Sie sich einfach Ihre Zeichenfolge wie folgt:
Dann schleife über zufällige ASCII, bis du deinen String in zwei Teile geteilt hast:
Schließlich sollten Sie den geteilten String erhalten, den Sie wie folgt ausgeben können:
Ausgabe:
quelle
Php
Hier ist, wie Sie die Saite teilen. War das nicht einfach?
Jetzt müssen Sie nur noch die Funktion schreiben
Spliter()
quelle
bash spezifisch
Es ist ein toller Job für die Bash !
Ja, das Aufteilen eines Strings könnte auf ganz einfache Weise erfolgen:
Zuerst müssen Sie eine Variable initialisieren, mit der Sie Ihr geteiltes Ergebnis speichern:
Da nun jede Zeile durch zwei Trennzeichen (Anfang oder Ende der Zeichenfolge) begrenzt ist, benötigen Sie eine Variable, um die erste zu speichern
Ok, jetzt können Sie nach Trennzeichen suchen und Ihre Zeilen mit einer Schleife speichern . Da bash nicht mit Binärwerten arbeiten konnte, können Sie ein Tool wie das folgende verwenden
od
, um mit Hexadezimalwerten zu arbeiten:Jetzt haben wir eine geteilte Zeichenfolge in Variable gespeichert
lines
:Das können wir drucken mit:
Alles in einem Skript zusammenfassen:
Dies wird drucken:
Moderne Bash
Mit der modernen Bash- Implementierung können Sie Steuerzeichen wie Newline in Variablen speichern und sogar testen:
Bash Golf
Wenn Sie sich jedoch nicht für die Lesbarkeit interessieren, können Sie ein komprimiertes Skript wie das folgende schreiben:
Das Golf-Skript kann wie folgt aussehen:
und geben den gleichen Effekt: Die erste Zeile teilt die Zeichenfolge und speichert sie in einem Array mit dem Namen lines . Die zweite Zeile gibt jedes Mitglied des Arrays " lines " aus, gefolgt von einer neuen Zeile .
Bash + VT-Konsole
Da jedoch viele Benutzer eine auf dem ANSI-VT-Standard basierende Textkonsole verwenden , können Sie das VT-Verhalten Ihrer Konsole verwenden und dies erneut kürzer schreiben:
wird das gleiche Ergebnis geben.
quelle