自分で食べられる数


30

正の整数が与えられた場合、その数値がそれ自体を食べることができるかどうかに関する真実/偽の値を出力します。

ルール

左端が頭、右端が尾

頭が尾以上である場合、頭は尾を食べ、新しい頭が合計になります。

もしsum10その後、ヘッドが置き換えられます。summod10

sum=0は無視できませんが、入力番号に先行ゼロはありません。

例:

number=2632
head-2, tail-2

2632 -> 463
head-4, tail-3

463 -> 76
head-7, tail-6

76 -> 3
If only one digit remains in the end, the number can eat itself.

頭が尾を食べることができない場合、答えは偽になります。

number=6724
072
False (0<2)

テストケース:

True:
[2632, 92258, 60282, 38410,3210, 2302, 2742, 8628, 6793, 1, 2, 10, 100, 55, 121]

False:
[6724, 47, 472, 60247, 33265, 79350, 83147, 93101, 57088, 69513, 62738, 54754, 23931, 7164, 5289, 3435, 3949, 8630, 5018, 6715, 340, 2194]

これはコードゴルフなので、最短のコードが優先されます。


入力を文字列として受け取ることはできますか?
リルトシアスト

@lirtosiast、はい、数字のリストはありません。
ヴェダントカンディ

14
それらはAutocannibalistic Numbersと呼ばれます。
アーナルド

6
数字のリストとして受け取れない理由は何ですか?この問題は、すでに数字のリストであるかのようにそれらを扱います。それらを強制的に数字にすることは、それらをリストに変換するために余分なコードを固定するだけでよいことを意味します。
小麦ウィザード

1
真実/偽の代わりに2つの一貫した異なる値を返すことはできますか?
オリビエグレゴワール

回答:


7

JavaScript(ES6)、 52 51  50バイト

@tshのおかげで1バイト節約

入力を文字列として受け取ります。ブール値を返します。

f=n=>n>[n%10]?f(-(-n[0]-n)%10+n.slice(1,-1)):!n[1]

オンラインでお試しください!

コメント済み

f = n =>                 // f = recursive function taking n (a string)
  n > [n % 10]           // The last digit is isolated with n % 10 and turned into a
                         // singleton array, which is eventually coerced to a string
                         // when the comparison occurs.
                         // So we do a lexicographical comparison between n and its
                         // last digit (e.g. '231'>'1' and '202'>'2', but '213'<'3').
  ?                      // If the above result is true:
    f(                   //   do a recursive call:
      -(-n[0] - n) % 10  //     We compute (int(first_digit) + int(n)) mod 10. There's no
                         //     need to isolate the last digit since we do a mod 10 anyway.
      + n.slice(1, -1)   //     We add the middle part, as a string. It may be empty.
    )                    //   end of recursive call
  :                      // else:
    !n[1]                //   return true if n has only 1 digit, or false otherwise


6

ゼリー、11バイト

Ṛṙ-µṖÄ%⁵:ḊẠ

オンラインでお試しください!

使い方

Ṛṙ-µṖÄ%⁵:ḊẠ  Main link. Argument: n

Ṛ            Reverse n, after casting it to a digit list.
 ṙ-          Rotate the result -1 units to the left, i.e., 1 unit to the right.
             Let's call the resulting digit list D.
   µ         Begin a new chain with argument D.
    Ṗ        Pop; remove the last digit.
     Ä       Accumulate; take the cumulative sum of the remaining digits.
      %⁵     Take the sums modulo 10.
         Ḋ   Dequeue; yield D without its first digit.
        :    Perform integer division between the results to both sides.
             Integer division is truthy iff greater-or-equal is truthy.
          Ạ  All; return 1 if all quotients are truthy, 0 if not.

6

Perl 6の63の 62バイト

{!grep {.[*-1]>.[0]},(.comb,{.[0,*-1].sum%10,|.[1..*-2]}...1)}

オンラインでお試しください!

説明:

{                                                            } # Anonymous code block
                     (                                  ... )       # Create a sequence
                      .comb,  # Starting with the input converted to a list of digits
                            {                          }   # With each element being
                             .[0,*-1]   # The first and last element of the previous list
                                     .sum%10  # Summed and modulo 10
                                            ,|.[1..*-2]   # Followed by the intermediate elements
                                                        ...1 # Until the list is length 1
 !grep   # Do none of the elements of the sequence
       {.[*-1]>.[0]},   # Have the last element larger than the first?

5

Java(JDK)、83バイト

n->{int r=0,h=n;while(h>9)h/=10;for(;n>9;h=(h+n)%10,n/=10)r=h<n%10?1:r;return r<1;}

オンラインでお試しください!

クレジット


Pythonの回答の長さを考えると、私は何かを見逃したように感じます...テストケースは大丈夫です。
オリビエグレゴワール

私はあなたが何かを見逃したとは思わない。Pythonの回答では、入力を文字列として受け取り、インデックスを使用します。/10また、入力を整数として受け取り%10、ループで使用します。Pythonの答えを打ち負かしました。私から+1。:)
ケビンクルーイッセン

1
あなたはゴルフに変化バイトすることができますr+=r=して?1:0までを?1:r
ケビンCruijssen

@KevinCruijssen確かに... Pythonの答えは準最適です。コメントのゴルフはこの答えよりも短いです。また、保存されたバイトに感謝します!;-)
オリビエグレゴワール

開始して実行することで、または1を返すことができます(1バイトを節約)。01r=1r&=h<n%10?0:r;return r;
アーナルド

4

Mathematica、62バイト

0(IntegerDigits@#//.{a_,r___,b_}/;a>=b:>{Mod[a+b,10],r})=={0}&

最初にIntegerDigits入力を呼び出して数字のリストを取得し、次のルールを繰り返し適用します。

{a_,r___,b_}       (* match the first digit, 0 or more medial digits, and the last digit... *)
/;a>=b             (* under the condition that the number is edible... *)
:>{Mod[a+b,10],r}  (* and replace it with the next iteration *)

ルールは、パターンが一致しなくなるまで適用されます。この場合、残っているのは1桁のみ(真)か、頭が尾よりも小さい(偽)です。

呼び出す代わりに、リスト内のすべての要素を乗算してリスト と比較するLength[__]==1ことで、数バイトを節約できます。0(__)=={0}0{0}


1
知らなかった場合のために、TIOには現在Mathematicaがあります。オンラインでお試しください!
デニス

4

Python 3、50バイト

Black Owl Kaiの回答から盗まれた最初の行。

p,*s=map(int,input())
while s:*s,k=s;p%10<k>q;p+=k

オンラインでお試しください!

出力は終了コード経由です。虚偽の入力では失敗(1)し、真実の入力では終了(0)します。


なぜp%10<k>qNameErrorをスローしないのか説明できますかp%10 >= k
ブラックフクロウカイ

1
@BlackOwlKaiチェーン比較は、Pythonで遅延評価されます。つまり、最初の誤った比較が表示されるとすぐに、チェーンは評価されなくなります。この場合p%10<k>q、と同じp%10<k and k>qです。
ovs

4

Python 2105の 82 81バイト

i,x=map(int,input()),1
for y in i[:0:-1]:
 if i[0]%10<y:x=0
 else:i[0]+=y
print x

オンラインでお試しください!

@ØrjanJohansenからの大規模な-23に感謝します

さらに-1を提供してくれた@VedantKandoi(および@ØrjanJohansen)に感謝


1
for逆スライスで使用できます。また%10、テスト時にのみ行うこともできます:オンラインで試してください!
Ørjanヨハンセン

1
if-else条件を交換し、if i[0]<i[-1]:x=0次にを交換しelse:....ます。@ØrjanJohansen、あなたの答えも。
ヴェダントカンドー

@ØrjanJohansen-ありがとう。それはとてもクールです。
エルペドロ

やあ@VedantKandoi。良さそうに聞こえますが、正確には何を意味するのかわかりません。あなたは私にそれをbeatられました。TIOを追加してください。私が試してみると、すべてのTrueケースで機能しますが、すべてのケースでは機能しませんFalse
エルペドロ

1
@VedantKandoiはこれを意味すると思います。
Ørjanヨハンセン

4

Brachylog、23バイト

ẹ{bkK&⟨h{≥₁+tg}t⟩,K↰|Ȯ}

オンラインでお試しください!

これはFatalizeのソリューションを1バイト節約します。これは、反復ではなく再帰的なアプローチを使用します

説明

ẹ                          Input into a list of digits
 {                    }    Assert that either
  bk                       | the list has at least 2 elements (see later)
      ⟨h{     }t⟩           | and that [head, tail]
         ≥₁                |  | is increasing (head >= tail)
           +               |  | and their sum
            t              |  | mod 10 (take last digit)
             g             |  | as single element of a list
                ,          | concatenated with
  bkK            K         | the number without head and tail (this constrains the number to have at least 2 digits)
                  ↰        | and that this constraint also works on the newly formed number
                   |Ȯ      | OR is a 1 digit number

3

APL(Dyalog Unicode)、33 バイトSBCS

引数として文字列を取る匿名の暗黙の接頭辞関数。

{⊃⍵<t←⊃⌽⍵:03::1⋄∇10|t+@1⊢¯1↓⍵}⍎¨

オンラインでお試しください!

⍎¨ 各文字を評価します(これにより数字のリストが得られます)

{} 次の「dfn」を適用します。引数(数字のリスト):

  ⌽⍵ 引数を逆にする

   最初の要素を選択します(これが尾です)

  t← に割り当てるtt AIL)

  ⍵< 元の数字のそれぞれについて、それよりも小さいかどうかを確認します

   最初の真/偽を選ぶ

