Tulis fungsi yang menggunakan angka sebagai argumen dan menjadikannya palindrome dengan menambahkan jumlah digit minimum. Jumlahnya akan maksimal 100 digit.
Sample Inputs
12
122
232
2323
1012121
Sample Outputs
121
1221
232
23232
101212101
Tulis fungsi yang menggunakan angka sebagai argumen dan menjadikannya palindrome dengan menambahkan jumlah digit minimum. Jumlahnya akan maksimal 100 digit.
Sample Inputs
12
122
232
2323
1012121
Sample Outputs
121
1221
232
23232
101212101
Jawaban:
f=:{.@(,"1(-:|.)\.#|.@}:\)
misalnya
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
Perlu Perl 5.10 atau lebih baru untuk fitur regex, tetapi tidak ada saklar baris perintah khusus.
Penggunaan sampel:
$ perl -pe 's/((.)(?1)\2|.?)$/$&.reverse$`/e' << EOT
> 12
> 232
> 2323
> 1012121
> EOT
121
232
23232
101212101
Menggunakan ekstensi regex rekursif Perl 5.10 untuk mencocokkan palindrom trailing terpanjang seperti itu:
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
Kemudian menggantinya dengan dirinya sendiri ( $&
) dan menambahkan apa pun string dimulai dengan ( $`
), terbalik.
ẹ;AcB↔Bc
Cobalah online! Pertanyaannya menanyakan fungsi, jadi saya berikan satu; tautan TIO mengambil argumen yang menjalankan fungsi seperti program lengkap.
ẹ;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
sunting: Diperpendek berdasarkan pada solusi @ gnibbler
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]
Asli:
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
membantu; Saya harus s
menjadi string sehingga saya bisa berlangganan untuk mendapatkan rentang angka. Apa alasannya?
Berdasarkan jawaban Hoa :)
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()
biasanya akan membutuhkan char tambahan, tapi saya bisa menjatuhkan ruang setelah return
. Hoa telah memperbaikinya lagi dengan menggunakan LC bukannya GE
f=->x{x=x.to_s.chars;99.times{|i|x.insert~i,x[i]if x!=x.reverse};x*''}
Berdasarkan jawaban ANDA , dengan karakter bukan .sit '' untuk mendapatkan 2 karakter. Dan saya yakin ada cara untuk memeras lebih sedikit> <
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}
Berkomentar:
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;}
Tidak Disatukan:
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;
}
Saya punya perasaan itu bisa menjadi jauh lebih ketat tetapi tidak segera jelas bagi saya bagaimana caranya. Fungsi ini memakan banyak ruang tetapi saya membutuhkannya di dua tempat.
Ini berfungsi untuk string apa pun, bukan hanya angka, dan bisa panjang apa pun.