เขียนฟังก์ชั่นที่ใช้ตัวเลขเป็นอาร์กิวเมนต์และทำให้เป็น palindrome โดยต่อท้ายจำนวนหลักขั้นต่ำ จำนวนจะต้องไม่เกิน 100 หลัก
Sample Inputs
12
122
232
2323
1012121
Sample Outputs
121
1221
232
23232
101212101
เขียนฟังก์ชั่นที่ใช้ตัวเลขเป็นอาร์กิวเมนต์และทำให้เป็น palindrome โดยต่อท้ายจำนวนหลักขั้นต่ำ จำนวนจะต้องไม่เกิน 100 หลัก
Sample Inputs
12
122
232
2323
1012121
Sample Outputs
121
1221
232
23232
101212101
คำตอบ:
f=:{.@(,"1(-:|.)\.#|.@}:\)
เช่น
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
ต้องการ Perl 5.10 หรือใหม่กว่าสำหรับฟีเจอร์ regex แต่ไม่มีสวิตช์บรรทัดคำสั่งพิเศษ
ตัวอย่างการใช้งาน:
$ perl -pe 's/((.)(?1)\2|.?)$/$&.reverse$`/e' << EOT
> 12
> 232
> 2323
> 1012121
> EOT
121
232
23232
101212101
ใช้ส่วนขยาย Regex แบบเรียกซ้ำ Perl 5.10 เพื่อให้ตรงกับ palindrome ที่ยาวที่สุดเช่น:
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
จากนั้นจะแทนที่ด้วยตัวเอง ( $&
) และผนวกสิ่งที่สตริงเริ่มต้นด้วย ( $`
) กลับด้าน
ẹ;AcB↔Bc
ลองออนไลน์! คำถามถามถึงฟังก์ชั่นดังนั้นฉันจึงจัดให้ ลิงก์ TIO รับอาร์กิวเมนต์ที่เรียกใช้ฟังก์ชันเหมือนโปรแกรมเต็ม
ẹ;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
def f(x):
x,y=list(str(x)),[]
while x!=x[::-1]:y+=x.pop(0)
return''.join(y+x+y[::-1])
แก้ไข:สั้นลงตามโซลูชันของ @ 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]
เดิม:
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
ช่วย ฉันต้องs
เป็นสตริงเพื่อให้ฉันสามารถห้อยเพื่อรับช่วงหลัก มีเหตุผลอะไร?
ตามคำตอบของ 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()
โดยปกติแล้วจะมีค่าใช้จ่ายเพิ่มเติม แต่ฉันได้ลดพื้นที่หลังจากreturn
นั้น Hoa ได้ปรับปรุงมันอีกครั้งโดยใช้ LC แทน GE
{`:s-1%:r,,{s<r+..-1%=*}%{}?~}:f
ใช้อัลกอริทึมเดียวกันกับคนอื่น ๆ มากที่สุด:
import List
r=reverse
f s=s++(r.snd.head.filter g.zip(tails s)$inits s)
g(s,_)=s==r s
ตัวอย่างจากคำอธิบายปัญหา:
*Main> map (f.show) [12,232,2323,1012121]
["121","232","23232","101212101"]
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}
แสดงความคิดเห็น:
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;
}
ฉันมีความรู้สึกว่ามันแน่นกว่านี้มาก แต่มันก็ไม่ชัดเจนสำหรับฉันทันที ฟังก์ชั่นกินพื้นที่เยอะ แต่ฉันต้องการมันในสองที่
สิ่งนี้ใช้ได้กับสตริงใด ๆ ไม่ใช่แค่ตัวเลขและสามารถมีความยาวได้