Temukan Jumlah Angka Pertama dan Bouncy


19

Terminologi

Angka yang bertambah adalah angka di mana setiap digit lebih besar dari atau sama dengan semua digit di sebelah kiri (ex. 12239)

Angka yang berkurang adalah angka di mana setiap digit kurang dari atau sama dengan semua digit di sebelah kiri (ex. 95531)

Bouncy number adalah bilangan apa pun yang tidak naik atau turun. Karena ini membutuhkan setidaknya 3 digit, angka goyang pertama adalah 101

Tugas

Dengan bilangan bulat n yang lebih besar dari atau sama dengan 1, temukan jumlah bilangan melenting pertama

Aturan

  • Ini kode golf, jadi jawabannya dengan jumlah byte terpendek akan menang
  • Jika bahasa Anda memiliki batasan ukuran bilangan bulat (mis. 2 ^ 32-1) n akan cukup kecil sehingga jumlahnya akan cocok dengan bilangan bulat
  • Input dapat berupa bentuk yang wajar (stdin, file, parameter baris perintah, integer, string, dll)
  • Output dapat berupa bentuk yang masuk akal (stdout, file, elemen pengguna grafis yang menampilkan nomor, dll)

Uji kasus

1 > 101
10 > 1065
44701 > 1096472981

3
Saya tidak yakin saya mengerti Batasan Anda. Bisakah saya sortangka-angkanya dan periksa apakah sama dengan nomor aslinya? Itu menggunakan built-in ( sort), tetapi tidak sepenuhnya built-in untuk memeriksa apakah itu meningkat. Lihat persyaratan program yang tidak dapat diobservasi dan Lakukan X tanpa Y pada pos Meta "Hal yang harus dihindari" kami.
AdmBorkBork

5
Hai, Selamat Datang di PPCG! Meskipun ini adalah posting pertama yang bagus (+1), saya punya beberapa saran kecil: Tidak ada builtin yang memeriksa apakah angka meningkat dapat digunakan , Tidak ada builtin yang memeriksa apakah string meningkat secara leksikografis dapat digunakan (melarang built-in) adalah hal yang harus dihindari ketika menulis tantangan ; kami memiliki Sandbox untuk Tantangan yang Diajukan , di mana Anda dapat membagikan ide kiriman Anda sebelum dikirim untuk menerima umpan balik dan bimbingan :)
Tn. Xcoder

Saya memperbarui batasan agar lebih cocok dengan kategori "Pengecualian" dari tautan yang Anda poskan
rata-rata

4
Saya masih tidak melihat gunanya memiliki pembatasan seperti itu di tempat pertama. Tentu saja, terserah Anda apakah akan menyimpannya atau tidak, tetapi melarang built-in biasanya merupakan praktik yang buruk. Jika Anda merasa tantangannya diremehkan oleh built-in, Anda harus mencatat bahwa hanya dengan membatasi mereka tidak membuat menyelesaikan tugas lebih menarik, tetapi menambahkan boilerplate. Bisakah Anda mempertimbangkan untuk menghapus batasan itu? (Ngomong-ngomong, ini masih berada di bawah Do X tanpa Y ) Jika tidak, saya sangat menyukai idenya, dan saya tidak ingin sedikit pembatasan subyektif mengurangi dari tugas yang sebenarnya.
Tn. Xcoder

10
Namun saya telah menghilangkan batasan, karena jelas bahwa itu lebih menyenangkan bagi masyarakat dengan cara itu, dan akan mempercayai pedoman dan praktik terbaik di sini yang memastikan tantangan dengan kualitas terbaik
rata-rata

Jawaban:


8

Jelly , 10 8 byte

ṢeṚƬ¬µ#S

Cobalah online!

Bagaimana itu bekerja

Ṣ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 ṚƬsangat rapi ...
Tn. Xcoder

6

Pyth , 10 byte

s.f!SI#_B`

Coba di sini!

Bagaimana itu bekerja?

