Liczba, która może sama zjeść

30

Biorąc pod uwagę dodatnią liczbę całkowitą, wypisz wartość prawdy / fałszu, czy liczba może sama zjeść.

Zasady

Najbardziej na lewo jest głowa, najbardziej na prawo jest ogon

Jeśli głowa jest większa lub równa ogonowi, głowa zjada ogon, a nowa głowa staje się ich sumą.

Jeśli to głowa zostaje zastąpiona .sum10summod10

sum=0 nie można zignorować, jednak numer wejściowy nigdy nie będzie miał żadnych zer wiodących.

Przykład:

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.

Jeśli w którymś momencie głowa nie będzie mogła zjeść ogona, odpowiedź będzie fałszywa.

number=6724
072
False (0<2)

Przypadki testowe:

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]

To jest golf golfowy, więc wygrywa najkrótszy kod.

Wedant Kandoi
źródło
Czy możemy brać dane wejściowe jako ciąg?
lirtosiast
@lirtosiast, tak, ale nie lista cyfr.
Vedant Kandoi,
14
Można je nazwać numerami autokannialistycznymi .
Arnauld,
6
Z jakiego powodu nie możemy traktować jako listy cyfr? Ten problem już traktuje je tak, jakby były listami cyfr. Wymuszenie na nich liczb oznacza, że ​​wystarczy przypiąć dodatkowy kod, aby przekonwertować je na listę.
Kreator pszenicy,
1
Czy zamiast prawdy / fałszu można zwrócić dwie spójne wartości?
Olivier Grégoire,

Odpowiedzi:

7

JavaScript (ES6),  52 51  50 bajtów

Zapisano 1 bajt dzięki @tsh

Pobiera dane wejściowe jako ciąg. Zwraca wartość logiczną.

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

Wypróbuj online!

Skomentował

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
Arnauld
źródło
6

Galaretka , 11 bajtów

Ṛṙ-µṖÄ%⁵:ḊẠ

Wypróbuj online!

Jak to działa

Ṛṙ-µṖÄ%⁵:ḊẠ  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.
Dennis
źródło
6

Perl 6 , 63 62 bajtów

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

Wypróbuj online!

Wyjaśnienie:

{                                                            } # 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?
Jo King
źródło
5

Java (JDK) , 83 bajty

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

Wypróbuj online!

Kredyty

Olivier Grégoire
źródło
Biorąc pod uwagę długość odpowiedzi w języku Python, wydaje mi się, że coś przeoczyłem ... chociaż przypadki testowe są w porządku.
Olivier Grégoire,
Myślę, że niczego nie przegapiłeś. Python odpowiada zarówno wziąć wejście jako ciąg i użytkowania indeksowania i wziąć wejście As Integer i użytkowania /10oraz %10w pętli. Tak dobrze zrobione pokonanie odpowiedzi w języku Python; +1 ode mnie :)
Kevin Cruijssen
1
Możesz zagrać w golfa zmieniając bajt r+=na r=i ?1:0na ?1:r.
Kevin Cruijssen,
@KevinCruijssen Rzeczywiście ... odpowiedzi w języku Python są suboptymalne: pola golfowe w komentarzach są krótsze niż ta odpowiedź. Dziękujemy również za zapisanie bajtu! ;-)
Olivier Grégoire,
Możesz zwrócić lub 1 , zaczynając od i wykonując (oszczędzając 1 bajt). 01r=1r&=h<n%10?0:r;return r;
Arnauld,
4

Mathematica, 62 bajty

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

Najpierw wywołuje IntegerDigitsdane wejściowe, aby uzyskać listę jego cyfr, a następnie wielokrotnie stosuje następującą zasadę:

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

Reguła jest stosowana, dopóki wzór nie będzie już pasować, w którym to przypadku zostaje tylko jedna cyfra (prawda) lub głowa jest mniejsza niż ogon (fałsz).

Zamiast dzwonić Length[__]==1, możemy zapisać kilka bajtów 0(__)=={0}, mnożąc wszystkie elementy na liście, 0 a następnie porównując z listą {0}.

