解 Perl Weekly Challenge 095 -- 回文數與堆疊
作者:gugod 發佈於: ,更新於: #raku #janetPerl Weekly Challenge 095 兩題目算是基本題吧。回文數 (Palindrome Number) 這題也有出現在 leetcode: leetcode/palindrome-number。對於 Perl 或 Raku 這類字串與整數都自動無縫轉換的語言來說,是個很省事的題目。
TASK #1 › Palindrome Number
Submitted by: Mohammad S Anwar
You are given a number $N.
Write a script to figure out if the given number is Palindrome. Print 1 if true otherwise 0.
Example 1:
Input: 1221
Output: 1
Example 2:
Input: -101
Output: 0, since -101 and 101- are not the same.
Example 3:
Input: 90
Output: 0
解 #1 > Palindrome Number
基本上就是直接把數字轉成字串後,再用檢查該字串是否為回文。看來依題意,所有負數都不可能是回文數。但不知這題目是否應涵蓋帶小數的數字?
假設只處理整數吧。Raku 語實作如下:
sub is-palindrome-number (Int $n --> Bool) {
return "$n" eq "$n".flip;
}
字串倒轉這個運算,於 Raku Str 型別中對應到 flip
函式。把數字 $n
轉換成字串,可用 $n.Str
或是 "$n"
兩種寫法。(Int $n --> Bool)
這部分是表示此函式收一個 Int
型別的參數,並還回 Bool
型別(布林值,True
/ False
)。
前一陣子從 @poga 哪裏得知 janet 語,因此試著以 janet 語試做如下:
(defn is-palindrome
"Tell if the given string is a palindrome"
[s]
(= s (string/reverse s)))
(defn is-palindrome-number
"Tell if the given number is palindromic"
[n]
(is-palindrome (string n)))
只用了幾個基本形式,還沒有太仔細理解,但這語言看來嬌小而嚴謹,似乎值得仔細研究。
TASK #2 › Demo Stack
Submitted by: Mohammad S Anwar
Write a script to demonstrate Stack operations like below: push($n) - add $n to the stack pop() - remove the top element top() - get the top element min() - return the minimum element
Example:
my $stack = Stack->new;
$stack->push(2);
$stack->push(-1);
$stack->push(0);
$stack->pop; # removes 0
print $stack->top; # prints -1
$stack->push(0);
print $stack->min; # prints -1
解 #2 > Demo Stack
如果純粹只是要定義個有上述幾個方法的類別,那在 Raku 語中都有直接能對應的函式。比方說能裝整數的 IntStack
可如此定義:
class IntStack {
has Int @!store;
method push(Int $n) {
@!store.push($n);
}
method pop(--> Int) {
@!store.pop;
}
method top(--> Int) {
@!store.tail;
}
method min(--> Int) {
@!store.min;
}
}
使用範例如下:
my $stack = IntStack.new;
$stack.push(2);
$stack.push(-1);
$stack.push(0);
$stack.pop;
say $stack.top; #=> -1
$stack.push(0);
say $stack.min; #=> -1