小冊子を印刷する


39

本を読むのは簡単ですが、本を印刷するのは少し難しいかもしれません。小冊子を印刷するとき、プリンタは左から右に読むために特定の方法でページを配置する必要があります。これを行うには、次のようなパターンを使用します

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…

テストケース

4ページの小冊子: 4, 1, 2, 3

8ページの小冊子: 8,1,2,7,6,3,4,5

12ページの小冊子: 12,1,2,11,10,3,4,9,8,5,6,7

16ページの小冊子: 16,1,2,15,14,3,4,13,12,5,6,11,10,7,8,9

20ページの小冊子: 20,1,2,19,18,3,4,17,16,5,6,15,14,7,8,13,12,9,10,11

仕事

あなたの仕事はn、4の倍数である整数が与えられると、本の印刷に使用できる数字の配列を表示することです。nページのです。

注意:スペース、コンマ、ハイフン、または括弧で区切られているかどうかにかかわらず、出力が正しい数値を生成する限り、ソリューションを取得するための任意の方法を使用できます。

これは質問なので、回答はバイト単位でスコア付けされ、最も少ないバイトが勝ちます。


入力は常に4または偶数で割り切れることが保証されていますか?いずれにせよ、いくつかのテストケースを追加してください。PPCGへようこそ:)
シャギー

8
PPCGへようこそ、最初の挑戦です!投稿する前に、サンドボックスで新しいチャレンジを提案することをお勧めします。
オリバーNi

1
入力は4の倍数である必要があります
-tisaconundrum

1
任意の値をサポートし、必要に応じて空白ページを埋めることができれば(しかし、ささいなことかもしれません)(別の課題かもしれません)
Barranka

1
コンマの代わりにスペース、ハイフン、またはその他の区切り文字で配列を区切ることはできますか?
-TehPers

回答:



13

JavaScript(ES6)、49 45バイト

@RickHitchcockの助けを借りて4バイトを保存しました

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

デモ


非再帰的、51バイト

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

デモ


47バイト: f=(n,a=1)=>n<a+3?[]:[n,a,a+1,n-1,...f(n-2,a+2)]
リックヒッチコック

1
@RickHitchcock n<aは実際には十分なので、4バイト節約されます。ありがとう!
アーナルド

6

Python 2、99 93 88 58 56 55バイト

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

オンラインでお試しください!

不要なインデントを削除して-6バイト、Oliver Niに感謝

条件を変更して-5バイト、ありがとうルイス・メンドー

印刷ステートメントを最適化することにより、-30バイト、アーノルドパーマーに感謝

ループを1行に置くことで-2バイト、nedla2004に感謝

-1バイト、魔法をかけることにより、Xcoder氏に感謝


保存は1つのスペースの代わり4.使用してバイト
オリバーニッケルを

そうそう、私はいつもそれを忘れています。ありがとう。
LyricLy

1
を使用して-29バイトlambda(ただし、これは別の答えを保証するのに十分異なる場合があります)。
-notjagan

@notjagan必要に応じて自分で投稿してください。
LyricLy

印刷を少し変更するだけで58バイト。それは今印刷しますf-i+1,i,i+1,f-i代わりに、条件付きで最後の値を印刷する各ループで。これにより、最初のprint f,
アーノルドパーマー

6

Python 2、46バイト

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

オンラインでお試しください!

範囲[1..n]を生成し、繰り返しパターンで前後にポップしますback, front, front, back, ...


Python 2、49バイト

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

オンラインでお試しください!

最初の4つの要素を生成し、上限値nを2減らし、下限値kを2増やして再帰的に続行します


Python 2、49バイト

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

オンラインでお試しください!

低い値と高い値のどちらをi使用-i%4/2するかをブール値として使用して、リストの 'th値を直接生成します。



5

MATL19 17 10バイト

:t"0&)@o?P

オンラインでお試しください!

説明

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

ゼリー 12  11 バイト

11バイトに改善された「組み合わせメソッド」:

9Bṁ×ḶṚÆ¡‘Œ?