: もしそうなら:

  0 偽を返す

 その後:

3:: 今後、インデックスエラー(範囲外)が発生した場合:

  1 真を返す

  ¯1↓⍵ 最後の桁を落とす

   収率は、(分離し1且つ¯1それらが単一のアレイを形成しません)

  t+@1 尾を最初の数字(頭)に追加します

  10| mod-10

   再帰する

1桁の数字¯1↓を入力すると、空のリストになり@1、最初の数字がないためインデックスエラーが発生し、関数はtrueを返します。



3

Brachylog、24バイト

ẹ;I⟨⟨h{≥₁+tg}t⟩c{bk}⟩ⁱ⁾Ȯ

オンラインでお試しください!

のデフォルトの動作を変更して、未知の回数反復するようにする必要があります(現在は、デフォルトで1回反復しますが、これはまったく役に立ちません)。私はその後必要ありません[…];I[…]⁾、3バイトを節約

説明

このプログラムには、フォークの中にいフォークが含まれています。代わりに数字の桁のリストに作業に必要ないくつかの配管もあります(ので、我々は頭と尾の削除した場合76に残っている私たち0に仕事反しない、[7,6]我々はで終わるところを[])。

ẹ                          Input into a list of digits
                       Ȯ   While we don't have a single digit number…
 ;I                  ⁱ⁾    …Iterate I times (I being unknown)…
   ⟨                ⟩      …The following fork:
               c           | Concatenate…
    ⟨         ⟩            | The output of the following fork:
     h       t             | | Take the head H and tail T of the number
      {     }              | | Then apply on [H,T]:
       ≥₁                  | | | H ≥ T
         +                 | | | Sum them
          tg               | | | Take the last digit (i.e. mod 10) and wrap it in a list
                {  }       | With the output of the following predicate:
                 bk        | | Remove the head and the tail of the number

反復の代わりに再帰を使用し、,代わりに使用するc-forkを置き換えると、1バイトを削除できますオンラインで試してみてください!
クロッペブ

@Kroppeb本当にかっこいい。私の回答とは大きく異なるので、あなた自身の回答を投稿すべきだと思います!
18

3

Haskell、70 64 60バイト

f(a:b)=b==""||a>=last b&&f(last(show$read[a]+read b):init b)

入力は文字列として取得されます。

オンラインでお試しください!

編集:独立したガードの代わりに使用する@Laikoniのトリックを使用して-6バイト||。@Laikoniのおかげでさらに-4バイト。


