Kisaran inkremental!

14

Tugas Anda adalah, diberi dua bilangan bulat positif, x dan n , mengembalikan angka x pertama dalam urutan rentang kenaikan.

Urutan berbagai tambahan pertama menghasilkan berkisar dari satu sampai n inklusif. Misalnya, jika n adalah 3 , itu akan menghasilkan daftar [1,2,3] . Kemudian berulang kali menambahkan n nilai terakhir yang ditambahkan oleh 1 ke daftar yang ada, dan melanjutkan.

Masukan n=3 misalnya:

n=3
1. Get range 1 to n. List: [1,2,3]
2. Get the last n values of the list. List: [1,2,3]. Last n=3 values: [1,2,3].
3. Increment the last n values by 1. List: [1,2,3]. Last n values: [2,3,4].
4. Append the last n values incremented to the list. List: [1,2,3,2,3,4]
5. Repeat steps 2-5. 2nd time repeat shown below.

2nd repeat:
2. Get the last n values of the list. List: [1,2,3,2,3,4]. Last n=3 values: [2,3,4]
3. Increment the last n values by 1. List: [1,2,3,2,3,4]. Last n values: [3,4,5].
4. Append the last n values incremented to the list. List: [1,2,3,2,3,4,3,4,5]

Kasus uji:

n,   x,   Output
1,  49,   [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49]
2, 100,   [1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,48,48,49,49,50,50,51]
3,  13,   [1,2,3,2,3,4,3,4,5,4,5,6,5]
Kamerad SparklePony
sumber

Jawaban:

8

Python 2 , 39 byte

lambda n,x:[v/n+v%n+1for v in range(x)]

Cobalah online!

Jonathan Allan
sumber
Juga bekerja di Python 3 dengan penggantian /dengan//
Nick Kennedy
7

Jelly , 4 byte

Ḷd§‘

Tautan diad menerima dua bilangan bulat positif, xdi kiri dan ndi kanan, yang menghasilkan daftar bilangan bulat positif.

Cobalah online!

Bagaimana?

Ḷd§‘ - Link: x, n              e.g   13, 3
Ḷ    - lowered range (x)             [0,1,2,3,4,5,6,7,8,9,10,11,12]
 d   - divmod (n)                    [[0,0],[0,1],[0,2],[1,0],[1,1],[1,2],[2,0],[2,1],[2,2],[3,0],[3,1],[3,2],[4,0]]
  §  - sums                          [0,1,2,1,2,3,2,3,4,3,4,5,4]
   ‘ - increment (vectorises)        [1,2,3,2,3,4,3,4,5,4,5,6,5]
Jonathan Allan
sumber
3
Tunggu ... apakah itu divmod? Pintar! Dan saya berjuang dengan p...
Erik the Outgolfer
6

R , 33 byte

function(n,x,z=1:x-1)z%%n+z%/%n+1

Cobalah online!

Solusi Python Port Jonathan Allan .

R , 36 byte

function(n,x)outer(1:n,0:x,"+")[1:x]

Cobalah online!

Solusi asli saya; menghasilkan matriks n×x dengan setiap kolom sebagai kenaikan, yaitu, 1n,2n+1, , kemudian mengambil entri x pertama (turun kolom).

Giuseppe
sumber
6

05AB1E , 6 byte

L<s‰O>

Port of @JonathanAllan menjawab Jelly , jadi pastikan untuk membatalkannya!

Input pertama adalah x , input kedua adalah n .

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

L       # Push a list in the range [1, (implicit) input]
        #  i.e. 13 → [1,2,3,4,5,6,7,8,9,10,11,12,13]
 <      # Decrease each by 1 to the range [0, input)
        #  → [0,1,2,3,4,5,6,7,8,9,10,11,12]
  s    # Divmod each by the second input
        #  i.e. 3 → [[0,0],[0,1],[0,2],[1,0],[1,1],[1,2],[2,0],[2,1],[2,2],[3,0],[3,1],[3,2],[4,0]]
    O   # Sum each pair
        #  → [0,1,2,1,2,3,2,3,4,3,4,5,4]
     >  # And increase each by 1
        #  → [1,2,3,2,3,4,3,4,5,4,5,6,5]
        # (after which the result is output implicitly)

Pendekatan awal saya sendiri adalah 8 byte :

LI∍εN¹÷+

Input pertama adalah n , input kedua adalah x .

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

L         # Push a list in the range [1, (implicit) input]
          #  i.e. 3 → [1,2,3]
 I       # Extend it to the size of the second input
          #  i.e. 13 → [1,2,3,1,2,3,1,2,3,1,2,3,1]
   ε      # Map each value to:
    N¹÷   #  The 0-based index integer-divided by the first input
          #   → [0,0,0,1,1,1,2,2,2,3,3,3,4]
       +  #  Add that to the value
          #   → [1,2,3,2,3,4,3,4,5,4,5,6,5]
          # (after which the result is output implicitly)