オンラインでお試しください!

どうやって?

これは、順列計算と階乗数システムを使用します。

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バイト、「編みパターン」:

RṚ‘żRs2Z€FḊṁ

オンラインでお試しください!

どうやって?

これは単純なアプローチです。2つのストランドを作成し、それらをインターリーブしてから、ルーズエンドをトリミングします。

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]

これ賢いです。+1
エリック・ザ・アウトゴルファー

4

オクターブ43 36バイト

C(gcc)でのこの回答のポートは、ここにあります

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

説明

  1. k=1:2:n/2:1〜の線形シーケンスを生成します n/2 2のステップでします。これは次のステップですぐに使用されることに注意してください。
  2. [n-k+1;k;k+1;n-k]:最初の行は、シーケンス作成するように4行の行列作成n, n-2, n-4...までをn-(n/2)+2、第二行がある1, 3, 5...までn/2 - 1、第三の行は1で追加された第二列と4行目は1で追加された最初の行です。
  3. [n-k+1;k;k+1;n-k](:)':これは、この行列のすべての列を左から右に積み重ねて単一の列ベクトルを作成し、簡単に表示できるように行ベクトルに転置します。この方法で列を積み重ねると、目的のシーケンスが正確に作成されます。

これは匿名関数であるため、使用する前に変数に割り当てるかans、関数の作成後に作成される組み込み変数を使用できます。

オンラインでお試しください!


1
こんにちは、匿名関数にすることで短縮することもできるので、入力を呼び出す必要はありません。:このリンクを参照してくださいgnu.org/software/octave/doc/v4.0.3/...
Michthan

1
@Michthan True。コードが複数のステートメントであったため、私はもともとそのようにしました。input最初の行を作成nし、実際の匿名関数の入力自体から入力を取得するようにベース増分ベクトルを保存することにより、呼び出しを削除し、構文をさらに悪用しました1つのステートメント。ありがとう!
rayryeng-モニカの復活

3

R、48バイト(改善)

-7バイトの@Giuseppeに感謝します!

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

秘Theは、x=1:n;x[order(x%%2)]に等しいことorder(1:n%%2)です。

オンラインでお試しください!

R、55バイト(オリジナル)

ゴルフ

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

コメントなしでゴルフ

nstdinから読み取ります。

n=scan()

x1からのページのシーケンスとして定義しますn

x=1:n

偶数ページが不均一なページの前になるようにページを注文します。

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

で計算された本の中心に対して降順でページを並べn/2+.5ます。

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

8ページの例:

  • 中心は4.5です。
  • ページ1と8は中心から最も離れていますが、8が偶数なので8が最初になります。
  • 2ページ目と7ページ目は次に中心から最も離れていますが、2ページ目が偶数であるため、2ページ目が最初に表示されます。
  • 等々。

オンラインでお試しください!


1
私の(盗まれた)ソリューションより良い方法
ジュゼッペ


1
トリックは(1:n)[order(1:n%%2)]同じであることに気付いていましたorder(1:n%%2)
ジュゼッペ

2

Mathematica、54 53 45バイト

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

説明

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

Java 8、84 72バイト

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

または

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

C#の回答に関する@TheLethalCoderのコメントのおかげで-12バイト。

古い回答(84バイト):

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

説明:

ここで試してみてください。

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バイト

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

オンラインでお試しください!

Swift 3、60バイト

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

何らかの理由で、これは今まで試したどのオンライン環境でも機能しません。テストする場合はvar g=、その前に置きprint(g(12))Xcode(Playgrounds)で呼び出します。

Xcodeプレイグラウンドバージョン8.3.1(Running Swift 3.1)で実行した後の写真を次に示します。

ここに画像の説明を入力してください


1

QBIC、25バイト

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

入力は%4ですが、実際のリズムは2ベースです。

説明

[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

R64 60バイト

djhurioによって壊滅的な打撃を受けた!彼の答えは非常にエレガントで、賛成です。

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

rayryengのオクターブ回答のポート。

オンラインでお試しください!

元のソリューション(64バイト):

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

再帰関数。

オンラインでお試しください!


初めて誰かが私の答えをインスピレーションとして使ったことがあります。ありがとう:)
rayryeng-モニカの復活

