Suchen Sie nach Spalten, in denen alle Zeichen gleich sind

18

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 0a3d6gzä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.)

Ilmari Karonen
quelle
Beendet also eine Leerzeile die Eingabe?
Steven Rumbalski
Msgstr "Sie sollten eine Art Trennzeichen zwischen jedem Element der Ausgabe angeben, damit es eindeutig analysiert werden kann." Zählt ein Leerzeichen als Trennzeichen?
Steven Rumbalski
@StevenRumbalski: Die Eingabe endet, wenn keine Daten mehr zu lesen sind. Ich schätze, ich kann eine nachgestellte Leerzeile zulassen, wenn Ihre Sprache Probleme mit der Erkennung von EOF hat. Und ja, ein Leerzeichen ist ein perfektes Trennzeichen.
Ilmari Karonen
Können wir einen beliebigen UTF-8-codierten Unicode-Beispielcode haben?
Benutzer unbekannt

Antworten:

12

APL, 25 Zeichen

∩/{0=⍴⍵:⍬⋄(⊂⍵,⍨¨⍳⍴⍵),∇⍞}⍞

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:

      ∩/{0=⍴⍵:⍬⋄(⊂⍵,⍨¨⍳⍴⍵),∇⍞}⍞
abcdefg
avcddeg
acbdeeg

  1 a  4 d  7 g  

      ∩/{0=⍴⍵:⍬⋄(⊂⍵,⍨¨⍳⍴⍵),∇⍞}⍞
test日本
blat日本国foo

  4 t  5 日  6 本 

Erklärung, etwas von rechts nach links:

  • Der Hauptteil dieser Antwort ist die direkte Funktion (im Grunde anonyme Funktion), die in geschweiften Klammern definiert ist. Sein rechtes Argument wird durch angegeben .
    • 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.
    • Wir rufen die Funktion rekursiv mit der Selbstreferenzfunktion ( ) 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.
    • Schließlich schließen wir das Ergebnis mit ein , damit wir zwischen Eingabezeilen unterscheiden können.
  • Wir füttern unsere Funktion zunächst mit Benutzereingaben ( ).
  • Schließlich reduzieren ( /) wir unseren resultierenden Vektor von Vektoren von Paaren unter Verwendung der Schnittfunktion ( ), was die Paare ergibt, die in allen Untervektoren gefunden werden.
Dillon Cower
quelle
Aus keinem guten Grund habe ich eine negative viszerale Reaktion, wenn ich APL sehe, die ich für J oder GolfScript nicht habe. Aber trotzdem +1 für eine exzellente Lösung.
Steven Rumbalski
Ich habe tatsächlich darüber nachgedacht, zu J zu wechseln. :)
Dillon Cower
12

Golfscript (28 Zeichen)

n/zip:^,,{.^=.&.,1>{;;}*}%n*

Beim Weiterleiten von Unicode treten Zeichensatzprobleme auf, daher kein Viertelpunktebonus.

Peter Taylor
quelle
1
+1. Dies sollte nicht weniger positive Stimmen haben als meine Antwort.
Steven Rumbalski
9

J, 57 51 44 40 Zeichen

,.&.>y;y{{.z[y=.I.*/2=/\]z=.];._2]1!:1]3

Ich 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):

,.&.>((];({{.)~)([:I.[:*/2=/\]))];._2]1!:1]3

Möglicherweise brauche ich eine ganz andere Methode, um kürzer zu werden.

Gareth
quelle
1
+1. Aber ja, ich erwarte besser von J.
Steven Rumbalski
Dies sollte nicht weniger positive Stimmen haben als meine Antwort.
Steven Rumbalski
1
@StevenRumbalski Die Upvotes geben nicht immer die relative Größe des Codes wieder. Es wird manchmal zu einem Sprachwettbewerb. Ich bin damit einverstanden, dass die Golfscript-Antwort dort oben bei der APL sein sollte. Leider habe ich ihr bereits meine Zustimmung gegeben und kann nicht anders, als sie weiter nach oben zu treiben.
Gareth
8

Haskell, 64 Zeichen

main=interact$show.foldl1(filter.flip elem).map(zip[0..]).lines

