Ich bin auf SO auf diese Frage gestoßen und dachte, es wäre eine schöne Golfherausforderung. Hier ist es also:
Herausforderung:
Schreiben Sie ein Programm, das eine Folge von Zeichenfolgen (eine pro Zeile) liest und eine Liste aller Positionen ausgibt, an denen jede Zeichenfolge dasselbe Zeichen enthält.
Ein- und Ausgabe:
Die Eingabe besteht aus einer oder mehreren Zeilen druckbarer Nicht-Leerzeichen-ASCII-Zeichen, denen jeweils eine neue Zeile folgt. Sie können davon ausgehen, dass alle Eingabezeilen gleich lang sind. Die neue Zeile ist nicht als Teil der Eingabe zu betrachten (dh Sie sollten sie nicht als übereinstimmendes Zeichen ausgeben).
Beispiel-Eingabe (schamlos aus der SO-Frage gestohlen):
abcdefg
avcddeg
acbdeeg
Nach dem Lesen der Eingabe sollte Ihr Programm die Positionen jeder übereinstimmenden Spalte und die darin enthaltenen Zeichen drucken. (Ihr Programm hört möglicherweise auf, weitere Eingaben zu lesen, muss dies aber nicht, wenn es frühzeitig feststellen kann, dass keine übereinstimmenden Spalten vorhanden sind.) Jedes sinnvolle Ausgabeformat ist zulässig. Insbesondere können Sie entweder 0-basierte oder 1-basierte Indizierung für die Positionen verwenden.
Beispielausgabe für die obige Eingabe (mit 0-basierter Indizierung):
0: a
3: d
6: g
Wertung:
Dies ist Codegolf, also gewinnt die kürzeste Antwort. Im Falle eines Gleichstands können Bruchstücke von Trennzeichen für zusätzliche Merkmale vergeben werden:
- −½ Zeichen für den korrekten Umgang mit Eingabezeilen ungleicher Länge. (Die Ausgabe sollte keine Positionen nach dem Ende der kürzesten Eingabezeile enthalten.)
- −¼ Zeichen für die korrekte Verarbeitung von Eingaben, die aus beliebigen UTF-8-codierten Unicode-Zeichen bestehen.
Zur Inspiration finden Sie bei der SO-Frage (siehe oben) möglicherweise einige ungolfed Lösungen.
Klarstellungen:
Das einfache Verketten der Positionen und Zeichen wie in
0a3d6g
zählt nicht als "sinnvolle Ausgabe". Sie sollten eine Art Trennzeichen (z. B. ein Leerzeichen) zwischen den einzelnen Elementen der Ausgabe angeben, damit sie eindeutig analysiert werden können.Die Eingabe erfolgt über den Standardeingabestream (
stdin
) oder mithilfe des für Ihre Sprache am besten geeigneten Eingabemechanismus für Textdateien. (Wenn Ihre gewählte Sprache nicht haben einen natürlichen Mechanismus für Dateieingabe, tun , was am nächsten Geist erscheint.)Die Eingabe endet, wenn keine Daten mehr gelesen werden müssen (dh wenn eine Dateiende-Bedingung eintritt). Wenn Sie möchten, Sie können verlangen , dass der Eingang durch eine Leerzeile beendet werden (die Sie dann nicht als Teil des Eingangs zählen sollten, natürlich). Wenn Sie dies tun, erwähnen Sie dies bitte in Ihrer Antwort, damit andere die richtigen Eingaben zum Testen machen können.
Jede Eingabezeile, einschließlich der letzten, endet mit einem Zeilenumbruch. Ihre Antwort darf diese neue Zeile nicht als übereinstimmende Spalte enthalten. (Es ist in Ordnung, wenn Ihre Lösung auch Eingaben verarbeiten kann, bei denen die letzte Zeile nicht in einer neuen Zeile endet, dies jedoch nicht erforderlich ist.)
Antworten:
APL, 25 Zeichen
Ich habe Dyalog APL (Version 13) als Dolmetscher verwendet. Es werden sowohl Eingaben mit ungleicher Länge als auch Unicode-Zeichen (UTF-8) verarbeitet.
Beispiele:
Erklärung, etwas von rechts nach links:
⍵
.0=⍴⍵:⍬
ist unser erster Ausdruck und überprüft, ob wir eine leere Zeile haben (dh wir sind fertig). Es verwendet einen Guard (ein bekanntes Konstrukt für viele funktionale Programmierer), um den Ausdruck rechts vom Doppelpunkt bedingt auszuführen. In diesem Fall geben⍴
wir die leere Menge (⍬
) zurück , wenn 0 gleich der Form / Länge ( ) des rechten Arguments ist .⋄
trennt die beiden Ausdrücke innerhalb der Funktion. Wenn der vorherige Ausdruck nicht ausgewertet wurde (und daher nichts zurückgibt), fahren wir mit dem nächsten Ausdruck fort.∇
) auf. Das Argument für die Funktion ist eine Zeile nicht ausgewerteter Benutzereingaben, die durch quote-quad (⍞
) angegeben wird.⊂⍵,⍨¨⍳⍴⍵
Erstellt Paare für jedes Zeichen in der Zeichenfolge, wobei das erste Element jedes Paars die Position in der Zeichenfolge und das zweite Element das Zeichen ist.⍳⍴⍵
Gibt einen Vektor von 1 bis⍴⍵
oder die Länge der Eingabezeichenfolge an.⍵,⍨¨
Wendet die Funktion (,⍨
) für die kommutierte Verkettung auf jedes (¨
) Element links (⍵
in diesem Fall auf die Benutzereingabe) und rechts an. Durch das Pendeln der Verkettungsfunktion werden die linken und rechten Argumente ausgetauscht.⊂
, damit wir zwischen Eingabezeilen unterscheiden können.⍞
)./
) wir unseren resultierenden Vektor von Vektoren von Paaren unter Verwendung der Schnittfunktion (∩
), was die Paare ergibt, die in allen Untervektoren gefunden werden.quelle
Golfscript (28 Zeichen)
Beim Weiterleiten von Unicode treten Zeichensatzprobleme auf, daher kein Viertelpunktebonus.
quelle
J,
57514440 ZeichenIch komme langsam aber sicher dorthin. Das ist noch lange nicht ideal, obwohl ich denke.
Ich war mir sicher, dass die Verwendung eines Hakens die Antwort sein würde, aber leider nicht (44 Zeichen):
Möglicherweise brauche ich eine ganz andere Methode, um kürzer zu werden.
quelle
Haskell, 64 Zeichen
Behandelt Zeilen ungleicher Länge. Die Unicode-Unterstützung hängt von den aktuellen Ländereinstellungen ab.
Beispielausgabe:
quelle
Python 2, Punktzahl 81,5 (
11694868382 Bytes minus Bonus)quelle
[:-1]
Dies ist nur erforderlich, wenn Sie am Ende der Eingabe eine überflüssige Newline entfernen (die in der Frage nicht einmal vorhanden zu sein scheint).zip(*sys.stdin)
ist[('a', 'a', 'a'), ('b', 'v', 'c'), ('c', 'c', 'b'), ('d', 'd', 'd'), ('e', 'd', 'e'), ('f', 'e', 'e'), ('g', 'g', 'g'), ('\n', '\n', '\n')]
. Ich sehe keinen Weg, das letzte Tupel Zeilenumbrüche zu vermeiden. Bitte korrigieren Sie mich, wenn ich falsch verstanden habe. Danke für die positive Bewertung.[:-1]
zulässt. ZBzip([1,2,3,4],[1,2,3])=> [(1, 1), (2, 2), (3, 3)]
(Bash) Shell Scripting, 105 Zeichen
Wenn jemand noch ein paar Tricks dazu hat, fülle sie bitte aus, um einen Kommentar abzugeben!
Ergebnis:
quelle
/tmp/cols.sh: line 2: [1: command not found
und sonst nichts gedruckt .[
; und das $ {y: 3} bewirkt, dass es nur mit genau 3 Eingabezeilen funktioniert. Das Korrigieren und Optimieren von Erträgen (100 Zeichen)while((++i%`tail -1 $1|wc -c`));do x=`cut -c$i $1`;((`uniq|wc -l`==1))<<<"$x"&&echo $i ${x: -1};done
und das Verwenden von Standardwerten sollte das Speichern von Erträgen mit ermöglichen,for((;++i<`tail -1 $1|wc -c`;))do
aber es gibt einen nicht behobenen Fehler in der Bash.Perl, 87 Zeichen (-½ Char Tie-Break-Bonus)
Hier ist eine Golfversion meiner eigenen Lösung aus dem SO-Thread :
Im Gegensatz zur SO-Version verwendet diese 1-basierte Indizes für die Ausgabe. Es verwendet die Perl 5.10-
say
Funktion und muss daher mitperl -M5.010
(oder mitperl -E
) ausgeführt werden.Wie die SO - Version dieser Code Griffe mit variabler Länge Linien und würden beliebige Unicode - Eingabe handhaben, wenn die Standardeingabe und -ausgabe im Modus UTF-8 waren. Leider ist dies nicht der Fall, es sei denn, man gibt den unfreien
-CS
Befehlszeilenschalter an. Somit erhält es den Bonus von -½ Zeichen, aber nicht den von -¼.Bearbeiten: +1 Zeichen, um einen Fehler zu beheben: Nur weil die Eingabezeichenfolgen keine Zeilenvorschübe enthalten, heißt das nicht, dass sie nicht in
$a
(z"+" & "J" eq "\n"
. B. ) enden können .quelle
chop
anstelle von verwendenchomp
.m
fürs Erste behalten , es ist nicht so, als ob es im Moment einen Unterschied zur Rangliste macht. :)T-SQL
quelle
Scala
115107: (−¼ für den Umgang mit UTF-8)ungolfed und
Source.fromFile ("f")
stattstdin
zur besseren Testbarkeit:Ergebnis:
Vielen Dank an Gareth für die Reduzierung der Größe 8 für die Verwendung
stdin
.quelle
stdin
stattfromFile("f")
8 Zeichen speichern?VBA (
307,25284 - 0,75 Bonus = 283,25)Ich weiß, dass dies bereits gewonnen wurde, aber hier ist mein Schuss (keine Datei lesen, nur eine Zeichenfolge - muss das io hinzugefügt werden). Ich mag es, dass ich
l()
rekursiv verwenden muss. Normalerweise brauche ich meine reale Programmierung nicht zu rekursivieren. Ich habe nur so viel getestet, aber ich glaube, dass dies die Unicode-Bonuspunkt-Bedingung abdeckt. Es wird auch davon ausgegangen, dassvbCr
es sich um den Leitungsabschluss handelt. Dies kann daher möglicherweise nicht auf alle Systeme übertragen werden.Code:
Beispiel Ein- / Ausgabe:
quelle
Q, 32
Verwendung
K, 22
Die obige Lösung kann auf 22 reduziert werden, indem sie vollständig in K geschrieben wird, anstatt K-Funktionen an einen Q-Interpreter zu übergeben, wodurch die Anzahl der erforderlichen Klammern verringert wird.
quelle
PHP,
123127 :(Ich bin damit nicht zufrieden (es muss Verbesserungen geben), aber hier ist:
Beweis, dass es funktioniert.
Wenn sich jemand eine geschicktere Methode zum Initialisieren von $ a und $ b vorstellen kann, lassen Sie es mich bitte wissen. Ursprünglich hatte ich
$a=$b=$n=''
und $ b war schließlich richtig, aber[empty] & [anything] == [empty]
so hatte $ a nie Inhalt.Bearbeiten: Das Zeilenumbruch-Handling (+6) musste behoben werden, das schließende Tag (-2) wurde jedoch entfernt.
quelle
?>
. Ich habe jedoch gerade bemerkt, dass Ihr Code einen Fehler aufweist: Er gibt eine zusätzliche Übereinstimmung aus, wenn alle Zeilen eine nachgestellte neue Zeile enthalten, wie angegeben.JavaScript (125
134140)Demo: http://jsfiddle.net/Fv7kY/4/
Edit 1 : Arrangiere Loops neu, um Klammern zu vermeiden. Initialisiere i mit
[]
, um es mit zu kombinierens
. Bewegen Siew
Schritt in Ausdruck.Bearbeiten 2 : Legt fest
S=I
, dass das zuletzt eingegebene Wort erfasst und mit gespeichert wirds[1]
. Kombinierenr=1
und++c<S.length
. SetzeC=s[c]
in die innere Schleife und vergleiche mitC
anstatt mit den vorherigen und nächsten Wörtern, um den Ausdrucks[w][c]==s[w++][c]
auf nur zu verkürzens[w++][c]==C
. Insgesamt 9 Zeichen gespeichert. Auch gesetzt,w=r=...
weil wenn das wahrw=1
ist, mit was wir initialisieren müssenw
.quelle
Rubin (71)
Ausgabe:
quelle
t[i]
mitt[i,1]
.Common Lisp,
183165 ZeichenLesbares Format:
Geben Sie dies direkt in die REPL ein und geben Sie Zeilen ein, die mit einer leeren Zeile enden.
quelle
C 126 Zeichen
Ich habe darauf gestarrt, aber ich kann es einfach nicht kleiner machen. Möglicherweise ist ein neuer Ansatz erforderlich.
(Keine Bonuspunkte; es werden nur Zeilen mit unterschiedlicher Größe verarbeitet, wenn die erste Zeile kürzer ist.)
quelle
C # mit .NET 4 (280)
Lesbare Version
Ursprüngliche Antwort
using c = System.Console; class P {statische Lücke Main () {char [] a; var b = c.ReadLine (); a = b.ToCharArray (); while (b! = "") {for (int i = 0; iLesbare Version:
quelle
0: a 1: b 2: c 3: d 4: e 5: f 6: g 0: a 2: c 3: d 6: g 0: a 3: d 6: g
. Die erwartete Ausgabe wäre0: a 3: d 6: g
.Python 122 Zeichen :
quelle
)
undfor
. Stattdessen…str(x[0]) for i,x…
können Sie das tun…str(x[0])for i,x…
. Es kommt auch auftuple(x) for
und.split()])) if
Rubin (242)
quelle
STDIN
(ARGF
oder einfach nurgets
).C #
quelle