Znajdź kolumny, w których wszystkie znaki są takie same

18

Natknąłem się na to pytanie na SO i pomyślałem, że będzie to fajne wyzwanie golfowe. Oto on:

Wyzwanie:

Napisz program, który czyta sekwencję ciągów znaków, po jednym w wierszu, i wyświetla listę wszystkich pozycji, w których każdy ciąg ma ten sam znak.

Wejście i wyjście:

Dane wejściowe składają się z co najmniej jednego wiersza drukowalnych znaków ASCII, które nie są spacjami, a po każdym następuje nowy wiersz. Państwo może założyć, że wszystkie linie wejściowe mają taką samą długość. Nowa linia nie powinna być uważana za część danych wejściowych (tzn. Nie należy wyprowadzać jej jako pasującego znaku).

Przykładowe dane wejściowe (bezwstydnie skradzione z pytania SO):

abcdefg
avcddeg
acbdeeg

Po odczytaniu danych wejściowych program powinien wydrukować pozycje każdej pasującej kolumny i zawarte w nich znaki. (Twój program może, ale nie musi, przestać czytać dalsze dane wejściowe, jeśli może wcześnie ustalić, że nie ma pasujących kolumn). Dowolny rozsądny format wyjściowy jest dozwolony; w szczególności możesz użyć indeksowania opartego na 0 lub na podstawie 1 dla pozycji.

Przykładowe dane wyjściowe dla powyższych danych wejściowych (przy użyciu indeksowania opartego na 0):

0: a
3: d
6: g

Punktacja:

To jest golf golfowy, więc wygrywa najkrótsza odpowiedź. W przypadku remisu ułamkowe znaki rozdzielające remisy mogą zostać przyznane za dodatkowe funkcje:

  • ½½ znaki do prawidłowej obsługi wierszy wejściowych o nierównej długości. (Dane wyjściowe nie powinny zawierać pozycji poza końcem najkrótszej linii wejściowej.)
  • ¼ znaków do poprawnej obsługi danych wejściowych składających się z dowolnych znaków Unicode zakodowanych w UTF-8.

Aby uzyskać inspirację, możesz znaleźć nierozwiązane rozwiązania w pytaniu SO (patrz wyżej).

Wyjaśnienia:

  • Po prostu łączenie pozycji i znaków, jak w 0a3d6g, nie liczy się jako „rozsądny wynik”. Powinieneś zapewnić jakiś separator (na przykład spację) między każdym elementem wyniku, aby można go było jednoznacznie przeanalizować.

  • Dane wejściowe będą dostarczane w standardowym strumieniu wejściowym ( stdin) lub przy użyciu dowolnego mechanizmu wprowadzania plików tekstowych, który jest najbardziej naturalny dla wybranego języka. (Jeśli wybrany język nie ma naturalnego mechanizmu wprowadzania plików, rób wszystko, co wydaje się najbliższe duchowi.)

  • Dane wejściowe kończą się, gdy nie ma już danych do odczytu (tj. Gdy wystąpi warunek końca pliku). Jeśli chcesz, to może wymagać, że wejście zostać rozwiązana przez pustą linię (które następnie nie należy liczyć jako część wkładu, oczywiście). Jeśli to zrobisz, proszę o tym wspomnieć w swojej odpowiedzi, aby inni mogli podać poprawne dane wejściowe do testów.

  • Każda linia wprowadzania, w tym ostatnia, kończy się znakiem nowej linii. Twoja odpowiedź nie może zgłaszać tego nowego wiersza jako pasującej kolumny. (W porządku, jeśli twoje rozwiązanie obsługuje również dane wejściowe, w których ostatni wiersz nie kończy się na nowej linii, ale nie jest to wymagane).

Ilmari Karonen
źródło
Czy pusty wiersz kończy wprowadzanie?
Steven Rumbalski
„Powinieneś zapewnić jakiś separator między każdym elementem wyniku, aby można go było jednoznacznie przeanalizować”. Czy przestrzeń liczy się jako separator?
Steven Rumbalski
@StevenRumbalski: Wejście kończy się, gdy nie ma już więcej danych do odczytania; Chyba mogę dopuścić końcową pustą linię, jeśli twój język ma problemy z wykryciem EOF. I tak, przestrzeń jest idealnie dobrym separatorem.
Ilmari Karonen
Czy możemy uzyskać dowolny przykładowy kod znaków Unicode zakodowanych w UTF-8?
użytkownik nieznany