Kevin Cruijssen
sumber
4

Perl 6 , 18 byte

{(1..*X+ ^*)[^$_]}

Cobalah online!

Fungsi kari f(x)(n).

Penjelasan

{                }  # Anonymous block
      X+     # Cartesian product with addition
  1..*       # of range 1..Inf
         ^*  # and range 0..n
 (         )[^$_]  # First x elements
nwellnhof
sumber
4

Brain-Flak , 100 byte

(<>)<>{({}[()]<(({}))((){[()](<{}>)}{}){{}{}<>(({})<>)(<>)(<>)}{}({}[()]<(<>[]({}())[()]<>)>)>)}{}{}

Dengan komentar dan pemformatan:

# Push a zero under the other stack
(<>)<>

# x times
{
    # x - 1
    ({}[()]<

        # Let 'a' be a counter that starts at n
        # Duplicate a and NOT
        (({}))((){[()](<{}>)}{})

        # if a == 0
        {
            # Pop truthy
            {}
            <>

            # Reset n to a
            (({})<>)

            # Push 0 to each
            (<>)(<>)
        }

        # Pop falsy
        {}

        # Decrement A, add one to the other stack, and duplicate that number under this stack
        ({}[()]<
            (<>[]({}())<>)
        >)
    >)
}

Cobalah online!

DJMcMayhem
sumber
4

J , 13 12 byte

