Znajdź sumę pierwszych n liczb sprężystych

19

Terminologia

Rosnąca liczba to taka, w której każda cyfra jest większa lub równa wszystkim cyfrom po jej lewej stronie (np. 12239)

Malejąca liczba to jedna, w której każda cyfra jest mniejsza lub równa wszystkim cyfrom po jej lewej stronie (np. 95531)

Skacząca liczba to dowolna liczba, która nie rośnie ani nie maleje. Ponieważ wymaga to co najmniej 3 cyfr, pierwszy numer sprężysty to 101

Zadanie

Biorąc pod uwagę liczbę całkowitą n większą lub równą 1, znajdź sumę pierwszych n liczb sprężystych

Zasady

  • To jest kod golfowy, więc wygrywa odpowiedź z najmniejszą ilością bajtów
  • Jeśli twój język ma ograniczenia wielkości całkowitych (np. 2 ^ 32-1), n ​​będzie wystarczająco małe, aby suma zmieściła się w liczbie całkowitej
  • Dane wejściowe mogą mieć dowolną rozsądną formę (standardowe wejście, plik, parametr wiersza poleceń, liczba całkowita, ciąg itp.)
  • Dane wyjściowe mogą mieć dowolną rozsądną formę (standardowe wyjście, plik, graficzny element użytkownika, który wyświetla liczbę itp.)

Przypadki testowe

1 > 101
10 > 1065
44701 > 1096472981
awerna
źródło
3
Nie jestem pewien, czy rozumiem twoje ograniczenia. Czy mogę sortsprawdzić numery i sprawdzić, czy są takie same jak oryginalny numer? To używa wbudowanej funkcji ( sort), ale nie jest to ściśle wbudowana funkcja sprawdzania, czy rośnie. Sprawdź wymagania programu, których nie można zaobserwować, i wykonaj X bez Y w naszym wpisie „Rzeczy, których należy unikać”.
AdmBorkBork,
5
Cześć, witamy w PPCG! Chociaż jest to dobry pierwszy post (+1), mam kilka małych sugestii: Nie można używać żadnych wbudowanych, które sprawdzają, czy liczba się zwiększa , Nie można używać żadnych wbudowanych, które sprawdzają, czy łańcuch jest leksykograficznie rosnący (nie zezwalając na wbudowane) jest rzeczą, aby uniknąć problemów podczas pisania ; mamy piaskownicę dla proponowanych wyzwań , w której możesz podzielić się swoim pomysłem na post przed przesłaniem, aby otrzymać opinie i wskazówki :)
Mr. Xcoder
Zaktualizowałem ograniczenia, aby lepiej pasowały do ​​kategorii „Wyjątki” zamieszczonego linku
avern
4
Nadal nie widzę sensu posiadania takiego ograniczenia. Oczywiście to od Ciebie zależy, czy chcesz je zachować, czy nie, ale zabranianie wbudowanych programów jest zwykle złą praktyką. Jeśli uważasz, że wyzwanie jest trywialne dzięki wbudowanym funkcjom, powinieneś zauważyć, że samo ich ograniczenie nie sprawia, że ​​rozwiązanie zadania jest ciekawsze, a raczej dodaje podstawki. Czy możesz rozważyć usunięcie tego ograniczenia? (nawiasem mówiąc, to nadal należy do Do X bez Y ) W przeciwnym razie bardzo podoba mi się ten pomysł i nie chciałbym, aby nieznacznie subiektywne ograniczenie zniekształcało rzeczywiste zadanie.
Pan Xcoder,
10
Usunąłem jednak to ograniczenie, ponieważ jest jasne, że w ten sposób społeczność będzie bardziej przyjemna i zaufam tutaj wytycznym i najlepszym praktykom, które zapewnią najlepszą jakość
wyzwań

Odpowiedzi:

8

Galaretka , 10 8 bajtów

ṢeṚƬ¬µ#S

Wypróbuj online!