Klamka
źródło
1
Jeśli nie wiesz, TIO ma teraz Mathematica. Wypróbuj online!
Dennis,
4

Python 3 , 50 bajtów

Pierwsza linia skradziona z odpowiedzi Czarnej Sowy Kai .

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

Wypróbuj online!

Wyjście odbywa się za pomocą kodu wyjścia. Nie powiodło się (1) dla danych wejściowych fałszowania i zakończeń (0) dla danych wejściowych zgodnych z prawdą.

ovs
źródło
Czy możesz wyjaśnić, dlaczego p%10<k>qnie rzuca NameError, jeśli p%10 >= k?
Black Owl Kai,
1
Porównania łańcuchowe @BlackOwlKai są leniwie oceniane w Pythonie. Oznacza to, że jak tylko pojawi się pierwsze fałszywe porównanie, łańcuch nie będzie już oceniany. W tym przypadku p%10<k>qrobi to samo co p%10<k and k>q.
ovs
4

Python 2 , 105 82 81 bajtów

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

Wypróbuj online!

Wielkie dzięki za ogromne -23 od @ ØrjanJohansen

Dzięki @VedantKandoi (i @ ØrjanJohansen) za kolejne -1

ElPedro
źródło
1
Możesz użyć forodwróconego wycinka, a także zrobić to %10tylko podczas testowania: Wypróbuj online!
Ørjan Johansen
1
Zamień warunek if-else, if i[0]<i[-1]:x=0 a następnie else:..... @ ØrjanJohansen, również w twojej odpowiedzi.
Vedant Kandoi
@ ØrjanJohansen - Dzięki. To dobrze.
ElPedro,
Cześć @VedantKandoi. Brzmi dobrze, ale nie jestem pewien, co masz na myśli. Sprawiłeś, że zostałem przez to pobity. Czy możesz dodać TIO? Kiedy próbuję, działa to dla wszystkich Trueprzypadków, ale nie dla wszystkich False.
ElPedro,
1
Myślę @VedantKandoi Oznacza to .
Ørjan Johansen
4

Brachylog , 23 bajty

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

Wypróbuj online!

Jest to 1 bajtowa oszczędność w stosunku do rozwiązania Fatalize . To stosuje podejście rekurencyjne zamiast iteracyjne

Wyjaśnienie

ẹ                          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
Kroppeb
źródło
3

APL (Dyalog Unicode) , 33 bajty SBCS

Anonimowa funkcja ukrytego przedrostka przyjmująca ciąg znaków jako argument.

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

Wypróbuj online!

⍎¨ oceń każdy znak (daje nam to listę cyfr)

{} Zastosuj do tego następujące „dfn”;jest argumentem (lista cyfr):

  ⌽⍵ odwrócić argument

   wybierz pierwszy element (to jest ogon)

  t← przypisać do t(dla t ail)

  ⍵< dla każdej oryginalnej cyfry sprawdź, czy jest ona mniejsza

   wybierz pierwszą wartość prawda / fałsz

: w takim razie:

  0 zwróć false

 następnie:

3:: jeśli odtąd wystąpi błąd indeksu (poza zakresem):

  1 zwróć prawdę

  ¯1↓⍵ upuść ostatnią cyfrę

   wydajność, która (oddziela 1i¯1 dlatego nie będą tworzyć pojedynczą macierz)

  t+@1 dodaj ogon do pierwszej cyfry (głowy)

  10| mod-10

   powrócić

Kiedy trafimy jedną cyfrę, ¯1↓spowoduje to, że będzie pusta lista i @1spowoduje błąd indeksu, ponieważ nie ma pierwszej cyfry, powodując, że funkcja zwróci true.

Adám
źródło
3

Python 3 , 77 bajtów

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

Wypróbuj online!


I moje stare rozwiązanie z podejściem rekurencyjnym

Python 3 , 90 bajtów

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]))

Wypróbuj online!

Pobiera dane wejściowe jako ciąg.

