Bash Perl, 231 229 218 178 164 166 138 106 74 bayt
/^(((.*).*)\2+)\3$/;$_.=$1x2;$.--,die$+[1]if/^(.*)(.)(.*)
.*\1(?!\2).\3/
Komut dosyası, -n
iki bayttan oluşan anahtarı kullanmayı gerektirir .
Desenin tüm tekrarlarının iki kopyasını ekleme fikri MT0'ın cevabından alınmıştır .
Diğer tüm cevapların aksine, bu yaklaşım her bir yinelemede mevcut giriş çizgisinin desenini çıkarmaya çalışır; tek karakteri içeren satırda başarısız olur (ve bunun yerine önceki satırın desenini kullanır). Bu, birkaç bayt kaydetmeyi başaran döngüdeki desen çıkarma işlemini dahil etmek için yapılır.
Ungolfed sürümü
#!/usr/bin/perl -n
# The `-n' switch makes Perl execute the entire script once for each input line, just like
# wrapping `while(<>){…}' around the script would do.
/^(((.*).*)\2+)\3$/;
# This regular expression matches if `((.*).*)' - accessible via the backreference `\2' -
# is repeated at least once, followed by a single repetition of `\3" - zero or more of the
# leftmost characters of `\2' - followed by the end of line. This means `\1' will contain
# all full repetitions of the pattern. Even in the next loop, the contents of `\1' will be
# available in the variable `$1'.
$_.=$1x2;
# Append two copies of `$1' to the current line. For the line, containing the odd
# character, the regular expression will not have matched and the pattern of the previous
# line will get appended.
#
# Since the pattern is repeated at least two full times, the partial pattern repetition at
# the end of the previous line will be shorter than the string before it. This means that
# the entire line will the shorter than 1.5 times the full repetitions of the pattern,
# making the two copies of the full repetitions of the pattern at least three times as
# long as the input lines.
$.-- , die $+[1] if
# If the regular expression below matches, do the following:
#
# 1. Decrement the variable `$.', which contains the input line number.
#
# This is done to obtain zero-based coordinates.
#
# 2. Print `$+[1]' - the position of the last character of the first subpattern of the
# regular expression - plus some additional information to STDERR and exit.
#
# Notably, `die' prints the (decremented) current line number.
/^(.*)(.)(.*)
.*\1(?!\2).\3/;
# `(.*)(.)(.*)', enclosed by `^' and a newline, divides the current input line into three
# parts, which will be accesible via the backreferences `\1' to `\3'. Note that `\2'
# contains a single character.
#
# `.*\1(?!\2).\3' matches the current input line, except for the single character between
# `\1' and `\3' which has to be different from that in `\2', at any position of the line
# containing the pattern repetitions. Since this line is at least thrice as long as
# `\1(?!\2).\3', it will be matched regardless of by how many characters the line has been
# rotated.
Misal
Test senaryosu için
codegolfcodegolfco
egolfcodegolfcodeg
lfcodegolfcodegoff
odegolfcodegolfcod
golfcodegolfcodego
fcodegolfcodegolfc
Golf versiyonunun çıktısı
16 at script.pl line 1, <> line 2.
yani tek karakterin koordinatları vardır 16,2
.
Bu açıkça istismar , liberal çıktı formatından yararlanır.
Çıkmadan hemen önce, Perl'in bazı özel değişkenlerinin içeriği şunlardır:
$_ = lfcodegolfcodegoff\ncodegolfcodegolfcodegolfcodegolf
$1 = lfcodegolfcodego
$2 = f
$3 = f
( $n
arka referans üzerinden erişilebilen alt şablonun eşleşmesini içerir \n
.)