[$[:,1++/&i.

Cobalah online!

bagaimana

Kita ambil xsebagai arg kiri, nsebagai kanan. Mari kita ambil x = 8dan n = 3untuk contoh ini:

  • +/&i.: Transform kedua args dengan membuat rentang integer i., yaitu arg kiri menjadi 0 1 2 3 4 5 6 7dan arg kanan menjadi 0 1 2. Sekarang kita membuat "tabel tambahan +/dari keduanya:

     0 1 2
     1 2 3
     2 3 4
     3 4 5
     4 5 6
     5 6 7
     6 7 8
     7 8 9
    
  • 1 +: Tambahkan 1 ke setiap elemen tabel ini:

     1 2  3
     2 3  4
     3 4  5
     4 5  6
     5 6  7
     6 7  8
     7 8  9
     8 9 10
    
  • [: ,: Ratakan ,:

     1 2 3 2 3 4 3 4 5 4 5 6 5 6 7 6 7 8 7 8 9 8 9 10
    
  • [ $: Membentuknya $sehingga memiliki jumlah elemen yang sama dengan arg asli, yang tidak ditransformasi [, yaitu x:

     1 2 3 2 3 4 3 4 
    
Jonah
sumber
1
Bagus! Alternatif 12 byte saya
Galen Ivanov
4

Oktaf , 25 byte

@(n,x)((1:n)'+(0:x))(1:x)

Fungsi anonim yang memasukkan angka ndan x, dan menghasilkan vektor baris.

Cobalah online!

Bagaimana itu bekerja

Pertimbangkan n=3dan x=13.

Kode (1:n)'memberikan vektor kolom

1
2
3

Kemudian (0:x)berikan vektor baris

0  1  2  3  4  5  6  7  8  9 10 11 12 13

Tambahannya (1:n)'+(0:x)adalah elemen-bijaksana dengan siaran, dan karenanya memberikan matriks dengan semua pasangan jumlah:

1  2  3  4  5  6  7  8  9 10 11 12 13 14
2  3  4  5  6  7  8  9 10 11 12 13 14 15
3  4  5  6  7  8  9 10 11 12 13 14 15 16

Pengindeksan dengan (1:x)mengambil xelemen pertama dari matriks ini dalam urutan linier kolom-utama (turun, lalu lintas), sebagai vektor baris:

1 2 3 2 3 4 3 4 5 4 5 6 5
Luis Mendo
sumber
3

Haskell , 31 byte

n#x=take x$[1..n]++map(+1)(n#x)

Cobalah online!

Ini mungkin jenis rekursi favorit saya. Kita mulai dengan nilai-nilai dari 1 hingga n dan kemudian menggabungkan nilai-nilai yang sama (melalui referensi-sendiri) +1. maka kita hanya mengambil nilai x pertama.

pengguna1472751
sumber
2

Keempat (gforth) , 34 byte

: f 0 do i over /mod + 1+ . loop ;

Cobalah online!

Penjelasan Kode

: f            \ start a new word definition
  0 do         \ start a loop from 0 to x-1
    i          \ put the current loop index on the stack
    over       \ copy n to the top of the stack
    /mod       \ get the quotient and remainder of dividing i by n
    + 1+       \ add them together and add 1
    .          \ output result
  loop         \ end the counted loop
;              \ end the word definition
reffu
sumber
2

MATL , 16 , 10 byte

:!i:q+2G:)

Cobalah online!

-6 byte disimpan berkat Guiseppe dan Luis Mendo!

Penjelasan:

:!          % Push the array [1; 2; ... n;]
  i:q       % Push the array [0 1 2 ... x - 1]
     +      % Add these two arrays with broadcasting
      2G    % Push x again
        :)  % Take the first x elements
DJMcMayhem
sumber
@LuisMendo Terima kasih! Jelas, saya cukup berkarat dengan MATL saya :)
DJMcMayhem
2

Gaia , 8 byte

…@┅+‡t_<

Cobalah online!

Apakah pada dasarnya hal yang sama dengan jawaban Oktaf dan MATL .

Giuseppe
sumber
1

Ruby , 32 byte

->n,x{(0...x).map{|i|i/n+i%n+1}}

Cobalah online!

Nilai Tinta
sumber
1

Stax , 6 byte

⌐çYæ▄9

Jalankan dan debug itu

Dibongkar & dijelaskan:

rmx|%+^ Full program, implicit input (n, x on stack; n in register X)
r       Range [0 .. x)
 m      Map:
  x|%     Divide & modulo x
     +    Add quotient and remainder
      ^   Add 1
          Implicit output
wastl
sumber
0

Alchemist , 77 byte

_->In_n+In_x
x+n+0y+0z->a+Out_a+Out_" "+m+y
y+n->n
y+0n->z
z+m+a->z+n
z+0m->a

Cobalah online!

Tambahkan dan hasilkan penghitung n kali, lalu kurangi n-1 sebelum diulang.

Nitrodon
sumber
0

Arang , 18 byte

NθFN⊞υ⊕⎇‹ιθι§υ±θIυ

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Saya memiliki mimpi untuk menyemai daftar dengan rentang indeks-nol dan kemudian mengirisnya lagi tapi itu sebenarnya 2 byte lebih lama. Penjelasan:

Nθ                  Input `n` into variable
   N                Input `x`
  F                 Loop over implicit range
         ι          Current index
        ‹           Less than
          θ         Variable `n`
       ⎇   ι        Then current index else
               θ    Variable `n`
              ±     Negated
            §υ      Cyclically indexed into list
      ⊕             Incremented
    ⊞υ              Pushed to list
                Iυ  Cast list to string for implicit output
Neil
sumber
0

JS, 54 byte

f=(n,x)=>Array.from(Array(x),(_,i)=>i+1-(i/n|0)*(n-1))

Cobalah online!

pengguna2657799
sumber
Selamat datang di PPCG :) Karena ini bukan fungsi rekursif, Anda tidak perlu menghitung f=. Anda dapat menyimpan satu byte dengan mengeringkan parameter ( n=>x=>) dan lainnya dengan menyebarkan & memetakan array ( [...Array(x)].map()).
Shaggy
0

C (gcc) , 49 44 byte

Menggunakan rekursi untuk menghemat beberapa byte.

f(n,x){x&&printf("%d ",x%n+x/n+1,f(n,--x));}

Cobalah online!

ErikF
sumber
0

C (dentang), 843 byte

#include <stdlib.h>
main(int argc, char* argv[]){
        int x,n;
        if (argc == 3 && (n = atoi(argv[1])) > 0 && (x = atoi(argv[2])) > 0){ 
                int* ranges = calloc(x, sizeof *ranges);
                for (int i = 0; i < x; i++){
                        if (i < n){ 
                                ranges[i] = i+1;
                        }   
                        else {
                                ranges[i] = ranges[i-n] + 1;
                        }   
                }   
        printf("[");
        for (int j = 0; j < x - 1; j++){
                printf("%d",ranges[j]);
                printf(",");
        }   
        printf("%d",ranges[x - 1]);
        printf("]\n");
        free(ranges);
        }   
        else {
                printf("enter a number greater than 0 for n and x\n");
        }   
}
SpaceRace
sumber
2
Hai, selamat datang di PPCG! Tantangan ini ditandai [kode-golf], yang berarti Anda harus menyelesaikan tantangan dalam sesedikit mungkin byte / karakter. Anda dapat menghapus banyak spasi putih, dan mengubah nama variabel menjadi karakter tunggal dalam kode Anda (the argc, argvdan ranges). Juga, tidak perlu menambahkan pesan peringatan .. Anda dapat menganggap input tersebut valid, kecuali jika tantangan mengatakan sebaliknya.
Kevin Cruijssen