Odpowiedzi:

12

APL, 25 znaków

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

Jako interpretera użyłem Dyalog APL (wersja 13). Obsługuje zarówno dane wejściowe o nierównej długości, jak i znaki Unicode (UTF-8).

Przykłady:

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

  1 a  4 d  7 g  

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

  4 t  5 日  6 本 

Objaśnienie, nieco od prawej do lewej:

  • Główną częścią tej odpowiedzi jest funkcja bezpośrednia (w zasadzie funkcja anonimowa), zdefiniowana w nawiasach klamrowych. Jego właściwy argument jest określony przez .
    • 0=⍴⍵:⍬jest naszym pierwszym wyrażeniem i sprawdza, czy otrzymaliśmy pustą linię (tzn. skończymy). Wykorzystuje wartownik (znajomy konstrukt dla wielu programistów funkcjonalnych), aby warunkowo wykonać wyrażenie po prawej stronie jelita grubego. W takim przypadku, jeśli 0 jest równe kształtowi / długości ( ) odpowiedniego argumentu, zwracamy pusty set ( ).
    • oddziela dwa wyrażenia w ramach funkcji. Jeśli poprzednie wyrażenie nie zostało ocenione (a zatem nic nie zwróciło), przechodzimy do następnego wyrażenia.
    • Rekurencyjnie wywołujemy funkcję za pomocą funkcji samodzielnego odwoływania się ( ). Argumentem tej funkcji jest wiersz bez oceny danych wejściowych użytkownika, podany przez quote-quad ( ).
    • ⊂⍵,⍨¨⍳⍴⍵ tworzy pary dla każdego znaku w ciągu, gdzie pierwszym elementem każdej pary jest jego pozycja w ciągu, a drugim elementem jest znak.
    • ⍳⍴⍵daje wektor od 1 do ⍴⍵lub długość ciągu wejściowego.
    • ⍵,⍨¨stosuje funkcję zamiany konkatenacji ( ,⍨) do każdego ¨elementu ( ) po jego lewej stronie ( w tym przypadku danych wejściowych użytkownika) i prawej. Dojazdy do funkcji konkatenacji powoduje zamianę jej lewego i prawego argumentu.
    • Na koniec załączamy wynik za pomocą , abyśmy mogli rozróżnić linie wprowadzania.
  • Początkowo karmimy naszą funkcję danymi wejściowymi użytkownika ( ).
  • Na koniec redukujemy ( /) nasz wynikowy wektor wektorów par za pomocą funkcji przecięcia ( ), uzyskując pary, które znajdują się we wszystkich wektorach podrzędnych.
Dillon Cower
źródło
Nie bez powodu mam trzeźwą negatywną odpowiedź za każdym razem, gdy widzę APL, której nie mam dla J lub GolfScript. Ale i tak +1 dla doskonałego rozwiązania.
Steven Rumbalski,
Właściwie to zastanawiałem się nad przejściem na J ... Zaznaczę to na mojej liście powodów. :)
Dillon Cower
12

Golfscript (28 znaków)

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

Występują problemy z zestawem znaków podczas przesyłania przez Unicode, więc nie ma premii za ćwierć punktu.

Peter Taylor
źródło
1
+1. To nie powinno mieć mniej pozytywnych opinii niż moja odpowiedź.
Steven Rumbalski,
9

J, 57 51 44 40 znaków

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

Docieram tam powoli, ale na pewno. Myślę, że wciąż jest to dalekie od ideału.

Byłem pewien, że użycie haka byłoby odpowiedzią, ale niestety nie (44 znaki):

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

Mogę potrzebować zupełnie innej metody, aby skrócić.

Gareth
źródło
1
+1. Ale tak, oczekuję lepiej od J.
Stevena Rumbalskiego
To nie powinno mieć mniej pozytywnych opinii niż moja odpowiedź.
Steven Rumbalski,
1
@StevenRumbalski Upvotes nie zawsze odzwierciedlają względne rozmiary kodu. Czasami staje się konkursem popularności języka. Zgadzam się, że odpowiedź na skrypt golfowy powinna znaleźć się na liście APL, niestety, już wyraziłem swoje poparcie i nie mogę pomóc dalej.
Gareth,
8

Haskell, 64 znaków

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

Obsługuje linie o nierównej długości. Obsługa Unicode zależy od bieżących ustawień regionalnych.

