Jumlah itu bisa makan sendiri


30

Diberikan bilangan bulat positif, menghasilkan nilai kebenaran / kepalsuan, apakah bilangan itu dapat dimakan sendiri.

Aturan

Paling kiri adalah kepala, paling kanan adalah ekor

Jika kepala lebih besar atau sama dengan ekor, kepala memakan ekor dan kepala baru menjadi jumlah mereka.

Jika skamum10 maka kepala diganti dengan .skamummod10

skamum=0 tidak dapat diabaikan, namun nomor input tidak akan pernah memiliki nol terkemuka.

Contoh:

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.

Jika suatu saat kepala tidak bisa makan ekor, jawabannya akan salah.

number=6724
072
False (0<2)

Kasus uji:

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]

Ini adalah kode-golf sehingga kode terpendek menang.


Bisakah kita mengambil input sebagai string?
lirtosiast

@ lirtosiast, ya, tapi tidak daftar digit.
Vedant Kandoi

14
Mereka bisa disebut Nomor Autocannibalistic .
Arnauld

6
Apa alasan kami tidak dapat menganggapnya sebagai daftar angka? Masalah ini sudah memperlakukan mereka seolah-olah mereka adalah daftar digit. Memaksa mereka menjadi angka berarti Anda hanya perlu menyematkan kode tambahan untuk mengubahnya menjadi daftar.
Wheat Wizard

1
Bisakah dua nilai berbeda yang konsisten dikembalikan dan bukannya benar / salah?
Olivier Grégoire

Jawaban:


7

JavaScript (ES6),  52 51  50 byte

Disimpan 1 byte berkat @tsh

Mengambil input sebagai string. Mengembalikan nilai Boolean.

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

Cobalah online!

Berkomentar

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

Jelly , 11 byte

Ṛṙ-µṖÄ%⁵:ḊẠ

Cobalah online!

Bagaimana itu bekerja

Ṛṙ-µṖÄ%⁵:ḊẠ  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 byte

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

Cobalah online!

Penjelasan:

{                                                            } # 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 byte

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;}

Cobalah online!

Kredit


Mengingat panjangnya jawaban Python, saya merasa seperti melewatkan sesuatu ... meskipun test case ok.
Olivier Grégoire

Saya tidak berpikir Anda melewatkan sesuatu. Jawaban Python mengambil input sebagai string dan menggunakan pengindeksan, dan Anda mengambil input sebagai integer dan menggunakan /10dan %10dalam satu lingkaran. Sangat bagus mengalahkan jawaban Python; +1 dari saya. :)
Kevin Cruijssen

1
Anda dapat golf byte berubah r+=untuk r=dan ?1:0untuk ?1:r.
Kevin Cruijssen

@KevinCruijssen Memang ... jawaban Python tidak optimal: golf dalam komentar lebih pendek dari jawaban ini. Juga, terima kasih untuk byte yang disimpan! ;-)
Olivier Grégoire

Anda dapat mengembalikan atau 1 dengan memulai dan melakukan (menyimpan 1 byte). 01r=1r&=h<n%10?0:r;return r;
Arnauld

4

Mathematica, 62 byte

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

Pertama-tama panggil IntegerDigitsinput untuk mendapatkan daftar digitnya, lalu berulang kali menerapkan aturan berikut:

{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 *)

Aturan diterapkan hingga pola tidak lagi cocok, dalam hal ini hanya ada satu digit yang tersisa (benar) atau kepala kurang dari ekor (kepalsuan).

Alih-alih memanggil Length[__]==1, kita dapat menyimpan beberapa byte 0(__)=={0}, mengalikan semua elemen dalam daftar dengan 0 dan kemudian membandingkan dengan daftar {0}.


1
Jika Anda tidak tahu, TIO memiliki Mathematica sekarang. Cobalah online!
Dennis

4

Python 3 , 50 byte