Jak to działa

ṢeṚƬ¬µ#S  Main link. No arguments.

      #   Read an integer n from STDIN and call the chain to the left with argument
          k = 0, 1, 2, ... until n of them return a truthy result.
          Yield the array of successful values of k.
     µ    Monadic chain. Argument: k (integer)
Ṣ           Sort, after promoting k to its digit array.
  ṚƬ        Reverse 'til the results are no longer unique and yield unique results.
            Calling Ṛ on k promotes it to its digit array. If k = 14235, the 
            result is [14235, [5,3,2,4,1], [1,4,2,3,5]].
 e          Check if the result to the left appears in the result to the right.
    ¬       Negate the resulting Boolean.
       S  Take the sum.
Dennis
źródło
4
+1 ṚƬjest bardzo schludne ...
Pan Xcoder,
6

Pyth , 10 bajtów

s.f!SI#_B`

Wypróbuj tutaj!

Jak to działa?

sf! SI # _B` - Pełny program. Pobiera liczbę całkowitą Q ze STDIN i wysyła do STDOUT.
 .f - Znajdź pierwsze Q dodatnich liczb całkowitych, które spełniają określony warunek.
   ! SI # _B - Warunek. Zwraca prawdę tylko dla liczb sprężystych.
       _B` - Rzuć liczbę na ciąg i rozwidlaj (łącz) ją z jej odwrotnością.
      # - Filtruj-zachowaj te ...
     Ja - które są niezmienne w ...
    S - Sortowanie.
           - Aby wyjaśnić, I (niezmiennik) jest operatorem Pytha, który pobiera dwa dane wejściowe, a 
             funkcja i wartość i sprawdza, czy funkcja (wartość) == wartość, więc
             technicznie nie jest to wbudowane.
   ! - Nie logiczne. Pusta lista zostaje zamapowana na true, inne wartości na false.
s - Suma.
Pan Xcoder
źródło
4

K (ngn / k) , 37 bajtów

{+/x{{(a~&\a)|a~|\a:10\x}(1+)/x+1}\0}

Wypróbuj online!

{ } jest funkcją z argumentem x

x{ }\0stosuje się {}na 0 xczas, zachowując wyników pośrednich

(1+) jest funkcją następczą

{ }(1+)/x+1stosuje funkcję następcy od x+1momentu, aż {}zwraca true

10\x są cyframi dziesiętnymi x

a: Przypisać do a

|\ jest maksymalnym skanem (maksymalne częściowe) wynoszącym a

&\ analogicznie jest min-skan

a~|\anie apasuje jej max-skan?

| lub

a~&\a jego min-skan?

+/ suma

ngn
źródło
4

JavaScript (ES6), 77 bajtów

f=(i,n=0,k,p)=>i&&([...n+''].map(x=>k|=x<p|2*(p<(p=x)))|k>2&&i--&&n)+f(i,n+1)

Wypróbuj online!

Skomentował

f = (                     // f = recursive function taking:
  i,                      //   i = number of bouncy numbers to find
  n = 0,                  //   n = current value
  k,                      //   k = bitmask to flag increasing/decreasing sequences
  p                       //   p = previous value while iterating over the digits
) =>                      //
  i && (                  // if there's still at least one number to find:
    [...n + '']           //   turn n into a string and split it
    .map(x =>             //   for each digit x in n:
      k |=                //     update k:
        x < p |           //       set bit #0 if x is less than the previous digit
        2 * (p < (p = x)) //       set bit #1 if x is greater than the previous digit
                          //       and update p
    )                     //   end of map()
    | k > 2               //   if both bits are set (n is bouncy):
    && i--                //     decrement i
    && n                  //     and add n to the total
  ) + f(i, n + 1)         //   add the result of a recursive call with n + 1
Arnauld
źródło
3

Python 2, 110 92 89 bajtów

n=input()
x=s=0
while n:b={-1,1}<=set(map(cmp,`x`[:-1],`x`[1:]));s+=x*b;n-=b;x+=1
print s

Wypróbuj online

Ta funkcja określa, czy liczba jest sprężysta:

lambda x:{-1,1}<=set(map(cmp,`x`[:-1],`x`[1:]))
mbomb007
źródło
Możesz bezpośrednio porównywać postacie. W rzeczywistości twoje zrozumienie może się stać set(map(cmp,`x`[:-1],`x`[1:])).
Jakob
@Jakob Thanks. Zawsze zapominam, że możesz maptego używać .
mbomb007
1
x=s=0\nwhile n:b={-1,1}<=set(map(cmp,`x`[:-1],`x`[1:]));s+=x*b;n-=b;x+=1oszczędza 3 bajty
Mr. Xcoder,
3

Python 2 , 84 bajtów

i=s=0
n=input()
while n:b=`i`>`sorted(`i`)`[2::5]<`i`[::-1];n-=b;s+=b*i;i+=1
print s

Wypróbuj online! Lub zobacz zestaw testowy .

Jonathan Allan
źródło
3

Siatkówka , 93 bajty

K`:
"$+"{/(?=.*;(_*);\1_)(?=.*_(_*);\2;)/^{`:(#*).*
:$1#;$.($1#
)`\d
*_;
)`:(#+).*
$1:$1
\G#

Wypróbuj online! Wyjaśnienie:

K`:

Zainicjuj s=i=0. ( sto liczba #s przed :, iliczba #s po.)

"$+"{
...
)`

Powtórz nczasy.

/(?=.*;(_*);\1_)(?=.*_(_*);\2;)/^{`
...
)`

Powtarzaj, dopóki inie jest sprężysty.

:(#*).*
:$1#;$.($1#

Zwiększ ii zrób kopię dziesiętną.

\d
*_;

Konwertuj cyfry kopii na jednoargumentowe. Test bujności wykorzystuje jednoargumentową kopię, więc działa tylko raz i, co najmniej raz został zwiększony.

:(#+).*
$1:$1

Dodaj ido si usunąć kopię jednoargumentowych cyfr, tak, że po następnym przejściu wewnętrznej pętli bounciness test nie powiedzie się i izostanie zwiększona co najmniej raz.

\G#

Konwertuj sna dziesiętny.

Wersja 121 bajtów jest obliczana w systemie dziesiętnym, więc może działać dla większych wartości n:

K`0:0
"$+"{/(?=.*;(_*);\1_)(?=.*_(_*);\2;)/^{`:(\d+).*
:$.($1*__);$.($1*__)
)+`;\d
;$&*_;
)`\d+:(\d+).*
$.(*_$1*):$1
:.*

Wypróbuj online! Wyjaśnienie:

K`0:0

Zainicjuj s=i=0.

"$+"{
...
)`

Powtórz nczasy.

/(?=.*;(_*);\1_)(?=.*_(_*);\2;)/^{`
...
)

Powtarzaj, dopóki inie jest sprężysty.

:(\d+).*
:$.($1*__);$.($1*__)

Zwiększ ii zrób kopię.

+`;\d
;$&*_;

Konwertuj cyfry kopii na jednoargumentowe. Test bujności wykorzystuje jednoargumentową kopię, więc działa tylko raz i, co najmniej raz został zwiększony.

\d+:(\d+).*
$.(*_$1*):$1

Dodaj ido si usunąć kopię jednoargumentowych cyfr, tak, że po następnym przejściu wewnętrznej pętli bounciness test nie powiedzie się i izostanie zwiększona co najmniej raz.

:.*

Usuń i.

Neil
źródło
3

05AB1E , 12 bajtów

µN{‚Nå_iNO¼

Wypróbuj online!

Wyjaśnienie

µ              # loop over increasing N until counter equals input
     Nå_i      # if N is not in
 N{‚          # the pair of N sorted and N sorted and reversed
         NO    # sum N with the rest of the stack
           ¼   # and increment the counter
Emigna
źródło
3

Java 8, 114 112 bajtów

n->{int i=0,s=0;for(;n>0;++i)s+=(""+i).matches("0*1*2*3*4*5*6*7*8*9*|9*8*7*6*5*4*3*2*1*0*")?0:--n*0+i;return s;}

Używa wyrażenia regularnego, aby sprawdzić, czy liczba rośnie, czy maleje. Wypróbuj online tutaj .

Nie golfowany:

n -> { // lambda
    int i = 0, // the next number to check for bounciness
        s = 0; // the sum of all bouncy numbers so far
    for(; n > 0; ++i) // iterate until we have summed n bouncy numbers, check a new number each iteration
        s += ("" + i) // convert to a String
             .matches("0*1*2*3*4*5*6*7*8*9*" // if it's not an increasing  number ...
             + "|9*8*7*6*5*4*3*2*1*0*") ? 0 // ... and it's not a decreasing number ...
             : --n*0 // ... we have found another bouncy number ...
               + i; // ... add it to the total.
    return s; // return the sum
}
OOBalance
źródło
2

Python 2, 250 bajtów

n=input()
a=0
b=0
s=0
while a<n:
    v=str(b)
    h=len(v)
    g=[int(v[f])-int(v[0]) for f in range(1,h) if v[f]>=v[f-1]]
    d=[int(v[f])-int(v[0]) for f in range(1,h) if v[f]<=v[f-1]]
    if len(g)!=h-1 and len(d)!=h-1:
       a+=1
       s+=b
    b+=1
print s
Hashbrowns
źródło
Witamy! Możesz
odwiedzić
1
Sugeruję użycie ;do umieszczenia jak największej liczby instrukcji w jednym wierszu, usunięcie białych znaków i zdefiniowanie funkcji dla 2 długich linii, które są bardzo podobne, abyś mógł ponownie użyć części kodu. Możesz także zrobić a=b=s=0i len(g)!=h-1!=len(d).
mbomb007,
Dzięki za wskazówki. Muszę teraz iść. ale popracuję nad tym później.
Hashbrowns,
0

Czerwony , 108 bajtów

func[n][i: s: 0 until[t: form i
if(t > u: sort copy t)and(t < reverse u)[s: s + i n: n - 1]i: i + 1
0 = n]s]

Wypróbuj online!

Bardziej czytelny:

f: func [ n ] [
    i: s: 0
    until [
       t: form i  
       if ( t > u: sort copy t ) and ( t < reverse u ) [
            s: s + i
            n: n - 1
       ]
       i: i + 1
       0 = n
    ]
    s
]

Dobra okazja do użycia form- form ijest o 5 bajtów krótszy niżto-string i

Galen Iwanow
źródło
0

MATL , 31 30 bajtów

l9`tVdZS&*0<a?wQtG>?.]y]QT]xvs