sf! SI # _B` - Program lengkap. Mengambil Q integer dari STDIN dan output ke STDOUT.
 .f - Temukan bilangan bulat Q positif pertama yang memenuhi kondisi tertentu.
   ! SI # _B - Syaratnya. Mengembalikan nilai true hanya untuk angka bouncy.
       _B` - Masukkan nomor ke string dan bifurcate (pasangan) dengan terbalik.
      # - Saring-simpan itu ...
     Saya - Itu tidak berubah di bawah ...
    S - Sortasi.
           - Untuk mengklarifikasi, I (invarian) adalah operator Pyth yang mengambil dua input, a 
             fungsi dan nilai dan memeriksa apakah fungsi (nilai) == nilai, jadi
             ini secara teknis bukan built-in.
   ! - Tidak logis. Daftar kosong dipetakan ke true, nilai-nilai lain menjadi false.
s - Jumlah.

4

K (ngn / k) , 37 byte

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

Cobalah online!

{ } adalah fungsi dengan argumen x

x{ }\0berlaku {}pada 0 xwaktu, menjaga hasil menengah

(1+) adalah fungsi penerus

{ }(1+)/x+1menerapkan fungsi penerus mulai dari x+1hingga {}pengembalian benar

10\x adalah angka desimal dari x

a: menetapkan ke a

|\ adalah pemindaian maksimum (sebagian maksimum) dari a

&\ analognya, adalah min-scan

a~|\atidak acocok dengan pemindaian maksimalnya?

| atau

a~&\a itu min-scan?

+/ jumlah


4

JavaScript (ES6), 77 byte

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)

Cobalah online!

Berkomentar

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 byte

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

Cobalah online

Fungsi ini menentukan apakah suatu angka melenting:

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

Anda dapat membandingkan karakter secara langsung. Bahkan, pemahaman set Anda bisa menjadi set(map(cmp,`x`[:-1],`x`[1:])).
Jakob

@ Jakob Terima kasih. Saya selalu lupa Anda bisa menggunakan mapcara itu.
mbomb007

1
x=s=0\nwhile n:b={-1,1}<=set(map(cmp,`x`[:-1],`x`[1:]));s+=x*b;n-=b;x+=1menghemat 3 byte
Mr. Xcoder


3

Retina , 93 byte

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

Cobalah online! Penjelasan:

K`:

Inisialisasi s=i=0. ( sadalah jumlah #s sebelum :, ijumlah #s setelah.)

"$+"{
...
)`

Ulangi nkali.

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

Ulangi saat itidak melenting.

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

Tambahkan idan buat salinan dalam desimal.

\d
*_;

Ubah digit salinan menjadi unary. Tes bounciness menggunakan salinan unary, jadi itu hanya berfungsi sekali itelah ditambahkan setidaknya satu kali.

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

Tambahkan ike sdan hapus salinan digit unary, sehingga untuk lulus berikutnya dari loop batin tes bounciness gagal dan iakan bertambah setidaknya satu kali.

\G#

Konversikan ske desimal.

Versi 121 byte menghitung dalam desimal, jadi mungkin berfungsi untuk nilai yang lebih besar dari n:

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

Cobalah online! Penjelasan:

K`0:0

Inisialisasi s=i=0.

"$+"{
...
)`

Ulangi nkali.

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

Ulangi saat itidak melenting.

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

Tambahkan idan buat salinan.

+`;\d
;$&*_;

Ubah digit salinan menjadi unary. Tes bounciness menggunakan salinan unary, jadi itu hanya berfungsi sekali itelah ditambahkan setidaknya satu kali.

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

Tambahkan ike sdan hapus salinan digit unary, sehingga untuk lulus berikutnya dari loop batin tes bounciness gagal dan iakan bertambah setidaknya satu kali.

:.*

Hapus i.


3

05AB1E , 12 byte

µN{‚Nå_iNO¼

Cobalah online!

Penjelasan

µ              # 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, 114 112 byte

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

Menggunakan ekspresi reguler untuk memeriksa apakah angkanya meningkat atau menurun. Cobalah online di sini .

Tidak Disatukan:

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 byte

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

Selamat datang! Anda mungkin ingin melihat halaman ini untuk Kiat
Bermain

1
Saya sarankan menggunakan ;untuk meletakkan sebanyak mungkin pernyataan pada satu baris, menghapus spasi, dan mendefinisikan fungsi untuk 2 baris panjang yang sangat mirip, sehingga Anda dapat menggunakan kembali beberapa kode. Anda juga dapat melakukan a=b=s=0dan len(g)!=h-1!=len(d).
mbomb007

Terima kasih atas tipsnya. Saya harus pergi sekarang. tapi saya akan mengerjakannya nanti.
Hashbrowns


0

Merah , 108 byte

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]

Cobalah online!

Lebih mudah dibaca:

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
]

Peluang yang baik untuk digunakan form- form iadalah 5 byte lebih pendek darito-string i


0

MATL , 31 30 byte

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

Cobalah 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

0

R , 96 byte

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}

Cobalah online!

Penjelasan:

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

Ruby (123 byte)

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

Terlihat sangat jelek bagiku. Bounciness didefinisikan dalam blok inix.sort!=x&&x.sort!=x.reverse



0

C (gcc), 104 byte

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

Cobalah online di sini .

Tidak Disatukan:

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
}

Sarankan u+=!y?--b,o:0,++oalih-alih u+=y?0:o+0*--b,++o, ;y&=(c-=n%10)<0?:c?2:y)c=n%10,n/=10;alih-alih;)c=n%10,n/=10,y&=(c-=n%10)<0?:c?2:y;
ceilingcat
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.