Номер, який можна їсти сам


30

Враховуючи додатне ціле число, виведіть значення truthy / falesy щодо того, чи може число їсти саме себе.

Правила

Лівий край - голова, правий край - хвіст

Якщо голова більша за хвіст або дорівнює, голова їсть хвіст і нова голова стає їх сумою.

Якщо сум10 то голову замінюють на .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
Їх можна назвати автоканібалістичними числами .
Арнольд

6
Що є причиною того, що ми не можемо вважати перелік цифр? Ця проблема вже розглядає їх так, ніби вони є списками цифр. Примушуючи їх бути числами, вам потрібно просто закріпити додатковий код, щоб перетворити їх у список.
Пшеничний майстер

1
Чи можна повернути два послідовних чітких значення замість truthy / falesy?
Олів'є Грегоар

Відповіді:


7

JavaScript (ES6),  52 51  50 байт

Збережено 1 байт завдяки @tsh

Вводиться як рядок. Повертає булеве значення.

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.
Кевін Круїссен

@KevinCruijssen Дійсно ... відповіді Python неоптимальні: гольфи в коментарях коротші, ніж ця відповідь. Також дякую за збережений байт! ;-)
Олів'є Грегоар

Ви можете повернути або 1 , починаючи і виконуючи (збереження 1 байта). 01r=1r&=h<n%10?0:r;return r;
Арнольд

4

Математика, 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 *)

Правило застосовується до тих пір, поки візерунок більше не збігається, і в цьому випадку або залишилася лише одна цифра (truthy), або голова менше хвоста (фальшивий).

Замість виклику Length[__]==1ми можемо зберегти кілька байтів 0(__)=={0}, помноживши всі елементи у списку на, 0 а потім порівнявши зі списком {0}.


1
Якщо ви цього не знали, TIO має Mathematica зараз. Спробуйте в Інтернеті!
Денніс

4

Python 3 , 50 байт

Перший рядок вкрали з відповіді Чорної Сови Кая .

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

Спробуйте в Інтернеті!

Вихід здійснюється через код виходу. Збої (1) для фальшивих входів і закінчень (0) для вхідних даних.


Чи можете ви пояснити, чому p%10<k>qне кидає NameError, якщо p%10 >= k?
Чорна сова Кай

1
@BlackOwlKai ланцюгові порівняння ліниво оцінюються в Python. Це означає, що як тільки з’явиться перше помилкове порівняння, ланцюг більше не буде оцінюватися. У цьому випадку p%10<k>qробить те саме, що і p%10<k and k>q.
ов

4

Python 2 , 105 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

Спробуйте в Інтернеті!

Велике спасибі за масовий -23 від @ ØrjanJohansen

Завдяки @VedantKandoi (та @ ØrjanJohansen) ще -1


1
Ви можете використовувати forз зворотним фрагментом, а також робити %10єдине під час тестування: Спробуйте в Інтернеті!
Ørjan Johansen

1
Замініть умовою if-else, if i[0]<i[-1]:x=0а потім else:..... @ ØrjanJohansen, у вашій відповіді теж.
Ведант Кандой

@ ØrjanJohansen - Дякую Це добре круто.
ElPedro

Привіт @VedantKandoi. Звучить добре, але не впевнений, що саме ви маєте на увазі. Ти мене побив на тому. Чи можете ви додати TIO будь-ласка? Коли я намагаюся, це працює для всіх Trueвипадків, але не для всіх False.
ElPedro

1
Я думаю, що @VedantKandoi це означає .
Ørjan Johansen

4

Брахілог , 23 байти

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

Спробуйте в Інтернеті!

Це економія на 1 байт над рішенням Fatalize . Для цього використовується рекурсивний підхід замість ітеративного

Пояснення

ẹ                          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← призначити t(для t ail)

  ⍵< для кожної оригінальної цифри дивіться, чи менша вона

   виберіть перший справжній / хибний

: якщо так:

  0 повернути хибне

 потім:

3:: якщо відтепер трапляється помилка індексу (поза межами):

  1 повернути правду

  ¯1↓⍵ опустити останню цифру

   вихід, який (відокремлюється, 1і ¯1тому вони не утворюватимуть єдиного масиву)

  t+@1 додати хвіст до першої цифри (голова)

  10| мод-10

   рецидивувати

Щойно ми потрапимо на одну цифру, ¯1↓зробимо це порожнім списком і @1призведе до помилки в індексі, оскільки немає першої цифри, що призведе до повернення функції істинним.



3

Брахілог , 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 Дуже круто. Я думаю, ви повинні опублікувати власну відповідь, тому що вона суттєво відрізняється від моєї!
Фаталізувати

3

Haskell, 70 64 60 байт

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

Введення приймається як рядок.

Спробуйте в Інтернеті!

Редагувати: -6 байт, використовуючи хитрість @ Laikoni використовувати ||замість окремих охоронців. Ще -4 байти завдяки @Laikoni.


3
read[l b]може бути лише read bтому, що ви так чи інакше дивитесь лише на останню цифру. Економить ще 4 байти, також вкладиш last: Спробуйте в Інтернеті!
Лайконі



2

Haskell , 69 64 байт

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

Спробуйте в Інтернеті! Приклад використання: f 2632врожайність True.

Редагувати: -5 байт, тому щоmod (h + mod n 10) 10 = mod (h + n) 10


приємне використання ||, що допомогло і мені скоротити відповідь. Спасибі!
німі

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

Сітківка 0,8,2 , 42 байти

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

^#*;$