Wypróbuj online!

l       % Initialize counter to 1
9       % First value to check for being bouncy
`       % Start do-while loop
  tV    % duplicate the current number and convert to string
        % (let's use the iteration where the number is 1411)
        % stack: [1, 1411, '1411']
  d     % compute differences between the characters
        %  For non-bouncy numbers, this would be either all 
        %  positive values and 0, or all negative values and 0
        % stack: [1, 1411, [3 -3 0]]
  ZS    % keep only the signs of those differences
        % stack: [1, 1411, [1 -1 0]]
  &*    % multiply that array by its own transpose, so that
        %  each value is multiplied by every other value
        %  for non-bouncy numbers, all products will be >=0
        %  since it would have had only all -1s or all 1 (other than 0s)
        % stack: [1, 1411, [1 -1  0
                            -1  1 0
                            0  0  0]]
  0<a?  % if any value in the matrix is less than 0
    wQ    % switch the counter to top, increment it
          % stack: [1411, 2]
    tG>?  % duplicate it, check if it's gotten greater than the input limit
      .]    % if so, break out of loop
  y]    % else, duplicate bouncy number from inside stack,
        %  keeping a copy to be used for summing later
        % stack: [1411, 2, 1411]
  QT    % increment number, push True to continue loop
]     % loop end marker
x     % if we've broken out of loop, remove counter from stack
v     % concatenate the bouncy numbers we've collected in stack and 
s     % sum them
sundar - Przywróć Monikę
źródło
0

R , 96 bajtów

function(n){while(n){y=diff(T%/%10^(0:log10(T))%%10);g=any(y<0)&any(y>0);F=F+T*g;n=n-g;T=T+1};F}

Wypróbuj online!

Objaśnienie:

while(n){                         # while n > 0

        T%/%10^(0:log10(T))%%10   # split T into digits(T==TRUE==1 at the 1st loop)
y=diff(                         ) # compute the diff of digits i.e. digits[i] - digits[i+1]

g=any(y<0)&any(y>0)               # if at least one of the diff is < 0 and 
                                  # at least one is > 0 then T is "bouncy"

F=F+T*g                           # if bouncy increment F (F==FALSE==0 at the 1st loop)

n=n-g                             # decrement n by 1 if bouncy

T=T+1}                            # increment T by 1 and loop

F}                                # return F
digEmAll
źródło
0

Rubinowy (123 bajty)

o=0
x=["0"]
while n>0 do x=(x.join.to_i+1).to_s.split('')
(x.sort!=x&&x.sort!=x.reverse ? (n-=1;o+=x.join.to_i):'')
end
p o

Wygląda mi dość brzydko. W tym bloku zdefiniowano bujnośćx.sort!=x&&x.sort!=x.reverse

aaaaa mówi o przywróceniu Moniki
źródło
0

Rubinowy , 76 bajtów

->n,s=i=0{[d=(i+=1).digits,d.reverse].index(d.sort)||(s+=i;n-=1);n<1?s:redo}

Wypróbuj online!

Asone Tuhid
źródło
0

C (gcc), 104 bajty

f(b,o,u,n,c,y){for(o=u=0;b;u+=y?0:o+0*--b,++o)for(n=o,y=3;n/10;)c=n%10,n/=10,y&=(c-=n%10)<0?:c?2:y;b=u;}

Wypróbuj online tutaj .

Nie golfowany:

f(n, // function: return type and type of arguments defaults to int;
     // abusing extra arguments to declare variables
  i,   // number currently being checked for bounciness
  s,   // sum of the bouncy numbers
  j,   // copy of i to be used for checking bounciness in a loop
  p,   // used for investigating the last digit of j
  b) { // whether i is not bouncy; uses the two least significant bits to indicate increasing/decreasing
    for(i = s = 0; // check numbers from zero up; initial sum is zero
        n; // continue until we have n bouncy numbers
        s += b ? 0 // not bouncy, no change to the sum
        : i + 0* --n, // bouncy, add it to the sum and one less bouncy number to go
        ++i) // either way, move to the next number
        for(j = i, b = 3; j/10; ) // make a copy of the current number, and truncate it from the right until there is just one digit left
        // bounciness starts as 0b11, meaning both increasing and decreasing; a value of 0 means bouncy
            p = j % 10, // get the last digit
            j /= 10, // truncate one digit from the right
            b &= // adjust bounciness:
                 (p -= j % 10) // compare current digit to the next
                 < 0 ? // not an increasing number, clear second to least significant bit
                 : p ? 2 // not a decreasing number, clear least significant bit
                 : b; // keep it the same
    n = s; // gcc shortcut for return s
}
OOBalance
źródło
Sugeruj u+=!y?--b,o:0,++ozamiast u+=y?0:o+0*--b,++o, ;y&=(c-=n%10)<0?:c?2:y)c=n%10,n/=10;zamiast;)c=n%10,n/=10,y&=(c-=n%10)<0?:c?2:y;
ceilingcat