Bir kitapçık yazdır


39

Bir kitabı okumak kolaydır, ancak bir kitabı yazdırmak biraz zor olabilir. Bir kitapçık yazdırırken, yazıcının soldan sağa okunması için sayfaların belirli bir şekilde düzenlenmiş olması gerekir. Bunun yapılması, aşağıdaki gibi bir kalıp kullanmaktır

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…

Test Kılıfları

4 sayfa kitapçığı: 4, 1, 2, 3

8 sayfa kitapçığı: 8,1,2,7,6,3,4,5

12 sayfa kitapçığı: 12,1,2,11,10,3,4,9,8,5,6,7

16 sayfa kitapçığı: 16,1,2,15,14,3,4,13,12,5,6,11,10,7,8,9

20 sayfa kitapçığı: 20,1,2,19,18,3,4,17,16,5,6,15,14,7,8,13,12,9,10,11

Görev

Göreviniz n, 4 katı olan bir tamsayı verildiğinde, bir nsayfa kitabı yazdırmak için kullanılabilecek bir dizi sayının görüntülenmesidir .

Not: Çıktı doğru sayıları ürettiği sürece, boşluk, virgül, kısa çizgi veya parantez ile sınırlandırılmış olsun, çözüme ulaşmak için herhangi bir yöntem kullanılabilir

Bu bir sorusudur, bu yüzden cevaplar en az bayt kazanan, bayt cinsinden puanlanacaktır.


Girişin her zaman 4 veya hatta çift bir sayıya bölünebileceğini garanti ediyoruz? Her iki durumda da, birkaç test davası daha ekler misiniz lütfen? Ve PPCG'ye hoş geldin :)
Shaggy

8
PPCG'ye hoş geldiniz ve güzel bir ilk meydan okuma! Göndermeden önce sanal alanda yeni zorluklar önermenizi öneririz.
Oliver Ni,


1
Gerektiğinde boş sayfaları doldurmak (başka bir zorluk, belki de?) Herhangi bir değeri desteklemesi güzel (ama belki de önemsiz)
Barranka

1
Diziyi virgül yerine boşluk, kısa çizgi veya başka bir sınırlayıcıyla sınırlandırabilir miyiz?
TehPers

Yanıtlar:


8

05AB1E , 9 8 7 bayt

