解 Perl Weekly Challenge 095 -- 回文數與堆疊

作者:   發佈於: ,更新於:   #raku #janet

Perl 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