1
あなたを打ち負かすのは大変でしたが、私はこれを55バイトの回答(codegolf.stackexchange.com/a/138045/13849)で管理しました。
-djhurio

1

Bash + Perl + Groff + Psutils、48バイト

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

出力を表示しますstderr。出力には、末尾のゴミが含まれます。

使用例:

$ 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

Pyth21 20バイト

sm[hK-QddhdK):1/Q2 2

テストスイート。

ネストされたリストとしての出力が許可されている場合:

Pyth20 19バイト

m[hK-QddhdK):1/Q2 2

テストスイート。


説明

sm [hK-QddhdK):1 / Q2 2-完全なプログラム。

 m:1 / Q2 2-range(1、input()/ 2,2)を変数dでマップします。
  [)-次を使用してリストを作成します。
   hK-Qd-入力-d + 1
        d-d、
         hd-d + 1および
           K-入力-d。
s-リストをフラット化し、暗黙的に印刷します。


0

C#、107バイト

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

2つのカウンターを保持します。1つは1から始まり、1つはpから始まります。各ループの繰り返しで、4つの要素を記述し、各エントリの後にカウンターをインクリメントまたはデクリメントします。カウンターが中央で会ったら、やめてください。

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

メソッドをデリゲートに配置すると、数バイトを節約できます。あなたのコードは次のようになります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;};、とSystem.Func<int, int[]> f =持っていない:バイトに含まれています。TIOにリンクを追加することもできます。これは、人々が自分でコードを試せるようにするときに非常に便利です。
イアンH.

@IanH。ラムダを使用する場合、末尾のセミコロンは省略できます。
TheLethalCoder

初期化q0のインクリメントとプレq<p- > ++q<pその後、バイトを保存するための第2のポストインクリメントを削除します。中かっこを削除できるように、2つの後続のループステートメントをforループの最後のステージに移動します。
TheLethalCoder

2
末尾のコンマが許可されている場合、以下は71バイトで機能しますp=>{for(int q=0;++q<p;)System.Console.Write(p--+$",{q++},{q},{p--},");}ティオ。
TheLethalCoder


0

パイス27 24 23バイト

末尾ではなく全体に印刷することにより、-3バイト。

-1 Xcoder氏に感謝

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

オンラインでお試しください!

または、オンラインのCompiler / Executorで

これはPythでの私の最初の実際のプログラムなので、おそらく私が知らないより良い方法があるでしょう。

説明

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)

私はいくつかの改善点を見つけ、それらが彼ら自身の答えに値すると判断しました。
氏Xcoder

ところで、交換するFNVのために-1バイト
氏Xcoder

0

C ++(gcc)89 84 68バイト

名前のない汎用ラムダとして。n#pages(%4 == 0)でありC、結果の参照パラメーターであり、vector<int>push_back必要な場合のみ)のような空のコンテナーです。

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

以前のソリューション:

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

オンラインでお試しください!

わずかに未使用:

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

以前の解決策はわずかに利用できませんでした

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

これは非常に簡単に開発されたものであり、算術演算に若干の最適化が確実に行われています。

  • Edit1:5バイト保存された算術演算の統合
  • Edit2:統合後、4つのステップが結合されました

使用法:

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

Print-Variant、77バイト古い

値を印刷することを主張する場合、このソリューションがあります:

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

どこにo希望されるstd::ostreamように、std::cout

使用法(2番目のラムダがに割り当てられた場合g):

g(n, std::cout);


0

Lua、94バイト

この挑戦のために、私は実際に両方が94バイトである2つの異なる方法を思いつきました。

方法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

コメント付きコード:

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

方法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

このメソッドは最初のメソッドに似ていますが、代わりにstring.format()の代わりに連結された文字列を返します

両方の方法で、私はnとiの概念を使用しました



0

J、22バイト

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

オンラインでお試しください!

説明

($,)_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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.