Przykładowe dane wyjściowe:

[(0,'a'),(3,'d'),(6,'g')]
hammar
źródło
+1. To nie powinno mieć mniej pozytywnych opinii niż moja odpowiedź.
Steven Rumbalski,
7

Python 2, wynik 81,5 ( 116 94 86 83 82 bajtów 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
źródło
+1 za fajny golf w Pythonie, ale możesz stracić całe CZTERY postacie: [:-1]nie jest to konieczne, chyba że usuwasz obcy nowy wiersz na końcu danych wejściowych (który wydaje się nawet nie występować w pytaniu).
ChristopheD
@ChristopheD: W rzeczywistości wynikiem zip(*sys.stdin)jest [('a', 'a', 'a'), ('b', 'v', 'c'), ('c', 'c', 'b'), ('d', 'd', 'd'), ('e', 'd', 'e'), ('f', 'e', 'e'), ('g', 'g', 'g'), ('\n', '\n', '\n')]. Nie widzę sposobu na uniknięcie usuwania ostatniej krotki nowych linii. Proszę mnie poprawić, jeśli źle zrozumiałem. Dziękuję za opinię.
Steven Rumbalski
Jeśli usuniesz ostatnią nową linię w pliku danych, krotka dla tej linii nie jest kompletna (pomija jeden „\ n”, więc zip bierze pod uwagę i zwraca dane, których szukamy, umożliwiając usunięcie [:-1]. Np.zip([1,2,3,4],[1,2,3])=> [(1, 1), (2, 2), (3, 3)]
ChristopheD
@ChristopheD: Zgodnie ze specyfikacją „dane wejściowe składają się z [...] wierszy [...], a po każdym z nich nowa linia.”
Ilmari Karonen,
1
Czy osoba, która przegłosowała tę odpowiedź, wyjaśni, dlaczego?
Steven Rumbalski
5

(Bash) Skrypty powłoki, 105 znaków

Jeśli ktoś ma do tego więcej sztuczek, prosimy o wypełnienie komentarza!

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

Wynik:

1 a
4 d
7 g
ChristopheD
źródło
Mam problem z uruchomieniem tego; uruchomienie tego na przykładowym wejściu wypisuje serię błędów takich jak /tmp/cols.sh: line 2: [1: command not foundi nic więcej.
Ilmari Karonen,
@Ilmari Karonen: przetestowano to na komputerze Mac (lampart śnieżny, 10.6.2), ale powinno działać gdzie indziej. Zobaczę, żeby to naprawić jutro w Linuksie (powinno być drobną poprawką)
ChristopheD
2
ormaaj brakowało przedstawiciela, ale chciał skomentować: dla Ilmari psuje się z powodu braku spacji po [; a $ {y: 3} spowoduje, że będzie działał tylko z dokładnie 3 liniami danych wejściowych. Naprawianie i optymalizowanie wydajności (100 znaków) while((++i%`tail -1 $1|wc -c`));do x=`cut -c$i $1`;((`uniq|wc -l`==1))<<<"$x"&&echo $i ${x: -1};donei używanie wartości domyślnych powinno pozwolić zaoszczędzić jeszcze jeden, for((;++i<`tail -1 $1|wc -c`;))doale w bashu jest nierozwiązany błąd.
Peter Taylor
4

Perl, 87 znaków (½½ char premia za remis)

Oto golfowa wersja mojego własnego rozwiązania z wątku SO :

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

W przeciwieństwie do wersji SO, ten używa indeksów opartych na 1 dla danych wyjściowych. Korzysta z funkcji Perl 5.10 say, więc musi być uruchamiany z perl -M5.010(lub z perl -E).

Podobnie jak w wersji tak, to uchwyty kod linie o zmiennej długości, a będzie obsługiwać dowolny wkład Unicode jeśli standardowe wejście i wyjście było w trybie UTF-8. Niestety, domyślnie nie są, chyba że określono niewolny -CS przełącznik wiersza poleceń. W ten sposób zarabia premię ½ ½ char, ale nie ¼.

Edycja: +1 char, aby naprawić błąd: tylko dlatego, że ciągi wejściowe nie zawierają kanałów, nie oznacza, że ​​nie mogą się skończyć $a(np "+" & "J" eq "\n".).

Ilmari Karonen
źródło
1
Możesz zapisać 1 znak, używając chopzamiast chomp.
Toto
@ M42: Dobra uwaga, chociaż bardziej podoba mi się wytrzymałość obecnej wersji. Myślę, że zatrzymam mna razie, to nie jest tak, że ma to jakikolwiek wpływ na rankingi w tej chwili. :)
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
źródło
2

Scala 115 107: (¼ do obsługi UTF-8)

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

bez golfa, a Source.fromFile ("f")zamiaststdin dla lepszej testowalności:

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

Wynik:

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

Dzięki Garethowi za zmniejszenie rozmiaru 8 za użycie stdin.

nieznany użytkownik
źródło
Nie możesz użyć stdinzamiast fromFile("f")zapisać 8 znaków?
Gareth,
2

VBA ( premia 307,25 284 - 0,75 = 283,25)

Wiem, że to już zostało wygrane, ale oto mój strzał (nie czytam pliku, tylko ciąg znaków - trzeba dodać io). Podoba mi się, że muszę używać l()rekurencyjnie. Zazwyczaj nie potrzebuję rekurencji w moim prawdziwym programowaniu. Zrobiłem tylko tyle testów, ale uważam, że obejmuje to punkt bonusowy Unicode. Zakłada również, że vbCrjest to terminator linii. Z tego powodu może to nie zostać przetłumaczone na wszystkie systemy.

Kod:

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

Przykładowe wejście / wyjście:

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

1: a
2: b
3: c
7: g
Gaffi
źródło
2

P, 32

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

stosowanie

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

K, 22

Powyższe rozwiązanie można zredukować do 22, pisząc je całkowicie w K, zamiast przekazywać funkcje K do interpretera Q, co zmniejsza liczbę wymaganych nawiasów.

{a!@[*x]a:&1=#:'?:'+x}
tartin
źródło
1

PHP, 123 127 :(

Nie jestem z tego zadowolony (będą musiały zostać wprowadzone ulepszenia), ale oto:

<?$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";}

Dowód to działa.

Jeśli ktoś może wymyślić bardziej sprytny sposób inicjowania $ a i $ b, daj mi znać. Początkowo miałem, $a=$b=$n=''a $ b w końcu było poprawne, ale [empty] & [anything] == [empty]więc $ a nigdy nie miałem treści.


Edycja: Musiałem naprawić obsługę nowego wiersza (+6), ale upuściłem zamykający tag (-2).

GigaWatt
źródło
Jestem ciekawy, dlaczego tworzysz większość swoich wiki wiki?
Gareth,
Nie miałem na myśli tego. Dawno, dawno temu, kiedy dołączyłem do CodeGolf, ktoś powiedział mi, że to standard. Muszę zerwać z nałogiem. Można go jednak cofnąć wiki. codegolf.stackexchange.com/a/2249/1419 (patrz komentarze)
Pan Llama,
Myślę, że był to standardowy sposób robienia rzeczy na SO dla pytań do golfa kodowego, ale nie tutaj, inaczej nikt nie miałby żadnej reputacji. :-)
Gareth,
Prawdopodobnie możesz je oflagować i poprosić moderatora o ich cofnięcie . Wyjaśnij, że to był błąd.
Ilmari Karonen
Możesz zapisać dwa znaki, pomijając ?>. Zauważyłem jednak, że twój kod zawiera błąd: drukuje dodatkowe dopasowanie, jeśli wszystkie linie zawierają końcowy znak nowej linii, jak określono.
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/

Edycja 1 : Zmień kolejność pętli, aby uniknąć nawiasów klamrowych. Zainicjuj i, []aby połączyć z s. Przesuń wprzyrost wyrażenia.

Edycja 2 : Ustaw S=Iprzechwytywanie ostatnio wprowadzonego słowa i zapisywanie za pomocą s[1]. Połącz r=1i ++c<S.length. Ustaw C=s[c]w wewnętrznej pętli i porównaj Cz poprzednimi i następnymi słowami, aby skrócić wyrażenie s[w][c]==s[w++][c]do just s[w++][c]==C. Zapisano w sumie 9 znaków. Także ustawione, w=r=...ponieważ kiedy to prawda, w=1to właśnie z tym musimy zainicjować w.

mellamokb
źródło
1

Rubin (71)

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

wynik:

[0, "a"]
[3, "d"]
[6, "g"]
jsvnm
źródło
Uwaga: wydaje się wymagać Ruby 1.9; Ruby 1.8 kompatybilności, wymienić t[i]z t[i,1].
Ilmari Karonen,
1

Common Lisp, 183 165 znaków

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

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

Wprowadź to bezpośrednio do REPL i wprowadź linie, kończąc pustą linią.

Paul Richter
źródło
1

C, 126 znaków

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]);}

Patrzyłem na to, ale po prostu nie mogę go zmniejszyć. Konieczne może być nowe podejście.

(Brak punktów bonusowych; obsługuje linie różnej wielkości tylko wtedy, gdy pierwsza linia jest krótsza.)

chlebak
źródło
0

C # z .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 linia, 280 znaków
  • Obejmuje wszystkie niezbędne instrukcje i metodę Main.
  • Program nie wymaga pustej linii na końcu, ale ją zaakceptuje
  • Puste linie są ignorowane
  • Obsługuje ciągi wejściowe o dowolnej długości.
  • Rezerwuje dane wyjściowe do końca (podczas gdy pierwotna odpowiedź zawierała dane wyjściowe przyrostowe)

Wersja do odczytu

    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]);

