İlk n Bouncy Sayılarının Toplamını Bulun


19

terminoloji

Artan bir sayı, her basamağın solundaki tüm basamaklardan büyük veya ona eşit olduğu bir sayıdır (ör. 12239)

Azalan sayı, her basamağın solundaki tüm rakamlardan küçük veya ona eşit olduğu bir sayıdır (ör. 95531)

Kabarık sayı, artmayan veya azalmayan herhangi bir sayıdır. Bu en az 3 basamak gerektirdiğinden, ilk kabarık sayı 101'dir

Görev

1'den büyük veya 1'e eşit bir tamsayı verildiğinde, ilk n kabarık sayıların toplamını bulun

kurallar

  • Bu kod golf, bu yüzden en az bayt ile cevap kazanır
  • Dilinizin tamsayı boyutunda sınırları varsa (ör. 2 ^ 32-1) n, toplamın tamsayıya sığacak kadar küçük olacaktır
  • Girdi herhangi bir makul formda olabilir (stdin, dosya, komut satırı parametresi, tamsayı, dize vb.)
  • Çıktı herhangi bir makul form olabilir (stdout, dosya, sayıyı gösteren grafik kullanıcı öğesi, vb.)

Test senaryoları

1 > 101
10 > 1065
44701 > 1096472981

3
Kısıtlamalarınızı anladığımdan emin değilim. sortNumaraları yapıp orijinal numara ile aynı olup olmadığını kontrol edebilir miyim ? Bu yerleşik bir ( sort) kullanır, ancak artmakta olup olmadığını kontrol etmek için kesinlikle yerleşik değildir. "Kaçınılması gereken şeyler" Meta yayınımızda Gözlenemeyen program gereksinimlerine göz atın ve Y olmadan X yapın .
AdmBorkBork

5
Merhaba, PPCG'ye hoş geldiniz! Bu güzel bir ilk yazı (+1) olsa da, bazı küçük önerilerim var: Bir sayının artıp artmadığını kontrol eden hiçbir yerleşik kullanılmayabilir , Bir dizenin sözlükbilimsel olarak artıp artmadığını kontrol eden yerleşikler kullanılamaz (yerleşiklere izin verilmez) zorlukları yazarken kaçınılması gereken bir şeydir ; geri bildirim ve rehberlik almak için gönderilmeden önce posta fikrinizi paylaşabileceğiniz, önerilen zorluklar için bir Korumalı
Alanımız var