3
read[l b]read bとにかく最後の数字しか見ないからだ。インライン化によってさらに4バイトを節約しますlastオンラインで試してください!
ライコニ




2

ルビー、139バイト

->(a){a.length==1?(p true;exit):1;(a[0].to_i>=a[-1].to_i)?(a[0]=(a[-1].to_i+a[0].to_i).divmod(10)[1].to_s;a=a[0..-2];p b[a]):p(false);exit}

オンラインでお試しください!(関数であるため、入力を処理するための余分なコードがあります)

未ゴルフコード:

->(a) do
    if a.length == 1
        p true
        exit
    if a[0].to_i >= a[-1].to_i
        a[0] = (a[-1].to_i + a[0].to_i).divmod(10)[1].to_s
        a = a[0..-2]
        p b[a]
    else
        p false
        exit
    end
end

1

Retina 0.8.2、42バイト

\d
$*#;
^((#*).*;)\2;$
$2$1
}`#{10}

^#*;$

オンラインでお試しください!リンクにはテストケースが含まれます。説明:

\d
$*#;

数字を単項に変換し、セパレータを挿入します。

^((#*).*;)\2;$
$2$1

最後の桁が最初の桁より大きくない場合は、それらを加算します。

#{10}

必要に応じてモジュロ10を減らします。

}`

最後の桁が最初の桁より大きくなるか、1桁しかなくなるまで繰り返します。

^#*;$

1桁しか残っていないかどうかをテストします。


1

05AB1E26 25 24 バイト

[DgD#\ÁD2£D`›i0qëSOθs¦¦«

おそらくもう少しゴルフができるかもしれません。それは過度に長い感じがしますが、おそらく挑戦は私が前に思ったよりも複雑なコードの面にあります。

オンラインそれを試してみたり、すべてのテストケースを検証します

説明:

[                 # Start an infinite loop
 D                #  Duplicate the top of the stack
                  #  (which is the input implicitly in the first iteration)
  gD              #  Take its length and duplicate it
    #             #  If its a single digit:
                  #   Stop the infinite loop
                  #   (and output the duplicated length of 1 (truthy) implicitly)
                  #  Else:
  \               #   Discard the duplicate length
   Á              #   Rotate the digits once towards the left
    D2£           #   Duplicate, and take the first two digits of the rotated number
       D`         #   Duplicate, and push the digits loose to the stack
         i       #   If the first digit is larger than the second digit:
           0      #    Push a 0 (falsey)
            q     #    Stop the program (and output 0 implicitly)
          ë       #   Else (first digit is smaller than or equal to the second digit):
           SO     #    Sum the two digits
             θ    #    Leave only the last digit of that sum
           s      #    Swap to take the rotated number
            ¦¦    #    Remove the first two digits
              «   #    Merge it together with the calculated new digit

1

C ++(gcc)、144バイト

bool f(std::string b){int c=b.length();while(c>1){if(b[0]<b[c-1])return 0;else{b[0]=(b[0]-48+b[c-1]-48)%10+48;b=b.substr(0,c-1);--c;}}return 1;}

オンラインでお試しください!

初めてこのようなことをしようとしているので、フォーマットが間違っている場合はお知らせください。名前空間を使用して5バイトの "std ::"を削除するなどのルールについて100%確信が持てないので、そのままにしました。

ゴルフをしていない:

bool hunger(std::string input)
{
    int count=input.length();
    while (count>1)
    {
        if (input[0]<input[count-1])                         //if at any point the head cannot eat the tail we can quit the loop
                                                             //comparisons can be done without switching from ascii
        {
            return false;
        }
        else
        {
             input[0]=(input[0]-48+input[count-1]-48)%10+48; //eating operation has to occur on integers so subtract 48 to convert from ASCII to a number
             input=input.substr(0,count-1);                  //get rid of the last number since it was eaten
             --count;
        }

    }
    return true;                                             //if the end of the loop is reached the number has eaten itself
}

1
理論的には、#includeステートメントも必要です。しかし、私はプログラミングに提案したいのstd libの施設とC ++のスラング#include "std_lib_facilities.h"もありません前に付け、using namespace std;。このヘッダーは、C ++を初めて使用する学生向けに、言語の作成者(最後のバージョンは2010)によって作成されました。
ヤック

@Yakkこれを行うインタープリターを作成して公開しない限り、std_lib_facilities.hのインクルードをカウントする必要があります。
デニス

@BenH PPCGへようこそ!関数のコンパイルに必要なすべてのインクルードが必要です。私が知っている最短の方法は#import<string>です。オンラインでお試しください!
デニス

@Dennis #!/usr/bin/sh改行gcc -include "std_lib_facilities.h" $@-そのシェルスクリプトを提供するC ++コースを見つけた場合、それは考慮されますか?
ヤック

@Yakkそのスイッチについて知りませんでした。#includeステートメントとは異なり、コマンドライン引数は本質的に新しい言語であるため、無料ですC ++(GCC) -include iostream、これは実際に144バイトです。
デニス


1

C(GCC) (string.hのと)110の 108バイト

c;f(char*b){c=strlen(b);if(!c)return 1;char*d=b+c-1;if(*b<*d)return 0;*b=(*b+*d-96)%10+48;*d=0;return f(b);}

オンラインでお試しください!

PPCGにはまだ比較的新しいため、新しい言語としてライブラリをリンクするための正しい構文は私にとって異質です。また、関数はfalse / trueに対して0または1を返し、その結果をstdoutに出力するにはstdioが必要であることに注意してください。私たちが熱心であり、エクササイズに出力が必要な場合、言語にもstdioが必要です。

概念的には@BenHの答えと似ていますが、Cで、賞賛の期限(PPCGへようこそ、btw)ですが、再帰を使用しています。また、ダーティコードはクリーンコードよりも短いため、配列ポインタ演算も使用します。

この関数は末尾再帰で、最初の数が最後の数を食べられない場合、または長さが1の場合、それぞれfalseまたはtrueを返す終了条件があります。これらの値は、文字列の先頭と末尾にあるC-String(charを与える)へのポインターを逆参照し、それらに対して比較を行うことで検出されます。ポインター演算は、ストリングの終わりを見つけるために行われます。最後に、最後の文字はヌルターミネータ(0)に置き換えて「消去」されます。

モジュラス演算が1〜2バイト短縮される可能性がありますが、そのポインター操作後にシャワーが既に必要です。

ここに未ゴルフ版

更新:c == 1を!cに置き換えて2バイトを保存しました。これは基本的にc == 0です。追加の時間を実行し、それ自体を削除する前に不必要に2倍になりますが、2バイトを節約します。副作用はnullです。長さゼロの文字列は無限再帰を引き起こしません(ただし、演​​習では正の整数を示すため、null文字列を取得すべきではありません)。


次の場合はライブラリをリンクする必要はありませんgcc-警告が生成されますが、s gccなしでコードを喜んでコンパイルします#include。また、で4バイト節約できます-DR=return。最後に、テストコードでは\0、文字列に文字列が暗黙的に含まれているため、sは不要です。

1
さらに、最初の変数に代入することにより、関数から戻ることができます:b=case1?res1:case2?res2:res_else;と同じですif(case1)return res1;if(case2)return res2;return res_else;

さらに、使用しないことで余分なバイトを減らすcことができますhead-tail。文字列の長さがゼロであるかどうかを判断できます。


Cで3項(条件付き)演算子を使用できることに気付いていませんでした。常にそうでしたか?とにかく、知っておくと良い。将来的にそれらを使用します。乾杯
アンドリュー・ボーマー

1

Powershell、89バイト

"$args"-notmatch'(.)(.*)(.)'-or(($m=$Matches).1-ge$m.3-and(.\g(''+(+$m.1+$m.3)%10+$m.2)))

重要!スクリプトは自分自身を再帰的に呼び出します。スクリプトを次の名前で保存しますg.ps1ファイル現在のディレクトリに。また、スクリプトファイルの代わりにスクリプトブロック変数を呼び出すこともできます(以下のテストスクリプトを参照)。その呼び出しは同じ長さです。

注1:スクリプトは、論理演算子-orとの遅延評価を使用し-andます。場合は、"$args"-notmatch'(.)(.*)(.)'あるTrueその後の右側の部分式-orを評価されていません。また、if ($m=$Matches).1-ge$m.3Falseの右部分式-andも評価されません。したがって、無限の再帰を避けます。

注2:正規表現'(.)(.*)(.)'(.*)デフォルトで貪欲であるため、開始および終了アンカーは含まれません。

テストスクリプト

$g={
"$args"-notmatch'(.)(.*)(.)'-or(($m=$Matches).1-ge$m.3-and(&$g(''+(+$m.1+$m.3)%10+$m.2)))
}

@(
    ,(2632, $true)
    ,(92258, $true)
    ,(60282, $true)
    ,(38410, $true)
    ,(3210, $true)
    ,(2302, $true)
    ,(2742, $true)
    ,(8628, $true)
    ,(6793, $true)
    ,(1, $true)
    ,(2, $true)
    ,(10, $true)
    ,(100, $true)
    ,(55, $true)
    ,(121, $true)
    ,(6724, $false)
    ,(47, $false)
    ,(472, $false)
    ,(60247, $false)
    ,(33265, $false)
    ,(79350, $false)
    ,(83147, $false)
    ,(93101, $false)
    ,(57088, $false)
    ,(69513, $false)
    ,(62738, $false)
    ,(54754, $false)
    ,(23931, $false)
    ,(7164, $false)
    ,(5289, $false)
    ,(3435, $false)
    ,(3949, $false)
    ,(8630, $false)
    ,(5018, $false)
    ,(6715, $false)
    ,(340, $false)
    ,(2194, $false)
) | %{
    $n,$expected = $_
   #$result = .\g $n   # uncomment this line to call a script file g.ps1
    $result = &$g $n   # uncomment this line to call a script block variable $g
                       # the script block call and the script file call has same length
    "$($result-eq-$expected): $result <- $n"
}

出力:

True: True <- 2632
True: True <- 92258
True: True <- 60282
True: True <- 38410
True: True <- 3210
True: True <- 2302
True: True <- 2742
True: True <- 8628
True: True <- 6793
True: True <- 1
True: True <- 2
True: True <- 10
True: True <- 100
True: True <- 55
True: True <- 121
True: False <- 6724
True: False <- 47
True: False <- 472
True: False <- 60247
True: False <- 33265
True: False <- 79350
True: False <- 83147
True: False <- 93101
True: False <- 57088
True: False <- 69513
True: False <- 62738
True: False <- 54754
True: False <- 23931
True: False <- 7164
True: False <- 5289
True: False <- 3435
True: False <- 3949
True: False <- 8630
True: False <- 5018
True: False <- 6715
True: False <- 340
True: False <- 2194

Powershell、90バイト

再帰なし。ファイル名の依存関係およびスクリプトブロック名の依存関係はありません。

for($s="$args";$s[1]-and$s-ge$s%10){$s=''+(2+$s[0]+$s)%10+($s|% S*g 1($s.Length-2))}!$s[1]

Powershellは、右側のオペランドを左側のオペランドのタイプに暗黙的に変換します。したがって、左のオペランドの型はであるため、$s-ge$s%10右のオペランドを$s%10asとして計算integerし、aと比較します。また、左のオペランドが整数であるため、文字と文字列を変換します。stringstring2+$s[0]+$s$s[0]$sinteger2

$s|% S*g 1($s.Length-2)へのショートカットです$s.Substring(1,($s.Length-2))


1

C#(Visual C#Interactive Compiler)、69バイト

x=>{for(int h=x[0],i=x.Length;i>1;)h=h<x[--i]?h/0:48+(h+x[i]-96)%10;}

オンラインでお試しください!

成功または失敗は、例外の有無によって決まります。入力は文字列の形式です。

少ないゴルフ...

// x is the input as a string
x=>{
  // h is the head
  for(int h=x[0],
    // i is an index to the tail
    i=x.Length;
    // continue until the tail is at 0
    i>1;)
      // is head smaller larger than tail?
      h=h<x[--i]
        // throw an exception
        ?h/0
        // calculate the next head
        :48+(h+x[i]-96)%10;
}

文字と数字の間の変換に対処するための余分なバイトがいくつかありますが、全体的にはサイズにあまり影響しませんでした。



1

Brachylog、18バイト

ẹ⟨k{z₁{≥₁+t}ᵐ}t⟩ⁱȮ

オンラインでお試しください!

現在、非決定的な上付き文字が存在しないためにFatalizeのソリューションから3バイトを取り除きますが、、、またはのz₁使用を避けるためcg、Jellyにインスパイアされた漠然としたことを行うことで、さらに3バイトを失いhます。(また、別の新しい機能を使用しようとして失敗したことに触発された:ʰメタ述語ました。)

                 Ȯ    A list of length 1
                ⁱ     can be obtained from repeatedly applying the following
ẹ                     to the list of the input's digits:
 ⟨k{         }t⟩      take the list without its last element paired with its last element,
    z₁                non-cycling zip that pair (pairing the first element of the list with
                      the last element and the remaining elements with nothing),
      {    }ᵐ         and for each resulting zipped pair or singleton list:
       ≥₁             it is non-increasing (trivially true of a singleton list);
          t           take the last digit of
         +            its sum.

0

PowerShell94 91バイト

for(;$n-and$n[0]-ge$n[-1]){$n=$n-replace"^.",((+$n[0]+$n[-1]-96)%10)-replace".$"}return !$n

オンラインでお試しください!


テストスクリプト

function f($n){

for(;$n-and$n[0]-ge$n[-1]){$n=$n-replace"^.",((+$n[0]+$n[-1]-96)%10)-replace".$"}return !$n

Remove-Variable n
}
Write-Host True values:
@(2632, 92258, 60282, 38410,3210, 2302, 2742, 8628, 6793, 1, 2, 10, 100, 55, 121) |
    % { Write-Host "  $_ $(' '*(6-$_.ToString().Length)) $(f $_.ToString())" }

Write-Host False values:
@(6724, 47, 472, 60247, 33265, 79350, 83147, 93101, 57088, 69513, 62738, 54754, 23931, 7164, 5289, 3435, 3949, 8630, 5018, 6715, 340, 2194) | 
    % { Write-Host "  $_ $(' '*(6-$_.ToString().Length)) $(f $_.ToString())" }

未ゴルフコード:

function f ($inVar){
    # While the Input exists, and the first character is greater than last
    while($inVar -and ($inVar[0] -ge $inVar[-1])){

        # Calculate the first integer -> ((+$n[0]+$n[-1]-96)%10)
        $summationChars = [int]$inVar[0]+ [int]$inVar[-1]
        # $summationChars adds the ascii values, not the integer literals. 
        $summationResult = $summationChars - 48*2
        $summationModulo = $summationResult % 10

        # Replace first character with the modulo
        $inVar = $inVar -replace "^.", $summationModulo

        # Remove last character
        $inVar = $inVar -replace ".$"
    }
    # Either it doesn't exist (Returns $True), or 
    # it exists since $inVar[0] < $inVar[-1] returning $False
    return !$inVar
}

1
あなたはチェックする必要はありません$n[0]、あなたの中でfor声明-ちょうどチェックを$n十分にする必要があります。
AdmBorkBork

あなたは、使用する可能性-6の代わりに-96、それはカルク%10に十分であるので
mazzy

return 7バイトを削除して保存できます
mazzy

そして、バイトカウントにパラメータ宣言を含めるべきだと思います。param($n)またはのいずれかfunction f($n)
mazzy

1
@mazzyコメントで、ポスターには文字列の使用が許可されていると記載されていましたが、数字/文字列のリストとして入力を許可することはできませんでした。これ["1","2","3"]は有効な入力ではないと解釈しましたが、そうです"123"。@VedantKandoiに問題がある場合、間違いなく変更できます!
KGlasier
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.