Czarna sowa Kai
źródło
3

Brachylog , 24 bajty

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

Wypróbuj online!

Powinienem zmienić domyślne zachowanie, aby iterowało nieznaną liczbę razy (obecnie iteruje 1 raz, co jest całkowicie bezużyteczne). Nie potrzebowałbym wtedy […];I[…]⁾, oszczędzając 3 bajty

Wyjaśnienie

Ten program zawiera brzydki widelec wewnątrz widelca. Jest też trochę hydrauliki potrzebnej do pracy na listach cyfr zamiast cyfr (ponieważ jeśli usuniemy głowę i ogon 76, pozostaniemy z tym 0, co nie działa w przeciwieństwie do [7,6]miejsca, w którym się skończy []).

ẹ                          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
Fatalizować
źródło
Używając rekurencji zamiast iteracji i zastępując c-fork, ,zamiast tego mogę usunąć 1 bajt Wypróbuj online!
Kroppeb,
@Kroppeb Naprawdę fajne. Myślę, że powinieneś opublikować własną odpowiedź, ponieważ jest ona znacznie inna niż moja!
Fatalize
3

Haskell, 70 64 60 bajtów

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

Dane wejściowe są traktowane jako ciąg.

Wypróbuj online!

Edycja: -6 bajtów za pomocą sztuczki @ Laikoni polegającej na użyciu ||zamiast osobnych strażników. Kolejne -4 bajty dzięki @Laikoni.

nimi
źródło
3
read[l b]może być tak read bdlatego, że i tak patrzysz tylko na ostatnią cyfrę. Oszczędność 4 dodatkowych bajtów poprzez wstawianie last: Wypróbuj online!
Laikoni
2

Python 2 , 75 67 bajtów

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

Wypróbuj online!

Podejście lambda rekurencyjne. Pobiera dane wejściowe jako ciąg. Ogromne podziękowania dla Dennisa za oszczędność 8 bajtów!

ArBo
źródło
2

Haskell , 69 64 bajtów

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

Wypróbuj online! Przykładowe użycie: f 2632daje True.

Edycja: -5 bajtów, ponieważmod (h + mod n 10) 10 = mod (h + n) 10

Laikoni
źródło
miłe użycie ||, co pomogło mi również skrócić moją odpowiedź. Dzięki!
nimi
2

Ruby, 139 bajtów

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

Wypróbuj online! (ma dodatkowy kod do przetworzenia danych wejściowych, ponieważ jest to funkcja)

Nieskluczony kod:

->(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
CG Jedną ręką
źródło
1

Retina 0.8.2 , 42 bajty

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

^#*;$

Wypróbuj online! Link zawiera przypadki testowe. Wyjaśnienie:

\d
$*#;

Konwertuj cyfry na unary i wstaw separatory.

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

Jeśli ostatnia cyfra nie jest większa niż pierwsza, dodaj je razem.

#{10}

W razie potrzeby zmniejsz moduł 10.

}`

Powtarzaj tę czynność, aż ostatnia cyfra będzie większa od pierwszej lub pozostanie tylko jedna cyfra.

^#*;$

Sprawdź, czy pozostała tylko jedna cyfra.

Neil
źródło
1

05AB1E , 26 25 24 bajtów

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

Prawdopodobnie można go trochę pograć w golfa .. Wydaje się to zbyt długie, ale być może wyzwanie jest bardziej skomplikowane pod względem kodu, niż wcześniej myślałem.

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

[                 # 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
Kevin Cruijssen
źródło
1

C ++ (gcc) , 144 bajty

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

Wypróbuj online!

Po raz pierwszy próbuję czegoś takiego, więc jeśli źle sformatowałem coś, proszę dać mi znać. Nie jestem w 100% pewien zasad dotyczących rzeczy takich jak używanie przestrzeni nazw do eliminacji 5 bajtów „std ::”, więc zostawiłem to.

Nie golfowany:

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
}
Ben H.
źródło
1
Teoretycznie potrzebujesz także #includestwierdzeń. Proponuję jednak programowanie w std lib obiektów subdialect C ++ z wcześniej przygotowanym #include "std_lib_facilities.h", co również robi using namespace std;. Ten nagłówek został napisany przez autora wersji językowej (ostatnia wersja to 2010) dla studentów, którzy nie znają języka C ++.
Jak
@Yakk O ile nie stworzysz i nie opublikujesz interpretera, który robi to za Ciebie, nadal musisz uwzględnić dołączenie pliku std_lib_facilities.h.
Dennis,
@BenH Witamy w PPCG! Potrzebujesz liczby, która obejmuje wszystkie elementy wymagane do skompilowania twojej funkcji. Najkrótsza metoda jaką znam #import<string>. Wypróbuj online!
Dennis,
@Dennis #!/usr/bin/shnewline gcc -include "std_lib_facilities.h" $@- czy znajdę kurs C ++ zapewniający ten skrypt powłoki, czy to się liczy?
Jak
@Yakk Nie wiedziałem o tym przełączniku. W przeciwieństwie do instrukcji #include, argumenty wiersza poleceń są bezpłatne, ponieważ są one zasadniczo nowym językiem . W C ++ (gcc)-include iostream jest to rzeczywiście 144 bajty.
Dennis
1

C #, 114 bajtów

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

Wypróbuj online

gwell
źródło
1

C (gcc) (z string.h) , 110 108 bajtów

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

Wypróbuj online!

Wciąż stosunkowo nowy w PPCG, więc poprawna składnia do łączenia bibliotek jako nowego języka jest mi obca. Zauważ też, że funkcja zwraca 0 lub 1 dla false / true, a wydrukowanie wyniku do standardowego wymaga stdio. Jeśli jesteśmy pedantyczni, a ćwiczenie wymaga wyników, język wymaga stdio , że dobrze.

Koncepcyjnie podobny do odpowiedzi @ BenH, ale w C, więc pochwały tam, gdzie są należne (Witamy w PPCG, btw), ale przy użyciu rekurencji. Używa również arytmetyki wskaźnika tablicy, ponieważ brudny kod jest krótszy niż czysty kod.

Funkcja jest rekurencyjna, z warunkami wyjścia, jeśli pierwsza liczba nie może zjeść ostatniego lub długość wynosi 1, zwracając odpowiednio fałsz lub prawda. Wartości te można znaleźć, usuwając odwołanie do wskaźnika C-String (który daje znak char) na początku i na końcu łańcucha i wykonując na nim porównania. arytmetyka wskaźnika jest wykonywana w celu znalezienia końca łańcucha. na koniec ostatni znak jest „kasowany” przez zastąpienie go zerowym terminatorem (0).

Możliwe, że arytmetyka modułu może zostać skrócona o bajt lub dwa, ale po manipulacji wskaźnikiem potrzebuję już prysznica.

Wersja bez golfa tutaj

Aktualizacja: Zapisano dwa bajty, zastępując c == 1 znakiem! C. Jest to w zasadzie c == 0. Będzie działać przez dodatkowy czas i niepotrzebnie podwoi się przed usunięciem, ale oszczędza dwa bajty. Efektem ubocznym jest, że łańcuchy o zerowej lub zerowej długości nie spowodują nieskończonej rekurencji (chociaż nie powinniśmy otrzymywać ciągów zerowych, ponieważ ćwiczenie mówi o dodatnich liczbach całkowitych).

Andrew Baumher
źródło
W przypadku nie trzeba łączyć bibliotek gcc- chociaż ostrzeżenia zostaną wygenerowane, gccz przyjemnością skompilują kod bez #includes. Możesz także zapisać 4 bajty -DR=return. Wreszcie w kodzie testowym litery \0s są niepotrzebne, ponieważ ciąg dosłownie już je domyślnie zawiera.
1
Ponadto, możesz powrócić z funkcji, przypisując do pierwszej zmiennej: b=case1?res1:case2?res2:res_else;jest taki sam jakif(case1)return res1;if(case2)return res2;return res_else;
Co więcej, możesz zrzucić dodatkowe bajty, nieużywając c: możesz określić, czy łańcuch ma długość zerową head-tail.
Nie zdawałem sobie sprawy, że w C. można używać operatorów trójskładnikowych (warunkowych). Niezależnie od tego, dobrze wiedzieć; Będę ich używał w przyszłości. Na zdrowie
Andrew Baumher,
1

PowerShell, 89 bajtów

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

Ważny! Skrypt wywołuje się rekurencyjnie. Zapisz skrypt jako g.ps1plik w bieżącym katalogu. Możesz także wywołać zmienną blokową skryptu zamiast pliku skryptu (patrz skrypt testowy poniżej). Te połączenia mają tę samą długość.

Uwaga 1: Skrypt używa leniwej oceny operatorów logicznych -ori -and. Jeśli "$args"-notmatch'(.)(.*)(.)'jest, Trueto prawidłowe podwyrażenie -ornie jest oceniane. Również, jeśli ($m=$Matches).1-ge$m.3jest Falseto właściwe, to podwyrażenie -andnie jest również oceniane. Unikamy więc nieskończonej rekurencji.

Uwaga 2: Wyrażenie regularne '(.)(.*)(.)'nie zawiera kotwic początkowych i końcowych, ponieważ (.*)domyślnie wyrażenie jest zachłanne.

Skrypt testowy

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

Wydajność:

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 bajtów

Brak rekurencji. Brak zależności od nazwy pliku i brak zależności od nazwy bloku skryptu.

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 domyślnie konwertuje prawy operand na typ lewego operandu. Dlatego $s-ge$s%10oblicza prawy operand $s%10jako integeri porównuje go jako, stringponieważ typ lewego operandu to string. I 2+$s[0]+$skonwertuje znak $s[0]i ciąg znaków $sna, integerponieważ lewy operand 2jest liczbą całkowitą.

$s|% S*g 1($s.Length-2)jest skrótem do$s.Substring(1,($s.Length-2))

mazzy
źródło
1

C # (interaktywny kompilator Visual C #) , 69 bajtów

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

Wypróbuj online!

Sukces lub porażka zależy od obecności lub braku wyjątku . Dane wejściowe mają postać ciągu.

Mniej golfa ...

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

Istnieje kilka dodatkowych bajtów do radzenia sobie z konwersją znaków i cyfr, ale ogólnie nie miało to większego wpływu na rozmiar.

dana
źródło
1

Brachylog , 18 bajtów

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

Wypróbuj online!

Zajmuje trzy bajty off rozwiązania Fatalize tuż mocy niedeterministycznym superscriptless istniejącego obecnie, ale traci kolejne trzy wykonując niejasno Jelly inspirowane rzeczy z₁unikać używania c, glub nawet h. (Zainspirowany także próbą i bezskuteczności użycia innej nowej funkcji: ʰmetapredykatem).

                 Ȯ    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.
Niepowiązany ciąg
źródło
0

PowerShell , 94 91 bajtów

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

Wypróbuj online!


Skrypt testowy

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

Nieskluczony kod:

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
}
KGlasier
źródło
1
Nie powinieneś sprawdzać $n[0]swojego foroświadczenia - wystarczy sprawdzić $n.
AdmBorkBork,
Możesz użyć -6zamiast tego, -96ponieważ wystarczy
obliczyć
możesz usunąć return i zapisać 7 bajtów
mazzy
i myślę, że powinieneś dołączyć deklarację parametru do liczby bajtów. albo param($n)albo function f($n).
mazzy
1
@mazzy Plakat stwierdził w komentarzach, że wolno ci używać łańcuchów, po prostu nie możesz podawać danych wejściowych jako listy liczb / łańcuchów. Zinterpretowałem to jako ["1","2","3"]niepoprawne dane wejściowe, ale tak "123"jest. jeśli @VedantKandoi ma z tym problem, zdecydowanie mogę to zmienić!
KGlasier,