4
İlk etapta hala böyle bir kısıtlamanın olduğu noktasını göremiyorum. Tabii ki, onu saklayıp saklamamak size kalmış, ancak yerleşik olanları yasaklamak genellikle kötü bir uygulamadır. Zorluğun yerleşikler tarafından önemsiz olduğunu düşünüyorsanız, bunları sınırlandırmanın görevi çözmeyi daha ilginç hale getirmediğini, daha ziyade ortak levha eklediğini not etmelisiniz. Bu kısıtlamayı kaldırmayı düşünebilir misiniz? (bu arada, bu hala Y olmadan Do X'un altına düşüyor ) Aksi takdirde, fikri çok seviyorum ve asıl görevden uzaklaşmak için biraz öznel bir kısıtlama istemem.
Bay Xcoder

10
Bununla birlikte, bu şekilde topluluk için daha eğlenceli olduğu ve zorlukların en iyi kalitede olmasını sağlayan yönergelere ve en iyi uygulamalara güveneceği açık olduğu için kısıtlamayı kaldırdım
20

Yanıtlar:


8

Jöle , 10 8 bayt

ṢeṚƬ¬µ#S

Çevrimiçi deneyin!

Nasıl çalışır

Ṣ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.

4
+1 ṚƬson derece temiz ...
Bay Xcoder

6

Pyth , 10 bayt

s.f!SI#_B`

Burada deneyin!

Nasıl çalışır?

sf! SI # _B` - Tam program. STDIN'den Q tamsayısını alır ve STDOUT'a çıktı verir.
 .f - Belirli bir koşulu karşılayan ilk Q pozitif tamsayıyı bulun.
   ! SI # _B - Durum. Yalnızca kabarık sayılar için true değerini döndürür.
       _B` - Sayıyı bir dizgiye atar ve tersi ile çatallar (eşleştirir).
      # - Filtre tutmak o ...
     Ben - Altında değişmez ...
    S - Sıralama.
           - Açıklığa kavuşturmak gerekirse, ben (değişmez) iki girdi alan bir Pyth operatörüdür, 
             işlev ve bir değer ve işlev (değer) == değerinin olup olmadığını kontrol eder.
             bu teknik olarak yerleşik değildir.
   ! - Mantıksal değil. Boş liste true değerine, diğer değerler false değerine eşlenir.
s - Toplam.

4

K (ngn / k) , 37 bayt

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

Çevrimiçi deneyin!

{ } argümanlı bir işlevdir x

x{ }\0geçerlidir {}üzerinde 0 xara sonuçları koruyarak kez

(1+) halef işlevidir

{ }(1+)/x+1başlayarak halefi fonksiyonunu uygular x+1kadar {}doğrudur döndürür

10\x ondalık basamakları x

a: atamak a

|\ maksimum taramasıdır (kısmi maksimum) a

&\ benzer şekilde, min-tarama

a~|\agelmez aonun max-tarama maç?

| veya

a~&\a min tarama?

+/ toplam


4

JavaScript (ES6), 77 bayt

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)

Çevrimiçi deneyin!

Yorumlananlar

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

3

Python 2, 110 92 89 bayt

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

Çevrimiçi deneyin

Bu işlev, bir sayının kabarık olup olmadığını belirler:

lambda x:{-1,1}<=set(map(cmp,`x`[:-1],`x`[1:]))

Karakterleri doğrudan karşılaştırabilirsiniz. Aslında, sizin belirlediğiniz kavrayışınız olabilir set(map(cmp,`x`[:-1],`x`[1:])).
Jakob

@ Jakob Teşekkürler. Her zaman mapbu şekilde kullanabileceğinizi unutuyorum .
mbomb007

1
x=s=0\nwhile n:b={-1,1}<=set(map(cmp,`x`[:-1],`x`[1:]));s+=x*b;n-=b;x+=13 bayt kaydeder
Bay Xcoder


3

Retina , 93 bayt

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

Çevrimiçi deneyin! Açıklama:

K`:

Başlangıç ​​durumuna getirin s=i=0. ( sSayısıdır #önce s :, isayısı #sonra s).

"$+"{
...
)`

Tekrarlama nzamanları.

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

Süre ikabarık değil.

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

iOndalık olarak artırın ve bir kopya alın.

\d
*_;

Kopyanın rakamlarını tekli'ye dönüştürün. Bounciness testi, tekli kopyayı kullanır, bu nedenle ien az bir kez artırıldığında yalnızca bir kez çalışır .

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

Ekle iiçin siç döngünün sonraki geçiş için bounciness testi başarısız olur ve böylece, ve tekli basamak kopyasını silin ikez en az artırılır alır.

\G#

sOndalık biçime dönüştür .

121 bayt sürümü ondalık olarak hesaplar, bu nedenle daha büyük değerler için işe yarayabilir n:

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

Çevrimiçi deneyin! Açıklama:

K`0:0

Başlangıç ​​durumuna getirin s=i=0.

"$+"{
...
)`

Tekrarlama nzamanları.

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

Süre ikabarık değil.

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

Arttırın ive bir kopya alın.

+`;\d
;$&*_;

Kopyanın rakamlarını tekli'ye dönüştürün. Bounciness testi, tekli kopyayı kullanır, bu nedenle ien az bir kez artırıldığında yalnızca bir kez çalışır .

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

Ekle iiçin siç döngünün sonraki geçiş için bounciness testi başarısız olur ve böylece, ve tekli basamak kopyasını silin ikez en az artırılır alır.

:.*

Sil i.


3

05AB1E , 12 bayt

µN{‚Nå_iNO¼

Çevrimiçi deneyin!

açıklama

µ              # 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

3

Java 8, 114112 bayt

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

Sayının arttığını veya azaldığını kontrol etmek için normal bir ifade kullanır. Burada çevrimiçi deneyin .

Ungolfed:

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
}

2

Python 2, 250 bayt

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

Hoşgeldiniz! Bu sayfa için İpuçları in Python
mbomb007

1
;Kodun bir kısmını yeniden kullanabilmeniz için mümkün olduğunca çok ifadeyi tek bir satıra koymayı, boşlukları kaldırmayı ve çok uzun olan 2 uzun satır için bir işlev tanımlamayı öneririm . Ayrıca, a=b=s=0ve yapabilirsiniz len(g)!=h-1!=len(d).
mbomb007

İpuçları için teşekkürler. Şimdi gitmem lazım. ama daha sonra çalışacağım.
Hashbrowns


0

Kırmızı , 108 bayt

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]

Çevrimiçi deneyin!

Daha okunabilir:

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
]

Kullanmak için iyi bir fırsat form- form i5 bayt daha kısato-string i


0

MATL , 31 30 bayt

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

Çevrimiçi deneyin!

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

0

R , 96 bayt

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}

Çevrimiçi deneyin!

Açıklama:

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

0

Yakut (123 bayt)

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

Bana çok çirkin gözüküyor. Kabarıklık bu blokta tanımlanırx.sort!=x&&x.sort!=x.reverse



0

C (gcc), 104 bayt

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

Burada çevrimiçi deneyin .

Ungolfed:

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
}

u+=!y?--b,o:0,++oBunun yerine u+=y?0:o+0*--b,++o, ;y&=(c-=n%10)<0?:c?2:y)c=n%10,n/=10;yerine öner;)c=n%10,n/=10,y&=(c-=n%10)<0?:c?2:y;
ceilingcat
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.