Cetak buklet


39

Membaca buku itu mudah, tetapi mencetak buku bisa sedikit rumit. Saat mencetak buklet, printer harus mengatur halaman dengan cara tertentu agar dapat dibaca dari kiri ke kanan. Cara ini dilakukan adalah dengan menggunakan pola seperti di bawah ini

n, 1, 2, n-1, n-2, 3, 4, n-3, n-4, 5, 6, n-5, n-6, 7, 8, n-7, n-8, 9, 10, n-9, n-10, 11, 12, n-11…

Uji Kasus

Buklet 4 halaman: 4, 1, 2, 3

Buklet 8 halaman: 8,1,2,7,6,3,4,5

Buklet 12 halaman: 12,1,2,11,10,3,4,9,8,5,6,7

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

Buklet 20 halaman: 20,1,2,19,18,3,4,17,16,5,6,15,14,7,8,13,12,9,10,11

Tugas

Tugas Anda adalah, mengingat bilangan bulat nyang merupakan kelipatan dari 4, menampilkan array angka yang dapat digunakan untuk mencetak buku nhalaman.

Catatan: Selama output menghasilkan angka yang benar, baik dibatasi oleh spasi, koma, tanda hubung, atau tanda kurung, metode apa pun untuk mendapatkan solusi dapat digunakan

Ini adalah pertanyaan sehingga jawaban akan dinilai dalam byte, dengan kemenangan paling sedikit.


Apakah kami dijamin bahwa input akan selalu dapat dibagi dengan 4 atau bahkan nomor genap? Apa pun itu, bisakah Anda menambahkan beberapa lagi test case? Dan selamat datang di PPCG :)
Shaggy

8
Selamat datang di PPCG dan tantangan pertama yang menyenangkan! Perhatikan bahwa kami merekomendasikan mengusulkan tantangan baru di kotak pasir sebelum mempostingnya.
Oliver Ni

1
Masukan Anda harus berupa kelipatan 4
tisaconundrum

1
Akan menyenangkan (tapi mungkin sepele) untuk mendukung nilai apa pun, mengisi dengan halaman kosong jika diperlukan (tantangan lain, mungkin?)
Barranka

1
Bisakah kita membatasi array dengan spasi, tanda hubung, atau pembatas lainnya, bukan koma?
TehPers

Jawaban:


8

05AB1E , 9 8 7 byte