Спробуйте в Інтернеті! Посилання включає тестові випадки. Пояснення:

\d
$*#;

Перетворять цифри в одинакові та вставляють роздільники.

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

Якщо остання цифра не більша за першу, то додайте їх разом.

#{10}

Скоротіть модуль 10, якщо це доречно.

}`

Повторюйте, поки остання цифра не перевищує першу або залишилася лише одна цифра.

^#*;$

Перевірте, чи залишилася лише одна цифра.


1

05AB1E , 26 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;}

Спробуйте в Інтернеті!

Перший раз я намагаюся щось подібне, тому якщо я відформатував щось не так, будь ласка, повідомте мене. Я не на 100% впевнений у таких правилах, як використання простору імен, щоб усунути 5 байт "std ::", тому я залишив це.

Безголовки:

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"формою, що також робить a using namespace std;. Цей заголовок був написаний автором мовного зворотного шляху (найновіша версія - 2010) для студентів, які не знають C ++.
Якк

@Yakk Якщо ви не зробите та не опублікуєте перекладача, який робить це за вас, вам все одно потрібно підрахувати включення std_lib_facilities.h.
Денніс

@BenH Ласкаво просимо до PPCG! Вам потрібно порахувати всі включені, необхідні для складання вашої функції. Найкоротший метод, який я знаю #import<string>. Спробуйте в Інтернеті!
Денніс

@Dennis #!/usr/bin/shnewline gcc -include "std_lib_facilities.h" $@- якщо я знайду курс C ++, який забезпечує цей скрипт оболонки, чи вважатиметься це?
Якк

@Yakk Не знав про цей перемикач. На відміну від операторів #include, аргументи командного рядка безкоштовні, оскільки вони по суті є новою мовою . У C ++ (gcc)-include iostream це дійсно 144 байти.
Денніс


1

C (gcc) (з рядком.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, тому правильний синтаксис зв’язку бібліотек як нової мови мені чужий. Також зауважте, що функція повертає 0 або 1 для false / true, а для друку, що призводить до stdout, потрібна stdio. Якщо ми ведемо педантичність і вправа вимагає виводу, мова вимагає stdio .

Концептуально схожий на відповідь @ BenH, але в С, так що куди, де вони належать (Ласкаво просимо в PPCG, btw), але з використанням рекурсії. Він також використовує арифметику вказівника масиву, оскільки брудний код коротший, ніж чистий код.

Ця функція є рекурсивною хвостовою, з умовами виходу, якщо перше число не може з'їсти останнє або довжина дорівнює 1, повертаючи помилкове або істинне відповідно. Ці значення знаходять, відкинувши вказівник на C-String (який дає знак) на початку та в кінці рядка, та порівнявши їх. Арифметика вказівника робиться для пошуку кінця рядка. нарешті, останній знак "стирається", замінюючи його нульовим термінатором (0).

Цілком можливо, що арифметику модуля можна було б скоротити на два байти, але мені вже потрібна злива після цієї маніпуляції з покажчиком.

Безгольова версія тут

Оновлення: збережено два байти, замінивши c == 1 на! C. Це по суті c == 0. Він запустить додатковий час і непотрібно подвоїти себе перед видаленням, але економить два байти. Побічний ефект - це рядки нульової або нульової довжини, не спричиняючи нескінченну рекурсію (хоча ми не повинні отримувати нульові рядки, оскільки вправа говорить про цілі числа)


Вам не потрібно зв'язувати бібліотеки у випадку gcc- хоча попередження будуть згенеровані, gccвони з радістю скомпілюють ваш код без #includes. Крім того, ви можете зберегти 4 байти за допомогою -DR=return. Нарешті, у вашому тестовому коді \0s є непотрібними, оскільки рядок буквально вже включає їх неявно.

1
Крім того, ви можете повернутися з функції, призначивши першу змінну: b=case1?res1:case2?res2:res_else;те саме, щоif(case1)return res1;if(case2)return res2;return res_else;

Ще більше, ви можете пропустити кілька зайвих байтів, не використовуючи c: ви можете визначити, чи є рядок нульовою довжиною від head-tail.


Не розуміли, що ви можете використовувати потрійні (умовні) оператори в C. Це завжди було так? Незалежно, добре знати; Я буду використовувати їх у майбутньому. Ура
Ендрю Баумер

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не оцінюється. Крім того, якщо ($m=$Matches).1-ge$m.3це Falseте право підвираз -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%10як integerі порівнюємо його з stringтим, що тип лівого операнда є string. І 2+$s[0]+$sперетворює char $s[0]і string $sв integerтому, що лівий операнд 2є цілим числом.

$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

Брахілог , 18 байт

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

Спробуйте в Інтернеті!

Приймає три байта геть рішень Fatalize просто в силі недетерміністіческого superscriptless існуючого в даний час, але втрачає ще три, роблячи невизначено Jelly натхнених речей , z₁щоб уникнути використання c, gабо навіть 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

PowerShell , 94 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тому що достатньо для
виклику

ви могли вилучити return та зберегти 7 байт
mazzy

і я думаю, ви повинні включити декларацію параметра до підрахунку байтів. або param($n)або function f($n).
маззи

1
@mazzy Плакат заявив у коментарях, що вам дозволено використовувати рядки, вам просто не дозволялося вводити дані як список чисел / рядків. Я інтерпретував це як ["1","2","3"]невірний вхід, але "123"є. якщо у @VedantKandoi є проблема з нею, я точно можу це змінити!
KGlasier
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.