Bir sayıyı bağımsız değişken olarak alan ve minimum sayı ekleyerek onu bir palindrom yapan bir işlev yazın. Sayı en fazla 100 basamaklı olacaktır.
Sample Inputs
12
122
232
2323
1012121
Sample Outputs
121
1221
232
23232
101212101
Bir sayıyı bağımsız değişken olarak alan ve minimum sayı ekleyerek onu bir palindrom yapan bir işlev yazın. Sayı en fazla 100 basamaklı olacaktır.
Sample Inputs
12
122
232
2323
1012121
Sample Outputs
121
1221
232
23232
101212101
Yanıtlar:
f=:{.@(,"1(-:|.)\.#|.@}:\)
Örneğin
f '12'
121
f '232'
232
f '2323'
23232
f '1012121'
101212101
y =: '1012121'
[\.y NB. Sub lists of y
1012121
012121
12121
2121
121
21
1
|.\. y NB> Reverses of sub lists of y
1212101
121210
12121
1212
121
12
1
([\. y) -:"1 (|. \. y) NB. Which of them are equal? (those are palindromes)
NB. ( -:"1 ) checks equality item by item
0 0 1 0 1 0 1
(-: |.)\. y NB. Shortcut of the above
0 0 1 0 1 0 1
(0 0 1 0 1 0 1) # }:\y NB. Choose (#) the palindrome prefixes (\)
10
1012
101212
y, |.'10' NB. Reverse and append the first prefix.
101212101
s/((.)(?1)\2|.?)$/$&.reverse$`/e
Normal ifade özellikleri için Perl 5.10 veya üstü gerekir, ancak özel komut satırı anahtarı yoktur.
Örnek kullanım:
$ perl -pe 's/((.)(?1)\2|.?)$/$&.reverse$`/e' << EOT
> 12
> 232
> 2323
> 1012121
> EOT
121
232
23232
101212101
Perl 5.10'un özyinelemeli normal ifade uzantılarını, en uzun sondaki palindromla eşleşecek şekilde kullanır:
m/
( # paren 1 - a palindrome is either:
(.) # paren 2 - a character
(?1) # a palindrome as defined in paren 1
\2 # the same character as in paren 2
| # or:
.? # a 0- or 1-character string
)
$ # at end of string
/x
Daha sonra kendisini ( $&
) ile değiştirir ve $`
tersine ( ) ile başlayan her şeyi ekler .
ẹ;AcB↔Bc
Çevrimiçi deneyin! Soru bir işlev ister, bu yüzden bir tane sağladım; TIO bağlantısı, tam program gibi bir işlevi çalıştıran bir argüman alır.
ẹ;AcB↔Bc
ẹ Split {the input} into digits
;Ac Append {the shortest possible} list
B↔B to produce a palindrome
c then concatenate the resulting list of digits back into a number
edit: @ gnibbler'in çözümüne göre kısaltılmış
def p(n):s=str(n);r=s[::-1];l=len(s);return[int(s+r[l-i:])for i in range(l)if s[i:]==r[:l-i]][0]
Orijinal:
def p(n):
s=str(n);r=s[::-1];l=len(s)
for i in range(l):
if s[i:]==r[:l-i]:return int(s+r[l-i:])
n
.
s=n
yardımcı olduğunu görmüyorum ; s
Rakam aralıkları almak için abone olabilir bir dize olması gerekir . Oradaki mantık nedir?
Hoa'nın cevabına göre :)
def p(n):s=str(n);r=s[::-1];l=len(s);return next(int(s+r[l-i:])for i in range(l)if s[i:]==r[:l-i])
return(...).next()
genellikle ekstra bir karaktere mal olacak, ancak daha sonra alanı bırakacağım yazılabilir return
. Hoa, GE
f=->x{x=x.to_s.chars;99.times{|i|x.insert~i,x[i]if x!=x.reverse};x*''}
SİZİN cevabına dayanarak, 2 karakter kazanmak için .split '' yerine karakterlerle. Ve eminim biraz daha sıkmanın bir yolu var> <
p=a=>{S=x=>x.split``.reverse();for(s=String(a),i=0;i<s.length;i++)if(x=s+S(s.substring(0,i)).join``,x==S(x).join``)return x}
Yorumlananlar:
function palindrome(n){
s = String(n);
for(i=0;i<s.length;i++)
{
x=s+s.substring(0,i).split("").reverse().join("") //take first n characters, reverse and append to the end
if(x==x.split("").reverse().join("")) //is the number a palindrome?
return x;
}
}
x->{Function<String,String>r=t->new StringBuilder(t).reverse().toString();String y=r.apply(x),z=x;int m=x.length();while(!z.equals(r.apply(z)))z=x+y.substring(--m);return z;}
Ungolfed:
x -> {
Function<String, String> r = t -> new StringBuilder(t).reverse().toString();
String y = r.apply(x), z=x;
int m = x.length();
while (!z.equals(r.apply(z))) z = x+y.substring(--m);
return z;
}
Çok daha sıkı olabileceğini hissediyorum ama nasıl yapılacağı hemen belli değil. İşlev çok yer kaplıyor ama iki yerde ihtiyacım vardı.
Bu, yalnızca sayılar için değil, herhangi bir dize için çalışır ve herhangi bir uzunluk olabilir.