L`[Žˆrˆ

Cobalah online!

Penjelasan

L           # push range [1 ... input]
 `          # split as separate to stack
  [Ž        # loop until stack is empty
    ˆ       # add top of stack to global list
     r      # reverse stack
      ˆ     # add top of stack to global list
            # implicitly display global list

13

JavaScript (ES6), 49 45 byte

Disimpan 4 byte dengan bantuan dari @RickHitchcock

f=(n,k=1)=>n<k?[]:[n,k,k+1,n-1,...f(n-2,k+2)]

Demo


Non-rekursif, 51 byte

n=>[...Array(n)].map((_,i)=>[2*n-i,,++i][i&2]+1>>1)

Demo


47 byte: f=(n,a=1)=>n<a+3?[]:[n,a,a+1,n-1,...f(n-2,a+2)]
Rick Hitchcock

1
@RickHitchcock n<asebenarnya cukup, jadi itu 4 byte yang disimpan. Terima kasih!
Arnauld

6

Python 2, 99 93 88 58 56 55 bytes

f=input()
for i in range(1,f/2,2):print-~f-i,i,i+1,f-i,

Cobalah online!

-6 byte dengan menghapus indentasi yang tidak dibutuhkan, terima kasih Oliver Ni

-5 byte dengan mengubah kondisional, terima kasih Luis Mendo

-30 byte dengan mengoptimalkan pernyataan cetak, terima kasih Arnold Palmer

-2 byte dengan meletakkan loop pada satu baris, terima kasih nedla2004

-1 byte dengan melakukan beberapa sihir, terima kasih Pak Xcoder


Simpan byte dengan menggunakan 1 spasi, bukan 4.
Oliver Ni

Oh ya, aku selalu lupa tentang itu. Terima kasih.
LyricLy

1
-29 byte menggunakan lambda(walaupun ini mungkin cukup berbeda untuk menjamin jawaban yang terpisah).
notjagan

@ notjagan Silakan dan poskan sendiri jika Anda mau.
LyricLy

58 byte dengan mengubah cetak Anda sedikit saja. Sekarang mencetak f-i+1,i,i+1,f-idi setiap loop bukannya mencetak nilai terakhir dengan syarat. Ini juga memungkinkan menghapus inisial print f,.
Arnold Palmer

6

Python 2 , 46 byte

lambda n:map(range(1,n+1).pop,n/4*[-1,0,0,-1])

Cobalah online!

Menghasilkan kisaran [1..n]dan muncul dari depan dan belakang dalam pola berulangback, front, front, back, ...


Python 2 , 49 byte

f=lambda n,k=1:n/k*[0]and[n,k,k+1,n-1]+f(n-2,k+2)

Cobalah online!

Menghasilkan 4 elemen pertama, kemudian secara rekursif berlanjut dengan nilai atas nmenurun 2 dan nilai lebih rendah kmeningkat 2.


Python 2 , 49 byte

lambda n:[[n-i/2,i/2+1][-i%4/2]for i in range(n)]

Cobalah online!

Langsung menghasilkan nilai ike-10 dari daftar, menggunakan -i%4/2sebagai Boolean untuk apakah akan mengambil nilai yang lebih rendah atau lebih tinggi.



5

MATL , 19 17 10 byte

:t"0&)@o?P

Cobalah online!

Penjelasan

:          % Implicitly input n. Push range [1 2 ... n]
t          % Duplicate
"          % For each (that is, do n times)
  0&)      %   Push last element, and then subarray with remaining elements
  @        %   Push 1-based iteration index
  o?       %   Is it odd? If so
    P      %     Reverse subarray of remaining elements
           %   Implicit end
           % Implicit end
           % Implicitly display stack

5

Jelly ,  12  11 byte

Ditingkatkan menjadi 11 byte, "Metode Kombinasi":

9Bṁ×ḶṚÆ¡‘Œ?

Cobalah online!

Bagaimana?

Ini menggunakan perhitungan permutasi dan sistem bilangan faktorial:

9Bṁ×ḶṚÆ¡‘Œ? - Link n                        e.g. 16
9B          - nine in binary                     [1,0,0,1]
  ṁ         - mould like n                       [1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1]
    Ḷ       - lowered range(n)                   [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
   ×        - multiply                           [0,0,0,3,4,0,0,7,8,0,0,11,12,0,0,15]
     Ṛ      - reverse                            [15,0,0,12,11,0,0,8,7,0,0,4,3,0,0,0]
      Æ¡    - convert from factorial base        19621302981954 (=15*15!+12*12!+...+3*3!)
        ‘   - increment                          19621302981955 (we actually wanted 1*0! too)
         Œ? - shortest permutation of natural numbers [1,2,...] that would reside at that
            -   index in a sorted list of all permutations of those same numbers
            -                                    [16,1,2,15,14,3,4,13,12,5,6,11,10,7,8,9]

12 byter yang tidak ditingkatkan, "Pola Rajutan":

RṚ‘żRs2Z€FḊṁ

Cobalah online!

Bagaimana?

Ini adalah pendekatan sederhana, itu menciptakan dua helai, interleave mereka dan kemudian memotong ujung yang longgar:

RṚ‘żRs2Z€FḊṁ - Link: n                      e.g. 8
R            - range(n)                          [1,2,3,4,5,6,7,8]
 Ṛ           - reverse                           [8,7,6,5,4,3,2,1]
  ‘          - increment                         [9,8,7,6,5,4,3,2]
    R        - range(n)                          [1,2,3,4,5,6,7,8]
   ż         - zip (interleave)                  [[9,1],[8,2],[7,3],[6,4],[5,5],[4,6],[3,7],[2,8]]
     s2      - split into chunks of length 2     [[[9,1],[8,2]],[[7,3],[6,4]],[[5,5],[4,6]],[[3,7],[2,8]]]
       Z€    - transpose €ach (cross-stitch?!)   [[[9,8],[1,2]],[[7,6],[3,4]],[[5,4],[5,6]],[[3,2],[7,8]]]
         F   - flatten                           [9,8,1,2,7,6,3,4,5,4,5,6,3,2,7,8]
          Ḋ  - dequeue (removes excess start)    [8,1,2,7,6,3,4,5,4,5,6,3,2,7,8]
           ṁ - mould like n (removes excess end) [8,1,2,7,6,3,4,5]

Ini adalah pintar. +1
Erik the Outgolfer

4

Oktaf , 43 36 byte

Port jawaban ini dalam C (gcc) dapat ditemukan di sini .

@(n)[n-(k=1:2:n/2)+1;k;k+1;n-k](:)';

Penjelasan

  1. k=1:2:n/2: Menghasilkan urutan linear dari 1 hingga n/2pada langkah 2. Perhatikan bahwa ini segera digunakan pada langkah berikutnya.
  2. [n-k+1;k;k+1;n-k]: Menciptakan 4 baris matriks sehingga baris pertama menciptakan urutan n, n-2, n-4...ke bawah n-(n/2)+2, baris kedua 1, 3, 5...hingga n/2 - 1, baris ketiga adalah baris kedua yang ditambahkan oleh 1 dan baris keempat adalah baris pertama yang ditambahkan oleh 1.
  3. [n-k+1;k;k+1;n-k](:)': Ini menumpuk semua kolom matriks ini bersama-sama dari kiri ke kanan untuk membuat vektor kolom tunggal, dan kami memindahkannya ke vektor baris untuk tampilan yang mudah. Susun kolom bersama-sama dengan cara ini justru menciptakan urutan yang diinginkan.

Perhatikan bahwa ini adalah fungsi anonim, sehingga Anda dapat menetapkannya ke variabel sebelum menggunakannya, atau Anda dapat menggunakan ansvariabel bawaan yang akan dibuat setelah membuat fungsi.

Cobalah online!


1
Hai, saya pikir Anda bahkan dapat mempersingkatnya dengan menjadikannya fungsi anonim, jadi Anda tidak perlu memanggil input. Lihat tautan ini: gnu.org/software/octave/doc/v4.0.3/…
Michthan

1
@Michthan Benar. Saya awalnya melakukannya dengan cara itu karena kode lebih dari satu pernyataan. Saya mengambil celah lain sehingga menghapus panggilan ke inputdan saya menyalahgunakan sintaks sedikit lebih dengan menyimpan basis vektor incremental ketika saya sedang membuat baris pertama dan mengambil input ndari input fungsi anonim yang sebenarnya itu sendiri sehingga saya sekarang dapat memasukkannya ke dalam satu pernyataan. Terima kasih!
rayryeng

3

R , 48 byte (ditingkatkan)

Terima kasih kepada @Giuseppe untuk -7 byte!

n=scan();(x=order(1:n%%2))[order(-(n/2+.5-x)^2)]

Kuncinya adalah yang x=1:n;x[order(x%%2)]setara dengan order(1:n%%2).

Cobalah online!

R , 55 byte (asli)

Golf

n=scan();x=1:n;x=x[order(x%%2)];x[order(-(n/2+.5-x)^2)]

Tidak dikoleksi dengan komentar

Baca ndari stdin.

n=scan()

Tetapkan xsebagai urutan halaman dari 1 hingga n.

x=1:n

Pesan halaman bahkan halaman sebelum halaman tidak rata.

x=x[order(x%%2)]

Pesan halaman dengan urutan menurun sesuai dengan bagian tengah buku yang dihitung oleh n/2+.5.

x[order(-(n/2+.5-x)^2)]

Contoh dengan 8 halaman:

  • center adalah 4,5;
  • halaman 1 dan 8 adalah yang paling jauh dari pusat, tetapi 8 menjadi yang utama karena 8 adalah genap;
  • halaman 2 dan 7 adalah yang paling jauh berikutnya dari pusat, tetapi 2 datang lebih dulu karena 2 adalah genap;
  • dan seterusnya.

Cobalah online!


1
bagus, jauh lebih baik daripada solusi saya (dicuri)
Giuseppe


1
Triknya memperhatikan bahwa (1:n)[order(1:n%%2)]itu sama denganorder(1:n%%2)
Giuseppe

2

Mathematica, 54 53 45 byte

Join@@Range[#][[(-1)^k{k,-k}]]~Table~{k,#/2}&

Penjelasan

Join@@Range[#][[(-1)^k{k,-k}]]~Table~{k,#/2}&  (* Input: # *)
                              ~Table~{k,#/2}   (* Iterate from k=1 to #/2 *)
      Range[#][[            ]]                 (* From {1..#}, take... *)
                      {k,-k}                   (* k-th and negative k-th element *)
                                               (* negative k-th = k-th from the end *)
                (-1)^k                         (* Reversed for odd k *)
Join@@                                         (* Join the result *)


2

Haskell, 42 byte

n#a|n<a=[]|x<-n-2=n:a:a+1:n-1:x#(a+2)
(#1)

Cobalah online!

Satu byte lagi:

Haskell, 43 byte

f n=[1,3..div n 2]>>= \x->[n-x+1,x,x+1,n-x]

2

Java 8, 84 72 byte

n->{for(int j=0;++j<n;System.out.printf("%d,%d,%d,%d,",n--,j++,j,n--));}

atau

n->{for(int j=0;++j<n;System.out.print(n--+","+j+++","+j+","+n--+","));}

-12 byte berkat komentar @TheLethalCoder pada jawaban C #.

Jawaban lama (84 byte):

n->{int r[]=new int[n],i=1,N=n,J=1;for(r[0]=n;i<n;r[i]=-~i++%4<2?J++:--N);return r;}

Penjelasan:

Coba di sini.

n->{                  // Method with integer parameter and no return-type
  for(int j=0;++j<n;  //  Loop from 1 to `n` (exclusive)
    System.out.printf("%d,%d,%d,%d,",n--,j++,j,n--)
                      //   Print four numbers simultaneously
  );                  //  End of loop
}                     // End of method


1

Swift 3 , 74 byte

func g(f:Int){for i in stride(from:1,to:f/2,by:2){print(f-i+1,i,i+1,f-i)}}

Cobalah online!

Swift 3 , 60 byte

{f in stride(from:1,to:f/2,by:2).map{(f-$0+1,$0,$0+1,f-$0)}}

Untuk beberapa alasan, ini tidak berfungsi di lingkungan online yang saya coba sejauh ini. Jika Anda ingin mengujinya, menempatkan var g=di depannya, dan menyebutnya dengan print(g(12))di Xcode (Taman bermain) .

Ini adalah gambar setelah saya menjalankannya di taman bermain Xcode, versi 8.3.1 (Running Swift 3.1):

masukkan deskripsi gambar di sini


1

QBIC , 25 byte

[1,:/2,2|?b-a+1,a,1+a,b-a

Meskipun inputnya adalah% 4, ritme sebenarnya adalah berbasis 2.

Penjelasan

[1,:/2,2|   FOR ( b=1; b <= <input>/2; b=b+2)               
?           PRINT
 b-a+1,     n
 a,         1
 1+a,       2
 b-a        n-1


1

cQuents , 21 byte

=n::n-z+1,z+1,x-1,z-1

Cobalah online!

Penjelasan

                            Implicit input n
=n                          First item in the sequence is n
  ::                        Mode :: (Sequence 2): print sequence from 1 to n
                            Comma delimited items are rotated through
    n-z+1,                    n - previous + 1
          z+1,                previous + 1
              x-1,            third-previous - 1
                  z-1         previous - 1

1

R , 64 60 byte

Sangat dikalahkan oleh djhurio ! Jawabannya cukup elegan, jawablah.

n=scan();matrix(c(n-(k=seq(1,n/2,2))+1,k,k+1,n-k),4,,T)[1:n]

Port dari Oktaf jawaban rayryeng .

Cobalah online!

solusi asli (64 byte):

f=function(n,l=1:n)`if`(n,c(l[i<-c(n,1,2,n-1)],f(n-4,l[-i])),{})

Fungsi rekursif.

Cobalah online!


Pertama kali seseorang menggunakan jawaban saya sebagai inspirasi. Terima kasih :)
rayryeng

1
Sulit untuk mengalahkan Anda, tetapi saya berhasil dengan jawaban 55 byte ( codegolf.stackexchange.com/a/138045/13849 ).
djhurio

1

Bash + Perl + Groff + Psutils, 48 ​​byte

perl -nE'say".bp
"x--$_'|groff|psbook>/dev/null

Memperlihatkan output aktif stderr. Output berisi beberapa trailing sampah.

Contoh penggunaan:

$ echo 20 | perl -nE'say".bp
> "x--$_'|groff|psbook>/dev/null
[20] [1] [2] [19] [18] [3] [4] [17] [16] [5] [6] [15] [14] [7] [8] [13] [12] 
[9] [10] [11] Wrote 20 pages, 4787 bytes

0

Pyth , 21 20 byte

sm[hK-QddhdK):1/Q2 2

Test Suite.

Jika mengeluarkan sebagai daftar bersarang diperbolehkan:

Pyth , 20 19 byte

m[hK-QddhdK):1/Q2 2

Test Suite.


Penjelasan

sm [hK-QddhdK): 1 / Q2 2 - Program lengkap.

 m: 1 / Q2 2 - Peta over range (1, input () / 2,2) dengan variabel d.
  [) - Buat daftar dengan:
   hK-Qd - Input - d +1,
        DD,
         hd - d + 1 dan
           K - Input - d.
s - Meratakan daftar dan mencetak secara implisit.


0

C #, 107 byte

int[]F(int p){var a=new int[p];for(int i=0,q=1;q<p;a[i++]=p--){a[i++]=p--;a[i++]=q++;a[i++]=q++;}return a;}

Simpan dua penghitung, satu mulai dari 1, satu di p. Di setiap iterasi loop, tulis empat elemen dan hitung saja kenaikan atau penurunan setelah setiap entri. Ketika penghitung bertemu di tengah, berhenti.

int[] F(int p)
{
    var a = new int[p];
    for(int i = 0, q = 1; q < p; a[i++] = p--)
    {
        a[i++] = p--;
        a[i++] = q++;
        a[i++] = q++;
    }
    return a;
}

Anda dapat menyimpan beberapa byte dengan menempatkan metode dalam delegasi. Kode Anda kemudian akan terlihat seperti ini :, p=>{var a=new int[p];for(int i=0,q=1;q<p;a[i++]=p--){a[i++]=p--;a[i++]=q++;a[i++]=q++;}return a;};dengan System.Func<int, int[]> f =tidak memasukkannya ke dalam bytecount. Anda juga dapat menambahkan tautan ke TIO, yang sangat berguna ketika mencoba mengizinkan orang untuk mencoba kode Anda sendiri!
Ian H.

@IanH. Saat menggunakan lambda, semi kolon trailing dapat dihilangkan.
TheLethalCoder

Inisialisasi qke 0dan pra kenaikan di q<p-> ++q<pdan kemudian hapus kenaikan pos kedua untuk menyimpan byte. Pindahkan kedua pernyataan trailing loop ke tahap terakhir dari for loop sehingga Anda dapat menghapus kurung kurawal.
TheLethalCoder

2
Jika koma trailing dibolehkan, karya berikut ini untuk 71 byte p=>{for(int q=0;++q<p;)System.Console.Write(p--+$",{q++},{q},{p--},");}. TIO.
TheLethalCoder


0

Pyth , 27 24 23 byte

-3 byte dengan mencetak sepanjang alih-alih pada akhirnya.

-1 Terima kasih kepada Tn. Xcoder

V:1/Q2 2pjd[-QtNNhN-QNk

Cobalah online!

Atau di Compiler / Executor online

Ini adalah program nyata pertama saya di Pyth, jadi mungkin ada metode yang lebih baik yang tidak saya ketahui.

Penjelasan

V:1/Q2 2pjd[-QtNNhN-QNk
V:1/Q2 2                   # For N in range(1, Q/2, 2):
        pjd                # print " ".join(...),
           [-QtNNhN-QNk    # The list [n - (N-1), N, N + 1, n - N, ""] (n is input)

Saya menemukan beberapa perbaikan , dan memutuskan mereka pantas mendapatkan jawaban mereka sendiri.
Tn. Xcoder

By the way, ganti FNdengan Vuntuk -1 byte
Tn. Xcoder

0

C ++ (gcc) , 89 84 68 byte

Sebagai lambda generik yang tidak disebutkan namanya. nadalah #halaman (% 4 == 0) dan Cmerupakan parameter referensi untuk hasilnya, wadah kosong seperti vector<int>(hanya push_backdiperlukan).

[](int n,auto&C){for(int i=0,j=0;i<n;C.push_back(++j%4<2?n--:++i));}

solusi sebelumnya:

#define P C.push_back(
[](int n,auto&C){for(int i=0;i<n;P n--),P++i),P++i),P n--));}

Cobalah online!

Sedikit tidak berbulu:

auto f=
[](int n,auto&C){
 for(int i=0,j=0;
     i<n;
     C.push_back(++j%4<2 ? n-- : ++i));
}

solusi sebelumnya sedikit tidak diserang :

auto f=
[](int n, auto&C){
 for(
  int i=0;
  i<n;
   P n--),
   P++i),
   P++i),
   P n--)
 );
}
;

Itu cukup mudah dikembangkan dan ada beberapa optimisasi kecil di aritmatika.

  • Sunting1: penyatuan aritmatika disimpan 5 byte
  • Sunting2: setelah penyatuan 4 langkah digabungkan

Pemakaian:

std::vector<int> result;
f(n, result);

Print-Variant, 77 byte ketinggalan zaman

Jika Anda bersikeras mencetak nilai, ada solusi ini:

[](int n,auto&o){for(int i=0;i<n;o<<n--<<' '<<++i<<' '<<++i<<' '<<n--<<' ');}

Di mana oyang Anda inginkan std::ostream, sepertistd::cout

Penggunaan (jika 2nd lambda ditugaskan ke g):

g(n, std::cout);


0

Lua, 94 byte

Untuk tantangan ini saya benar-benar datang dengan 2 metode berbeda yang keduanya 94 byte.

Metode 1:

function f(n,i)i=i or 1 return n>i and('%s,%s,%s,%s,%s'):format(n,i,i+1,n-1,f(n-2,i+2))or''end

Kode yang dikomentari:

function f(n,i)
  i=i or 1
  -- On the first iteration i will be nil so I'm setting it's value to 1 if it is.

  return n>i and ('%s,%s,%s,%s,%s'):format(n,i,i+1,n-1,f(n-2,i+2)) or ''
  -- Here i return a ternary statement
  -- If n>i is true, it will return a string using string.format() and part of this is recursion
  -- If it's false, it will just return an empty string
end

Metode 2:

function f(n,i)i=i or 1 return n>i and n..','..i..','..i+1 ..','..n-1 ..','..f(n-2,i+2)or''end

Metode ini mirip dengan metode pertama namun saya malah mengembalikan string gabungan daripada string.format ()

Dalam kedua metode saya telah menggunakan konsep n dan saya semakin dekat bersama


0

PHP, 51 +1 byte

while($i<$k=&$argn)echo$k--,_,++$i,_,++$i,_,$k--,_;

mencetak nomor halaman yang dipisahkan oleh garis bawah dengan pembatas trailing.
Jalankan sebagai pipa dengan -nRatau coba online .


0

J , 22 byte

($,)_2|.`]\1+],@,.&i.-

Cobalah online!

Penjelasan

($,)_2|.`]\1+],@,.&i.-  Input: integer n
             ]          Identity
                     -  Negate
                  &i.   Form the ranges [0, 1, ..., n-1] and [n-1, ..., 1, 0]
                ,.      Interleave
              ,@        Flatten
           1+           Add 1
    _2    \             For each non-overlapping sublist of size 2
        `                 Cycle between these two operations
      |.                    Reverse for the first, third, ...
         ]                  Identity for the second, fourth, ...
  ,                     Flatten
 $                      Reshape to length n
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.