Baris pertama dicuri dari jawaban Black Owl Kai .

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

Cobalah online!

Output melalui kode keluar. Gagal (1) untuk input palsu dan selesai (0) untuk input jujur.


Bisakah Anda jelaskan mengapa p%10<k>qtidak melempar NameError jika p%10 >= k?
Black Owl Kai

1
@BlackOwlKai perbandingan dirantai malas dievaluasi dalam Python. Ini berarti segera setelah perbandingan palsu pertama muncul, rantai tidak akan lagi dievaluasi. Dalam hal ini p%10<k>qmelakukan hal yang sama dengan p%10<k and k>q.
Ovs

4

Python 2 , 105 82 81 byte

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

Cobalah online!

Terima kasih banyak untuk -23 dari @ ØrjanJohansen

Terima kasih kepada @VedantKandoi (dan @ ØrjanJohansen) untuk -1 lainnya


1
Anda dapat menggunakan fordengan irisan terbalik, dan juga melakukan %10hanya saat pengujian: Cobalah online!
Ørjan Johansen

1
Tukar kondisi if-else, if i[0]<i[-1]:x=0lalu else:..... @ ØrjanJohansen, dalam jawaban Anda juga.
Vedant Kandoi

@ ØrjanJohansen - Terima kasih. Itu keren sekali.
ElPedro

Hai @VedantKandoi. Kedengarannya bagus tapi tidak yakin apa maksud Anda. Anda telah mengalahkan saya pada yang satu itu. Bisakah Anda menambahkan TIO? Ketika saya coba itu bekerja untuk semua Truekasus tetapi tidak untuk semua False.
ElPedro

1
Saya pikir @VedantKandoi berarti ini .
Ørjan Johansen

4

Brachylog , 23 byte

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

Cobalah online!

Ini adalah penghematan 1 byte dari solusi Fatalize . Ini menggunakan pendekatan rekursif dan bukan iteratif

Penjelasan

ẹ                          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 byte SBCS

Fungsi awalan diam-diam anonim mengambil string sebagai argumen.

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

Cobalah online!

⍎¨ mengevaluasi setiap karakter (ini memberi kami daftar angka)

{... } terapkan "dfn" berikut untuk itu; adalah argumen (daftar angka):

  ⌽⍵ membalikkan argumen

   pilih elemen pertama (ini adalah ekornya)

  t← menetapkan ke t(untuk t ail)

  ⍵< untuk masing-masing digit asli, lihat apakah jumlahnya kurang dari itu

   pilih yang benar / salah pertama

: jika begitu:

  0 kembali salah

 kemudian:

3:: jika mulai sekarang, kesalahan indeks (di luar batas) terjadi:

  1 kembali benar

  ¯1↓⍵ letakkan digit terakhir

   hasilkan itu (pisahkan 1dan ¯1mereka tidak akan membentuk satu array)

  t+@1 tambahkan ekor ke digit pertama (kepala)

  10| mod-10

   berulang

Setelah kami menekan satu digit, ¯1↓akan membuat daftar itu kosong, dan @1akan menyebabkan kesalahan indeks karena tidak ada digit pertama, menyebabkan fungsi untuk mengembalikan true.


3

Python 3 , 77 byte

p,*s=map(int,input())
print(all(n<=sum(s[i+1:],p)%10for i,n in enumerate(s)))

Cobalah online!


Dan solusi lama saya dengan pendekatan rekursif

Python 3 , 90 byte

f=lambda x,a=0:2>len(x)if 2>len(x)or(int(x[0])+a)%10<int(x[-1])else f(x[:-1],a+int(x[-1]))

Cobalah online!

Mengambil input sebagai string.


3

Brachylog , 24 byte

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

Cobalah online!

Saya harus mengubah perilaku default sehingga mengulang beberapa kali tidak diketahui (saat ini, ia mengulang 1 kali secara default yang sama sekali tidak berguna). Saya kemudian tidak akan membutuhkan […];I[…]⁾, menghemat 3 byte