L`[Žˆrˆ

Çevrimiçi deneyin!

açıklama

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 bayt

@RickHitchcock yardımı ile 4 bayt kaydedildi

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

gösteri


Özyinelemeli olmayan, 51 bayt

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

gösteri


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

1
@RickHitchcock n<aaslında yeterli, bu yüzden 4 bayt kaydedildi. Teşekkürler!
Arnauld

6

Python 2, 99 93 88 58 56 55 bayt

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

Çevrimiçi deneyin!

Gereksiz girinti kaldırarak -6 bayt, teşekkürler Oliver Ni

Koşullu değiştirerek -5 bayt, teşekkürler Luis Mendo

-30 byte baskı deyimlerini optimize ederek, teşekkürler Arnold Palmer

Döngüyü bir satıra koyarak -2 bayt, teşekkürler nedla2004

Biraz büyücü yaparak -1 bayt, teşekkürler Bay Xcoder


4 yerine 1 boşluk kullanarak bayt kazanın.
Oliver Ni

Evet, bunu hep unutuyorum. Teşekkürler.
LyricLy

1
-29 bayt kullanarak lambda(bu ayrı bir cevabı garanti etmek için yeterince farklı olsa da).
notjagan

@ notjagan Devam edin ve isterseniz kendiniz gönderin.
LyricLy

Yazdırmanızı biraz değiştirerek 58 bayt . Artık f-i+1,i,i+1,f-ison değeri koşullu olarak yazdırmak yerine her döngüde yazdırıyor. Bu aynı zamanda ilkin kaldırılmasına da izin verdi print f,.
Arnold Palmer

6

Python 2,46 bayt

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

Çevrimiçi deneyin!

Aralığı oluşturur ve [1..n]yinelenen düzende önden ve arkadan çıkarback, front, front, back, ...


Python 2,49 bayt

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

Çevrimiçi deneyin!

İlk 4 elementi oluşturur, daha sonra tekrar tekrar üst değer n2 azalır ve alt değer k2 artar.


Python 2,49 bayt

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

Çevrimiçi deneyin!

Doğrudan düşük veya daha yüksek bir değer almak için Boole olarak ikullanarak listenin 'değerini oluşturur -i%4/2.



5

MATL , 19 17 10 bayt

:t"0&)@o?P

Çevrimiçi deneyin!

açıklama

:          % 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

Jöle ,  12  11 bayt

11 bayt, "Kombinatoryal Yöntemler" olarak geliştirildi:

9Bṁ×ḶṚÆ¡‘Œ?

Çevrimiçi deneyin!

Nasıl?

Bu, permütasyon hesaplamalarını ve faktörlü sayı sistemini kullanır:

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]

Geliştirilmemiş 12 byter, "Örgü Desenleri":

RṚ‘żRs2Z€FḊṁ

Çevrimiçi deneyin!

Nasıl?

Bu basit bir yaklaşımdır, iki tel oluşturur, onları birleştirir ve sonra gevşek uçları keser:

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]

Bu ise zeki. +1
Outgolfer Erik

4

Octave , 43 36 bayt

Bu cevabın bir portunu C (gcc) olarak burada bulabilirsiniz .

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

açıklama

  1. k=1:2:n/2: 1'den n/22'ye kadar olan adımlarda doğrusal bir dizi oluşturur . Bunun hemen bir sonraki adımda kullanıldığını unutmayın.
  2. [n-k+1;k;k+1;n-k]: 4 satırlık bir matris oluşturur; böylece ilk satır n, n-2, n-4...aşağı doğru diziyi oluşturur, n-(n/2)+2ikinci satır 1, 3, 5...kadar olur n/2 - 1, üçüncü satır 1 tarafından eklenen ikinci satır ve dördüncü satır 1 tarafından eklenen ilk satırdır.
  3. [n-k+1;k;k+1;n-k](:)': Bu, tek bir sütun vektörü oluşturmak için bu matrisin tüm sütunlarını soldan sağa birlikte istifler ve kolay görüntüleme için onu bir satır vektörüne dönüştürürüz. Sütunları birlikte bu şekilde istiflemek, tam olarak istenen diziyi oluşturur.

Bunun adsız bir işlev olduğunu unutmayın; bu nedenle, onu kullanmadan önce bir değişkene atayabilirsiniz veya ansişlevi oluşturduktan sonra oluşturulan yerleşik değişkeni kullanabilirsiniz .

Çevrimiçi deneyin!


1
Merhaba, anonim bir işlev yaparak onu kısaltabileceğinizi düşünüyorum, bu nedenle girişi çağırmanız gerekmez. Bu bağlantıya bakınız: gnu.org/software/octave/doc/v4.0.3/…
Michthan

1
@Michthan Doğru. Başlangıçta bu şekilde yaptım çünkü kod birden fazla ifadedi. Ona başka bir çatlak aldım, bu yüzden çağrıyı kaldırdım ve inputilk sırayı oluştururken ve nşimdiki anonim fonksiyon girişinin kendisinden girişi alarak asıl fonksiyon girişini alarak, sözdizimini biraz daha kötüye kullandım. bir açıklama. Teşekkürler!
rayryeng - Eski Monica

3

R , 48 bayt (geliştirilmiş)

-7 baytlık @Giuseppe'e teşekkürler!

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

İşin püf noktası buna x=1:n;x[order(x%%2)]eşdeğerdir order(1:n%%2).

Çevrimiçi deneyin!

R , 55 bayt (orijinal)

golfed

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

Yorumlarla Ungolfed

nStdin'den oku .

n=scan()

x1'den 1'e kadar olan sayfaların sırası olarak tanımlayın n.

x=1:n

Sayfaları sıralayın, böylece sayfalar bile düz olmayan sayfalardan önce olur.

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

Sayfaları, hesaplanan kitabın ortasına göre azalan sırayla sipariş edin n/2+.5.

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

8 sayfalık örnek:

  • merkez 4.5;
  • sayfalar 1 ve 8, merkezden en uzak yerler olsa da, 8 eşit olduğu için 8 önce gelir;
  • sayfa 2 ve 7, merkezden en uzak olanıdır, ancak 2, 2 olduğu gibi ilk sırada gelir;
  • ve bunun gibi.

Çevrimiçi deneyin!


1
güzel, benim (çalıntı)
Giuseppe


1
İşin püf (1:n)[order(1:n%%2)]noktası aynıydıorder(1:n%%2)
Giuseppe

2

Mathematica, 54 53 45 bayt

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

açıklama

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 bayt

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

Çevrimiçi deneyin!

Bir bayt daha uzun:

Haskell, 43 bayt

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

2

Java 8, 84 72 bayt

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

veya

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

-12 bayt @TheLethalCoder 'in C # cevabı üzerine yaptığı yorum sayesinde .

Eski cevap (84 bayt):

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

Açıklama:

Burada dene.

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 bayt

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

Çevrimiçi deneyin!

Swift 3 , 60 bayt

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

Nedense, bu şimdiye kadar denediğim herhangi bir çevrimiçi ortamda çalışmıyor. Bunu test etmek istiyorsanız, koyun var g=önünde ve birlikte diyoruz print(g(12))içinde Xcode (Oyun) .

İşte bir 8.3 kod sürümünde Xcode oyun alanında çalıştırdıktan sonra bir resim, (Sürüm Swift 3.1):

görüntü tanımını buraya girin


1

QBIC , 25 bayt

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

Girdi% 4 olmasına rağmen, gerçek ritim 2 tabanlıdır.

açıklama

[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 bayt

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

Çevrimiçi deneyin!

açıklama

                            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 bayt

Yıkıcı bir şekilde djhurio tarafından aşıldı ! Cevabı oldukça zarif, oyuna devam edin.

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

Rayryeng'in Octave cevabının limanı .

Çevrimiçi deneyin!

orijinal çözüm (64 bayt):

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

Özyinelemeli işlevi.

Çevrimiçi deneyin!


İlk kez biri ilham olarak benim cevabımı kullandı. Thanks :)
rayryeng - Monica, 7:17

1
Seni yenmek zordu, ama bunu 55 baytlık yanıtla başardım ( codegolf.stackexchange.com/a/138045/13849 ).
djhurio

1

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

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

Çıkışı açık gösterir stderr. Çıktı bazı izleyen çöpleri içerir.

Kullanım örneği:

$ 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 bayt

sm[hK-QddhdK):1/Q2 2

Test odası.

Yuvalanmış bir liste olarak çıkmaya izin verilirse:

Pyth , 20 19 bayt

m[hK-QddhdK):1/Q2 2

Test odası.


açıklama

sm [hK-QddhdK): 1 / Q2 2 - Tam program.

 m: 1 / Q2 2 - d değişkeni ile aralık (1, giriş () / 2,2) üzerinde harita.
  [) - ile bir liste oluşturun:
   hK-Qd - Giriş - d + 1,
        d - d,
         hd - d + 1 ve
           K - Giriş - d.
s - Listeyi düzleştirir ve örtük olarak basar.


0

C #, 107 bayt

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

Biri 1'den diğeri p'de olmak üzere iki sayacı saklayın. Her döngü yinelemesinde, dört öğe yazın ve her girişten sonra yalnızca artırma veya azaltma sayaçlarını yazın. Sayaçlar ortada toplanınca durun.

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

Yöntemi bir temsilciye yerleştirerek birkaç bayttan tasarruf edebilirsiniz. Kodunuz sonra şuna benzer: 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;};ile System.Func<int, int[]> f =ByteCount içine dahil olmaması. Ayrıca, insanların kodunuzu kendi başlarına denemelerine izin verirken çok yararlı olan TIO'ya bir bağlantı ekleyebilirsiniz!
Ian H.

@IanH. Bir lambda kullanılırken, takip eden yarı kolon göz ardı edilebilir.
TheLethalCoder

Initialise qiçin 0de ve ön artım q<p-> ++q<pve daha sonra bir bayt kaydetmek için ikinci yazılan artışı kaldırın. İki izleyen döngü ifadesini for döngüsünün son aşamasına taşıyın, böylece kıvrımlı parantezleri kaldırabilirsiniz.
TheLethalCoder

2
Sondaki virgül izin verilirse, aşağıdaki 71 bayt için çalışır p=>{for(int q=0;++q<p;)System.Console.Write(p--+$",{q++},{q},{p--},");}. TIO.
TheLethalCoder


0

Pyth , 27 24 23 bayt

Sonunda yerine baskı yaparak -3 bayt.

-1 Bay Xcoder'a teşekkürler

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

Çevrimiçi deneyin!

Veya çevrimiçi Derleyici / Yürütücü

Bu benim Pyth'taki ilk gerçek programım, bu yüzden bilmediğim daha iyi yöntemler var.

açıklama

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)

Bazı iyileştirmeler buldum ve kendi cevaplarını hak ettiklerine karar verdim.
Bay Xcoder

Bu arada, yerini FNile Viçin -1 byte
Sn Xcoder

0

C ++ (gcc) , 89 84 68 bayt

Adsız genel lambda olarak. n#pages (% 4 == 0) ve Csonuç için bir başvuru parametresidir, boş bir kapsayıcıdır vector<int>(yalnızca push_backgereklidir).

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

önceki çözüm:

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

Çevrimiçi deneyin!

Biraz ungolfed:

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

önceki çözüm biraz ungolfed :

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

Oldukça basittir ve aritmetikte bazı küçük optimizasyonlar olduğundan eminiz.

  • Düzenleme1: 5 byte kaydedilen aritmetik birleşimi
  • Düzen2: Birleşmeden sonra 4 adım birleştirildi.

Kullanımı:

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

Varyant Yazdır, 77 bayt tarihli

Değerleri yazdırmakta ısrar ediyorsanız, şu çözüm var:

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

oİstediğiniz nerede std::ostream, gibistd::cout

Kullanımı (2. lambda atanmışsa g):

g(n, std::cout);


0

Lua, 94 bayt

Bu meydan okuma için aslında her ikisi de 94 bayt olan 2 farklı yöntem buldum.

Yöntem 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

Yorumlanan Kod:

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

Yöntem 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

Bu yöntem ilk yönteme benzer ancak bunun yerine string.format () yerine birleştirilmiş bir dize döndürüyorum.

Her iki yöntemde de n kavramını kullandım ve birbirine yaklaşıyorum


0

PHP, 51 + 1 bayt

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

alt kısımlara göre ayrılmış bir sınırlayıcı ile ayrılmış sayfa numaralarını yazdırır.
Pipe ile çalıştırın -nRveya çevrimiçi deneyin .


0

J , 22 bayt

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

Çevrimiçi deneyin!

açıklama

($,)_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
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.