Oryginalna odpowiedź

using c = System.Console; klasa P {static void Main () {char [] a; var b = c.ReadLine (); a = b.ToCharArray (); while (b! = "") {for (int i = 0;

  • 1 linia
  • 207 znaków
  • Obejmuje wszystkie niezbędne instrukcje i metodę Main.
  • Program kończy się po wprowadzeniu pustej linii.
  • Nie obsługuje ciągów wejściowych krótszych niż pierwszy.


Wersja do odczytu:

    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 Apprentice
źródło
Kiedy uruchamiam to na wejściu testowym w wyzwaniu, otrzymuję 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. Oczekiwany wynik to 0: a 3: d 6: g.
Ilmari Karonen
@Ilmari Ok, ale wyświetla kolumny / znaki, które są takie same po każdej linii wejściowej. Jeśli podajesz plik jako standardowe wejście, wówczas dane wyjściowe mogą wydawać się dziwne, ale jeśli wprowadzasz ręcznie, myślę, że ma to sens. Zastanowię się jednak, jak refaktoryzować.
Dr Wily's Apprentice
Twoje rozwiązanie ulega awarii, jeśli jakakolwiek linia jest dłuższa niż pierwsza linia.
Timwi
@Timwi Ah ... dzięki za zwrócenie na to uwagi!
Dr Wily's Apprentice
0

python 122 znaków :

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
źródło
nie potrzebujesz spacji między )a for. Zamiast tego …str(x[0]) for i,x…możesz to zrobić …str(x[0])for i,x…. Jest również wyposażony w górę tuple(x) fori.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
źródło
Wyzwaniem było odczytanie wierszy ze standardowego wejścia. Jestem gotów zmniejszyć luz w przypadku języków (takich jak JavaScript w przeglądarce), w których ta koncepcja tak naprawdę nie istnieje, ale Ruby ma STDIN( ARGFlub po prostu gets).
Ilmari Karonen,
Ah, dobrze. Ale biorąc pod uwagę, że STDIN akceptuje jedną linię, czy należy przyjąć coś takiego: „Wejdź w inną linię lub„ n ”, aby zatrzymać”? Dlatego utwórz pętlę, aby zbudować tablicę.
agmcleod
Dodałem kilka wyjaśnień do pytania. Zasadniczo powinieneś czytać wiersze wejściowe aż do osiągnięcia końca pliku.
Ilmari Karonen,
masz mnóstwo niepotrzebnych białych znaków.
Cyoce
-1

DO#

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
źródło
1
Cześć Arjang. Witamy w codegolf.SE! Kilka komentarzy do twojej odpowiedzi: Po pierwsze, ponieważ jest to wyzwanie związane z golfem , powinieneś postarać się, aby Twoje rozwiązanie było jak najkrótsze; po pierwsze, masz kilka długich nazw zmiennych, które możesz łatwo skrócić do pojedynczych znaków, i trochę nadmiaru białych znaków, które możesz usunąć. (W porządku jest opublikowanie czytelnej wersji kodu wraz z „golfem”, ale tak naprawdę powinieneś również opublikować rozwiązanie w golfa.) Po drugie, jeśli dokładnie przeczytałeś pytanie, określiłem, że powinieneś czytać ciągi ze standardowego wejścia , nie koduj ich na stałe.
Ilmari Karonen