Penjelasan

Program ini berisi garpu jelek di dalam garpu. Ada juga beberapa pipa ledeng yang diperlukan untuk mengerjakan daftar angka alih-alih angka (karena jika kita melepas kepala dan ekor 76kita dibiarkan 0, yang tidak bekerja berlawanan dengan [7,6]tempat kita berakhir []).

ẹ                          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

Menggunakan rekursi alih-alih iterasi dan mengganti c-fork untuk digunakan ,sebagai gantinya saya bisa menghapus 1 byte Cobalah online!
Kroppeb

@ Kalpeb Sangat keren. Saya pikir Anda harus memposting jawaban Anda sendiri, karena itu sangat berbeda dari jawaban saya!
Fatalkan

3

Haskell, 70 64 60 byte

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

Input diambil sebagai string.

Cobalah online!

Sunting: -6 byte dengan menggunakan trik @ Laikoni untuk menggunakan ||alih-alih penjaga terpisah. Lain -4 byte berkat @Laikoni.


3
read[l b]bisa jadi hanya read bkarena Anda hanya melihat angka terakhir saja. Menghemat 4 byte lebih banyak dengan juga sejalan last: Coba online!
Laikoni


2

Python 2 , 75 67 byte

l=lambda n:n==n[0]or n[-1]<=n[0]*l(`int(n[0]+n[-1],11)%10`+n[1:-1])

Cobalah online!

Pendekatan lambda rekursif. Mengambil input sebagai string. Terima kasih banyak untuk Dennis karena telah menghemat 8 byte!


2

Haskell , 69 64 byte

f n=read[show n!!0]#n
h#n=n<10||h>=mod n 10&&mod(h+n)10#div n 10

Cobalah online! Contoh penggunaan: f 2632hasil True.

Edit: -5 byte karenamod (h + mod n 10) 10 = mod (h + n) 10


penggunaan yang bagus ||, yang membantu saya mempersingkat jawaban saya juga. Terima kasih!
nimi

2

Ruby, 139 byte

->(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}

Cobalah online! (memiliki beberapa kode tambahan untuk memproses input, karena ini berfungsi)

Kode tidak dikunci:

->(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 byte

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

^#*;$

Cobalah online! Tautan termasuk kasus uji. Penjelasan:

\d
$*#;

Ubah digit menjadi unary dan masukkan pemisah.

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

Jika digit terakhir tidak lebih besar dari yang pertama, maka tambahkan bersama-sama.

#{10}

Kurangi modulo 10 jika perlu.

}`

Ulangi hingga digit terakhir lebih besar dari digit pertama atau hanya tersisa satu digit.

^#*;$

Uji apakah hanya ada satu digit yang tersisa.


1

05AB1E , 26 25 24 byte

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

Mungkin bisa bermain golf sedikit lebih .. Rasanya terlalu lama, tapi mungkin tantangannya dalam hal kode lebih kompleks daripada yang saya pikir sebelumnya.

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

[                 # 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 byte

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;}

Cobalah online!

Pertama kali saya mencoba sesuatu seperti ini jadi jika saya memformat sesuatu yang salah tolong beri tahu saya. Saya tidak 100% yakin pada aturan untuk hal-hal seperti menggunakan namespace untuk menghilangkan 5 byte "std ::" jadi saya meninggalkannya.

Tidak Terkumpul:

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
Secara teori Anda juga perlu #includepernyataan. Namun, saya akan mengusulkan pemrograman di subdialect fasilitas std lib dari C + + dengan #include "std_lib_facilities.h"prepended, yang juga tidak a using namespace std;. Header itu ditulis oleh penulis bahasa jalan kembali (versi terbaru adalah 2010) untuk siswa yang baru mengenal C ++.
Yakk

@Yakk Kecuali Anda membuat dan menerbitkan juru bahasa yang melakukan ini untuk Anda, Anda masih perlu menghitung termasuk std_lib_facilities.h.
Dennis

@BenH Selamat datang di PPCG! Anda perlu menghitung semua termasuk yang diperlukan untuk mengkompilasi fungsi Anda. Metode terpendek yang saya tahu adalah #import<string>. Cobalah online!
Dennis

@ Dennis #!/usr/bin/shnewline gcc -include "std_lib_facilities.h" $@- jika saya menemukan kursus C ++ yang menyediakan skrip shell, apakah itu akan diperhitungkan?
Yakk

@ Yakk Tidak tahu tentang saklar itu. Tidak seperti pernyataan #include, argumen baris perintah gratis karena pada dasarnya itu adalah bahasa baru . Dalam C ++ (gcc)-include iostream , ini memang 144 byte.
Dennis

1

C #, 114 byte

static bool L(string n){return n.Skip(1).Reverse().Select(x=>x%16).Aggregate(n[0]%16,(h,x)=>h>=x?(h+x)%10:-1)>=0;}

Cobalah online


1

C (gcc) (dengan string.h) , 110 108 byte

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);}

Cobalah online!

Masih relatif baru untuk PPCG, jadi sintaks yang benar untuk menghubungkan perpustakaan sebagai bahasa baru asing bagi saya. Perhatikan juga bahwa fungsi mengembalikan 0 atau 1 untuk false / true, dan mencetak hasil itu ke stdout memang membutuhkan stdio. Jika kita menjadi orang yang bertele-tele dan latihan itu membutuhkan keluaran, bahasanya membutuhkan stdio juga.

Secara konseptual mirip dengan jawaban @ BenH, tetapi dalam C, begitu pujian di mana mereka seharusnya (Selamat datang di PPCG, btw), tetapi menggunakan rekursi. Ini juga menggunakan array pointer aritmatika, karena kode kotor lebih pendek dari kode bersih.

Fungsinya ekor rekursif, dengan kondisi keluar jika angka pertama tidak bisa makan yang terakhir atau panjangnya 1, masing-masing mengembalikan false atau true. Nilai-nilai ini ditemukan dengan mereferensikan pointer ke C-String (yang memberikan char) di awal dan akhir string, dan melakukan perbandingan pada mereka. Aritmatika pointer dilakukan untuk menemukan ujung string. akhirnya, karakter terakhir "dihapus" dengan menggantinya dengan terminator nol (0).

Mungkin saja aritmatika modulus dapat dipersingkat dengan satu atau dua byte, tetapi saya sudah perlu mandi setelah manipulasi pointer.

Versi Tidak Terkunci Di Sini

Pembaruan: Menyimpan dua byte dengan mengganti c == 1 dengan! C. Ini pada dasarnya adalah c == 0. Ini akan menjalankan waktu tambahan, dan tidak perlu akan menggandakan dirinya sendiri sebelum menghapus dirinya sendiri, tetapi menghemat dua byte. Efek sampingnya adalah string panjang nol atau nol tidak akan menyebabkan rekursi tak terbatas (meskipun kita tidak seharusnya mendapatkan string nol seperti yang dikatakan latihan bilangan bulat positif).


Anda tidak perlu menautkan pustaka jika gcc- meskipun peringatan akan dihasilkan, gccdengan senang hati akan mengkompilasi kode Anda tanpa #includes. Anda juga dapat menyimpan 4 byte dengan -DR=return. Akhirnya, dalam kode pengujian Anda, \0s tidak diperlukan, karena string secara harfiah sudah memasukkannya secara implisit.

1
Selain itu, Anda dapat kembali dari suatu fungsi dengan menetapkan ke variabel pertama: b=case1?res1:case2?res2:res_else;sama denganif(case1)return res1;if(case2)return res2;return res_else;

Lebih jauh lagi, Anda dapat menumpahkan beberapa byte tambahan dengan tidak menggunakan c: Anda dapat menentukan apakah string tersebut memiliki panjang nol head-tail.


Tidak sadar Anda bisa menggunakan operator ternary (bersyarat) di C. Apakah itu selalu terjadi? Apapun, baik untuk diketahui; Saya akan menggunakannya di masa depan. Cheers
Andrew Baumher

1

Powershell, 89 byte

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

Penting! Script menyebut dirinya secara rekursif. Jadi simpan skrip sebagaig.ps1 file di direktori saat ini. Anda juga dapat memanggil variabel blok skrip alih-alih file skrip (lihat skrip pengujian di bawah). Panggilan itu memiliki panjang yang sama.

Catatan 1: Skrip menggunakan evaluasi malas dari operator logika -ordan -and. Jika "$args"-notmatch'(.)(.*)(.)'adalah Truemaka subexpression kanan -ortidak dievaluasi. Juga jika ($m=$Matches).1-ge$m.3adalah Falsemaka subexpression kanan -andtidak dievaluasi juga. Jadi kita menghindari rekursi tak terbatas.

Catatan 2: Ekspresi reguler '(.)(.*)(.)'tidak mengandung jangkar awal dan akhir karena ekspresinya (.*)serakah secara default.

Skrip uji

$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"
}

Keluaran:

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 byte

Tidak ada rekursi. Tidak ada ketergantungan nama file dan tidak ada ketergantungan nama blok skrip.

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 secara implisit mengubah operan kanan ke jenis operan kiri. Oleh karena itu, $s-ge$s%10hitung operan kanan $s%10sebagai integerdan bandingkan sebagai stringjenis operan kiri string. Dan 2+$s[0]+$smengkonversi char $s[0]dan string $ske integerkarena operan kiri 2adalah bilangan bulat.

$s|% S*g 1($s.Length-2)adalah jalan pintas ke$s.Substring(1,($s.Length-2))


1

C # (Visual C # Interactive Compiler) , 69 byte

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

Cobalah online!

Keberhasilan atau kegagalan ditentukan oleh ada atau tidak adanya pengecualian . Input dalam bentuk string.

Kurang bermain golf ...

// 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;
}

Ada beberapa byte tambahan untuk menangani konversi antara karakter dan digit, tetapi secara keseluruhan itu tidak terlalu mempengaruhi ukuran.



1

Brachylog , 18 byte

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

Cobalah online!

Mengambil tiga byte off solusi Fatalize ini hanya berdasarkan non-deterministik superscriptless yang ada sekarang, tapi kehilangan tiga dengan melakukan hal-hal samar-samar Jelly terinspirasi dengan z₁untuk menghindari menggunakan c, gatau bahkan h. (Juga terinspirasi dengan mencoba, dan gagal, untuk menggunakan fitur baru yang berbeda: ʰmetapredicate.)

                 Ȯ    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

PowerShell , 94 91 byte

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

Cobalah online!


Skrip Tes

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())" }

Kode tidak dikunci:

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
Anda tidak perlu memeriksa pernyataan $n[0]Anda for- cukup mengecek $nsaja.
AdmBorkBork

Anda dapat menggunakannya -6sebagai gantinya -96karena cukup untuk
menghitung

Anda dapat menghapus return dan menyimpan 7 byte
mazzy

dan saya pikir Anda harus memasukkan deklarasi parameter ke jumlah byte. salah satu param($n)atau function f($n).
mazzy

1
@mazzy Poster menyatakan dalam komentar bahwa Anda diizinkan untuk menggunakan string, Anda hanya tidak diizinkan untuk memberikan input sebagai daftar angka / string. Saya menafsirkan ini sebagai ["1","2","3"]input yang tidak valid tetapi "123"sebenarnya. jika @VedantKandoi memiliki masalah dengannya, saya pasti dapat mengubahnya!
KGlasier
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.