Behandelt Zeilen ungleicher Länge. Die Unicode-Unterstützung hängt von den aktuellen Ländereinstellungen ab.

Beispielausgabe:

[(0,'a'),(3,'d'),(6,'g')]
Hammar
quelle
+1. Dies sollte nicht weniger positive Stimmen haben als meine Antwort.
Steven Rumbalski
7

Python 2, Punktzahl 81,5 ( 116 94 86 83 82 Bytes minus Bonus)

import sys
i=0
for x in zip(*sys.stdin)[:-1]:
 i+=1
 if len(set(x))<2:print i,x[0]
Steven Rumbalski
quelle
+1 für ein schönes Python-Golfspiel, aber Sie können VIER Zeichen verlieren: [:-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).
ChristopheD
@ChristopheD: Eigentlich das Ergebnis 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.
Steven Rumbalski
Wenn Sie die letzte neue Zeile in Ihrer Datendatei entfernen, ist das Tupel für diese Zeile nicht vollständig (ein '\ n' fehlt, sodass zip nur die gesuchten Daten berücksichtigt und zurückgibt und das Entfernen von [:-1]zulässt. ZBzip([1,2,3,4],[1,2,3])=> [(1, 1), (2, 2), (3, 3)]
ChristopheD
@ChristopheD: Gemäß Spezifikation "besteht die Eingabe aus [...] Zeilen, [...] denen jeweils eine neue Zeile folgt."
Ilmari Karonen
1
Würde die Person, die diese Antwort abgelehnt hat, erklären, warum?
Steven Rumbalski
5

(Bash) Shell Scripting, 105 Zeichen

Wenn jemand noch ein paar Tricks dazu hat, fülle sie bitte aus, um einen Kommentar abzugeben!

for((i=1;i<`tail -1 $1|wc -c`;i++))do
x="cut -c$i $1";y=`$x`;[ `$x|uniq|wc -l` = 1 ]&& echo $i ${y:3};done

Ergebnis:

1 a
4 d
7 g
ChristopheD
quelle
Ich habe Probleme damit, das zum Laufen zu bringen. Wenn Sie dies für die Beispieleingabe ausführen, wird eine Reihe von Fehlern wie /tmp/cols.sh: line 2: [1: command not foundund sonst nichts gedruckt .
Ilmari Karonen
@Ilmari Karonen: Dies wurde auf einem Mac getestet (Schneeleopard, 10.6.2), sollte aber woanders funktionieren. Ich werde es morgen unter Linux reparieren lassen (sollte ein kleines Update sein)
ChristopheD
2
ormaaj fehlte der rep, wollte aber kommentieren: es bricht für Ilmari wegen eines fehlenden Leerzeichens nach dem [; 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};doneund das Verwenden von Standardwerten sollte das Speichern von Erträgen mit ermöglichen, for((;++i<`tail -1 $1|wc -c`;))doaber es gibt einen nicht behobenen Fehler in der Bash.
Peter Taylor
4

Perl, 87 Zeichen (-½ Char Tie-Break-Bonus)

Hier ist eine Golfversion meiner eigenen Lösung aus dem SO-Thread :

chomp($a=$b=<>);$a&=$_,$b|=$_ for<>;@$_=$$_=~/./sgfor a,b;$b[$i++]eq$_&&say"$i:$_"for@a

Im Gegensatz zur SO-Version verwendet diese 1-basierte Indizes für die Ausgabe. Es verwendet die Perl 5.10- sayFunktion und muss daher mit perl -M5.010(oder mit perl -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 .

Ilmari Karonen
quelle
1
Sie können 1 Zeichen sparen, indem Sie chopanstelle von verwenden chomp.
Toto
@ M42: Guter Punkt, obwohl mir die Robustheit der aktuellen Version eher gefällt. Ich denke, ich werde das mfürs Erste behalten , es ist nicht so, als ob es im Moment einen Unterschied zur Rangliste macht. :)
Ilmari Karonen
3

T-SQL

SELECT N.number, letter = MIN(SUBSTRING(L.line, N.number, 1))
FROM Lines AS L
INNER JOIN master.dbo.spt_values AS N ON N.type = 'P'
WHERE N.number BETWEEN 1 AND (SELECT MAX(LEN(L2.line)) FROM Lines AS L2)
GROUP BY N.number
HAVING COUNT(DISTINCT SUBSTRING(L.line, N.number, 1)) = 1
ORDER BY N.number
Anthony Faull
quelle
2

Scala 115 107: (−¼ für den Umgang mit UTF-8)

io.Source.stdin.getLines.map(_.zipWithIndex).toList.flatten.groupBy(_._2).map(_._2.toSet).filter(_.size==1)

ungolfed und Source.fromFile ("f")statt stdinzur besseren Testbarkeit:

io.Source.fromFile ("f").
  getLines.map (_.zipWithIndex).
    toList.flatten.groupBy (_._2). 
      map (_._2.toSet).
        filter (_.size==1)

Ergebnis:

List(Set((a,0)), Set((g,6)), Set((d,3)))

Vielen Dank an Gareth für die Reduzierung der Größe 8 für die Verwendung stdin.

Benutzer unbekannt
quelle
Kannst du nicht stdinstatt fromFile("f")8 Zeichen speichern?
Gareth
2

VBA ( 307,25 284 - 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, dass vbCres sich um den Leitungsabschluss handelt. Dies kann daher möglicherweise nicht auf alle Systeme übertragen werden.

Code:

Function a(i)
b=Split(Left(i,Len(i)-1),vbCr):c=UBound(b):For q=1 To Len(b(c)):d=Mid(b(c),q,1):If l(b,c,q,d) Then a=a & q & ": " & d & vbCr:Next
End Function
Function l(m, n, o, p)
If n+1 Then l=IIf(o<=Len(m(n)),Mid(m(n),o,1)=p,0) And l(m,n-1,o,p) Else l=Mid(m(n+1),o,1)=p
End Function

Beispiel Ein- / Ausgabe:

Debug.Print a("abcdefghijklmnop" & vbCr & "abcdefg" & vbCr & "abcabcghijkl" & vbCr)

1: a
2: b
3: c
7: g
Gaffi
quelle
2

Q, 32

{a!((*:)x)a:(&)1=(#:')(?:')(+)x}

Verwendung

q){a!((*:)x)a:(&)1=(#:')(?:')(+)x}[("abcdefg";"avcddeg";"acbdeeg")]
0| a
3| d
6| g

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.

{a!@[*x]a:&1=#:'?:'+x}
tmartin
quelle
1

PHP, 123 127 :(

Ich bin damit nicht zufrieden (es muss Verbesserungen geben), aber hier ist:

<?$a=$b=trim(fgets(STDIN));while($l=fgets(STDIN)){$a&=$l;$b|=$l;}$n=-1;while(@$a[++$n]){echo$a[$n]!=$b[$n]?'':"$n:{$a[$n]}\n";}

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.

GigaWatt
quelle
Ich bin gespannt, warum machst du den größten Teil deiner Antworten im Community-Wiki?
Gareth
Das wollte ich nicht. Vor langer Zeit, als ich zum ersten Mal zu CodeGolf kam, sagte mir jemand, dass es Standard sei. Muss die Gewohnheit brechen. Kann es jetzt aber wieder entfernen. codegolf.stackexchange.com/a/2249/1419 (siehe Kommentare)
Mr. Llama
Ich denke, es war die Standardmethode, um Code-Golf-Fragen auf SO zu beantworten, aber ansonsten hätte niemand einen guten Ruf. :-)
Gareth
Sie könnten sie wahrscheinlich markieren und einen Moderator bitten, die CW-Funktion aufzuheben . Erkläre einfach, dass es ein Fehler war.
Ilmari Karonen
Sie könnten zwei Zeichen sparen, indem Sie das weglassen ?>. 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.
Ilmari Karonen,
1

JavaScript (125 134 140 )

for(i=s=[];I=s[++i]=prompt(o='');S=I);for(c=-1;w=r=++c<S.length;o+=r?c+':'+C+'\n':'')for(C=S[c];w<i;)r&=s[w++][c]==C;alert(o)

Demo: http://jsfiddle.net/Fv7kY/4/

Edit 1 : Arrangiere Loops neu, um Klammern zu vermeiden. Initialisiere i mit [], um es mit zu kombinieren s. Bewegen Sie wSchritt in Ausdruck.

Bearbeiten 2 : Legt fest S=I, dass das zuletzt eingegebene Wort erfasst und mit gespeichert wird s[1]. Kombinieren r=1und ++c<S.length. Setze C=s[c]in die innere Schleife und vergleiche mit Canstatt mit den vorherigen und nächsten Wörtern, um den Ausdruck s[w][c]==s[w++][c]auf nur zu verkürzen s[w++][c]==C. Insgesamt 9 Zeichen gespeichert. Auch gesetzt, w=r=...weil wenn das wahr w=1ist, mit was wir initialisieren müssen w.

mellamokb
quelle
1

Rubin (71)

a,*s=*$<.lines
(a.size-1).times{|i|s.all?{|t|t[i]==a[i]}&&p([i,a[i]])}

Ausgabe:

[0, "a"]
[3, "d"]
[6, "g"]
jsvnm
quelle
Hinweis: Scheint Ruby 1.9 zu erfordern; für Ruby 1.8 - Kompatibilität, ersetzen t[i]mit t[i,1].
Ilmari Karonen
1

Common Lisp, 183 165 Zeichen

(let((l(loop for m =(read-line)until(equal m "")collect m)))(loop for c across(car l)for i from 0 if(null(remove c(mapcar(lambda(y)(char y i))l)))collect(list i c)))

Lesbares Format:

(let ((l (loop for m = (read-line) until (equal m "") collect m)))
  (loop for c across (car l)
        for i from 0 
        if (null (remove c 
                         (mapcar (lambda(y) (char y i))l)))
        collect(list i c)))

Geben Sie dies direkt in die REPL ein und geben Sie Zeilen ein, die mit einer leeren Zeile enden.

Paul Richter
quelle
1

C 126 Zeichen

char a[999],b[999];main(i){for(gets(a);gets(b);)for(i=0;b[i];++i)a[i]^b[i]?a[i]=0:0;
while(i--)a[i]&&printf("%d:%c\n",i,a[i]);}

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.)

Brot-Box
quelle
0

C # mit .NET 4 (280)

using c=System.Console;class P{static void Main(){char[]a=c.ReadLine().ToCharArray();int r,i,l=a.Length;m:i=0;n:r=c.Read();if(r>0&&r!=10&&r!=13){if((int)a[i]!=r)a[i]='\0';i++;goto n;}for(;i>0&&i<l;)a[i++]='\0';if(r>0)goto m;for(i=0;i<l;i++)if(a[i]!='\0')c.WriteLine(i+":"+a[i]);}}
  • 1 Zeile, 280 Zeichen
  • Beinhaltet alle erforderlichen using-Anweisungen und die Main-Methode.
  • Das Programm benötigt am Ende keine Leerzeile, akzeptiert diese aber
  • Leerzeilen werden ignoriert
  • Verarbeitet Eingabezeichenfolgen beliebiger Länge.
  • Reserviert die Ausgabe bis zum Ende (während die ursprüngliche Antwort eine inkrementelle Ausgabe lieferte)

Lesbare Version

    char[]a=c.ReadLine().ToCharArray();
    int r,i,l=a.Length;
    m:
    i=0;
    n:
    r=c.Read();
    if(r>0&&r!=10&&r!=13){
        if((int)a[i]!=r)
            a[i]='\0';
        i++;
        goto n;
    }
    for(;i>0&&i<l;)
        a[i++]='\0';
    if(r>0)
        goto m;
    for(i=0;i<l;i++)
        if(a[i]!='\0')
            c.WriteLine(i+":"+a[i]);

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; i

  • 1 Zeile
  • 207 Zeichen
  • Beinhaltet alle erforderlichen using-Anweisungen und die Main-Methode.
  • Das Programm endet, wenn eine Leerzeile eingegeben wird.
  • Behandelt keine Eingabezeichenfolgen, die kürzer als die erste sind.


Lesbare Version:

    static void Readable()
    {
        char[]a;
        string b=System.Console.ReadLine();
        a=b.ToCharArray();
        while(b.Length>0)
        {
            for (int i = 0; i < a.Length; i++)
            {
                if (a[i] != b[i])
                {
                    a[i] = '\0';
                }
                else
                {
                    System.Console.WriteLine(i+": "+a[i]);
                }
            }
            b=System.Console.ReadLine();
        }
    }

Dr. Wily's Lehrling
quelle
Wenn ich dies auf den Testeingang in der Challenge starte, bekomme ich 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äre 0: a 3: d 6: g.
Ilmari Karonen
@Ilmari Ok, aber es werden die Spalten / Zeichen ausgegeben, die nach jeder Eingabezeile gleich sind. Wenn Sie eine Datei als Standardeingabe eingeben, erscheint die Ausgabe möglicherweise seltsam, aber wenn Sie manuell eingeben, ist dies meiner Meinung nach sinnvoll. Ich werde jedoch überlegen, wie man eine Umgestaltung vornimmt.
Dr. Wily's Apprentice
Ihre Lösung stürzt ab, wenn eine Zeile länger als die erste Zeile ist.
Timwi
@ Timwi Ah ... danke für den Hinweis!
Dr. Wily's Apprentice
0

Python 122 Zeichen :

print("\n".join([str(i)+':'+str(x[0]) for i,x in enumerate(zip(*[tuple(x) for x in input().split()])) if len(set(x))<2]))
Ashwini Chaudhary
quelle
Sie brauchen kein Leerzeichen zwischen )und for. Stattdessen …str(x[0]) for i,x…können Sie das tun …str(x[0])for i,x…. Es kommt auch auf tuple(x) forund.split()])) if
Cyoce
-1

Rubin (242)

s = %w{ abcdefg avcddeg acbdeeg aejdjeggd }
cols = []
s.sort{ |a, b| b.size <=> a.size }[0].size.times do |i|
  uneq=true
  l = s[0][i]
  s.each { |w| uneq = false if l != w[i] }
  cols << [l, i] if uneq
end
cols.each { |c| puts c.join('|') }
agmcleod
quelle
Die Herausforderung bestand darin, die Zeilen von der Standardeingabe zu lesen. Ich bin bereit, für Sprachen (wie JavaScript in Browsern), in denen dieses Konzept nicht wirklich existiert, ein wenig Spielraum zu haben, aber Ruby hat es STDIN( ARGFoder einfach nur gets).
Ilmari Karonen
ach okay Aber wenn man bedenkt, dass STDIN eine Zeile akzeptiert, ist es dann so, als würde man annehmen: "Geben Sie in eine andere Zeile ein, oder 'n', um anzuhalten"? Erstellen Sie daher eine Schleife, um ein Array zu erstellen.
Am
Ich habe der Frage einige Klarstellungen hinzugefügt. Grundsätzlich sollten Sie die Eingabezeilen so lange lesen, bis Sie das Dateiende erreicht haben.
Ilmari Karonen
Sie haben eine Menge unnötiger Leerzeichen.
Cyoce
-1

C #

List<string> strings = new List<string> { "abcdefg", "avcddeg", "acbdeeg", "aejdjeggd" };
var transposes = from index in Enumerable.Range(0, strings.First().Length)
                 select new string((from s in strings select s[index]).ToArray());
int i = 0;
foreach(string transpose in transposes)
{
   if (transpose.Distinct().Count() == 1)
     Console.WriteLine("{0}: {1}", i , transpose[0]);
   i++;
}
Arjang
quelle
1
Hallo Arjang und herzlich willkommen bei codegolf.SE! Ein paar Kommentare zu Ihrer Antwort: Da es sich um eine Code-Golf- Herausforderung handelt, wird von Ihnen erwartet, dass Sie versuchen, Ihre Lösung so kurz wie möglich zu halten. Zunächst haben Sie einige lange Variablennamen, die Sie leicht auf einzelne Zeichen verkürzen können, und einige überflüssige Leerzeichen, die Sie entfernen können. (Es ist in Ordnung, eine lesbare Version Ihres Codes zusammen mit der "golfed" zu veröffentlichen, aber Sie sollten auch eine golfed-Lösung veröffentlichen.) Zweitens, wenn Sie die Frage sorgfältig lesen, habe ich angegeben, dass Sie die Zeichenfolgen von der Standardeingabe lesen sollten , nicht fest codieren.
Ilmari Karonen