チェッカーボード上のピースの数


14

前書き

通常のチェッカーボードには、8 x 8 = 64個の正方形が含まれています。

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

合計で、12個の白い部分があることがわかります。黒と白は常に同じ量のピースを持っています。ボード上にこれ以上ピースがある場合、ピースは隣接することになりますが、これはこのチャレンジでは許可されていません。物事を明確にするために、いくつかの例を示します。

このチャレンジで可能な最小のボードは3 x 3です。

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

ピースの最大量は2に等しいことがわかります。したがって、N = 3を指定した場合、2を出力する必要があります。入力がN = 4の場合、次の結果が得られます。

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

最大量も2であることがわかります。したがって、N = 4の場合、出力は2になります。以下のためにN = 5、出力は等しくなければならない5

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

STDIN:  3
STDOUT: 2

STDIN:  4
STDOUT: 2

STDIN:  5
STDOUT: 5

STDIN:  6
STDOUT: 6

STDIN:  8
STDOUT: 12

ルール

  • 提出は、1つの整数を取り、ボード上のピースの数を出力または返すプログラムまたは関数などでなければなりません。
  • 入力が2以上の非負整数であると安全に仮定できます。
  • これはなので、バイト数が最小のプログラムが勝ちです!
  • ボードの左下の正方形は常に暗いことに注意してください。ピースは暗い正方形にのみ配置されます
  • ピースで一列を占める必要があります

3
完全なプログラムとSTDIN / STDOUTへの制限はなぜですか?IMOは、必要なプログラムや入力オーバーヘッドがある言語には不公平です。
リルトシアスト

@ThomasKwa、あなたは正しい。その他の機能は現在許可されている
アドナン・

回答:


5

パー、8バイト

✶″½↓┐*½┐

文字ごとに1バイトが使用されます。

説明

               ## [implicit: read line]      Example
✶              ## Convert to number           7
″              ## Duplicate                   7 7
½              ## Divide by two               7 3.5    half the board
↓              ## Minus one                   7 2.5    leave one row empty
┐              ## Ceiling                     7 3      a whole number of rows
*              ## Multiply                    21       total number of spaces
½              ## Divide by two               10.5     only the blue squares
┐              ## Ceiling                     11       starts with blue, so round up

12

六角形、19バイト

?({{&2'2':{):!/)'*/

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

説明

これは、CJamとLabyrinthの回答で使用した計算と同じですが、Hexagonyの...特別な...メモリモデルのため、計算を19バイトに圧縮するのは少し複雑です(そのため、横長3六角形)。

私の迷路の答えのように、これは0除算エラーで終了します。

展開されたコードは次のとおりです。

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

私が言ったように、コードは完全に線形です。実行されたパスを、グレー、パープル、グリーン、レッド、ブルーの順につなげることができます。パスは実際には:、左側に到達するまで少し続きます。/(制御フローのみをリダイレクトする)を削除すると、プログラム全体が直線的に展開されます。

?({2':{)'*){&2':!:&?':

したがって、問題はそれがどのように機能するかです。六角形のメモリは、16進グリッドの折れ線グラフです。グリッドの各エッジには整数値(最初はゼロ)が含まれています。メモリポインター(MP)は常に1つのエッジにあり、そのエッジに沿って特定の方向を指します。通常、算術演算は、MPが置かれているエッジに向けられて保存されている2つのエッジに適用されます。

このプログラムでは、ABCのラベルが付いた3つのエッジを使用し、MPは次のよ​​うに開始します。

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

これがどのように機能するかです:

?  Read an integer N from STDIN into edge A.
(  Decrement to get N-1.
{  Move the MP forwards onto edge B.
2  Set the edge to 2.
'  Move the MP backwards onto edge C.
:  Divide edge A by edge B (rounding down) to compute (N-1)/2.
{  Move the MP forwards onto edge A.
)  Increment to restore value of N.
'  Move the MP backwards onto edge B.
*  Multiply edges A and C to compute N*(N-1)/2.
)  Increment to compute N*(N-1)/2 + 1.
{  Move the MP forwards onto edge C.
&  This actually a copy operation, but we use it to reset the edge to zero.
2  Set the edge to 2.
'  Move the MP backwards onto edge A.
:  Divide edge B by edge C to compute (N*(N-1)/2 + 1)/2.
!  Output the result as an integer. We're basically done now.
:  no-op (we already have this value)
&  Copy either B or C into A (doesn't matter).
?  Read a zero (EOF) into A.
'  Move the MP backwards onto an unused cell.
:  Divide some unused cell by A (which is zero), terminating with an error.

{{メモリエッジを2回移動して、2行目の&が何もしていないように見えますか?両方のneigboursはそこに0である必要があります
Eumel

@Eumelこれは、コードが実行される順序ではありません。最初のの後、{IP 2は左隅にジャンプします。後)右コーナーでは、IPはにジャンプ'左下隅に。次に、IPは行2と4を巡回し、奇妙な循環ラッピングを行います。
マーティンエンダー

ああ、IPではなくMEだけが変更されたと思った。また、言語が面白すぎるというヘキサゴニーを使用するためだけに+1
Eumel

@Eumelそうです。これは、コードの端がHexagonyでラップする方法です。
マーティンエンダー


8

CJam、10バイト

ri_(2/*)2/

ここでテストしてください。

説明

ri   e# Read input and convert to integer N.
_    e# Duplicate N.
(2/  e# Decrement, integer divide by two, to determine the number of rows that can be used.
*    e# Multiply by the input to determine the number of cells that can be used.
)2/  e# Increment, integer divide by two, which essentially ceil()s the result of the
     e# division.

8

ラビリンス、11バイト

Woohoo、CJamから 1バイトだけ遅れています

?:(#/*)_2/!

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

それは本質的に同じことです:

? reads an integer value.
: duplicates the result.
( decrements it.
# pushes the stack depth which happens to be 2.
/ is integer division.
* is multiplication.
) increments the result.
_ pushes a 0.
2 turns it into a 2.
/ is once again integer division.
! prints the result as an integer.

ただし、この時点ではプログラムはまだ終了していません。代わりに、命令ポインタが行き止まりにヒットし、向きを変えます。しかし、エラー終了/する計算0/0を試みます


5

真剣に、8バイト

,;D½L*½K

真剣に便利な½(2でフロート分割)とK(天井)があるので、分割する前に1つ追加する必要はありません。

ここで説明してみてください。


5

パイソン2、22の 21バイト

lambda n:~-n/2*n+1>>1

最初に、奇数Nと偶数Nの2つの場合に分けます。

奇数Nを使用すると、平均でN / 2個を含む(N-1)/ 2行を埋めることができます。最初の行には常により多くのピースがあるため、この結果を保持する必要があります。したがって、Nが奇数の場合、ceil((N-1)/ 2 * N / 2)個になります。

偶数のNで、N / 2-1、またはfloor((N-1)/ 2)行を埋めることができます。各行にはN / 2個が含まれます。

ceil(floor((N-1)/ 2)* N / 2)でこれら2つの式を組み合わせることができます。ceil(x / 2)= floor((x + 1)/ 2)なので、flooring divisionを使用できます((N - 1) // 2 * N + 1) // 2


3

JavaScript、37 35バイト

alert(((n=prompt()/2)-.5|0)*n+.5|0)

説明

残りの回答と同様の手法を使用します。これは、アルゴリズムなしのアルゴリズムです:

var n = parseInt(prompt());
var result = Math.ceil(Math.floor((n - 1) / 2) * n / 2);
alert(result);

3

DC、12

?d1-2/*1+2/p

テスト出力:

$ for t in 3 4 5 6 8; do echo $t | dc -e?d1-2/*1+2/p; done
2
2
5
6
12
$ 

3

Pyth、9バイト

/h*/tQ2Q2

Python 2の答えと同じアルゴリズム。


3

Japt16 14バイト

U-1>>1 *U+1>>1

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

使い方

ものすごく単純:

         // Implicit: U = input number
U-1>>1   // Subtract 1 from U and integer divide by 2.
*U+1>>1  // Multiply the result by U, add 1, and integer divide by 2.
         // Implicit: output last expression

コードの2つの半分が非常に似ていることを考慮する何らかの方法があればいいのにと思います。提案を歓迎します!

古いバージョン(16バイト):

U*½-½|0 *U*½+½|0

3

Java、230 155 52

ゴルフ済み:

int f(int s){return(int)Math.ceil(s*((s-1)/2)/2.0);}

ゴルフをしていない:

public class NumberOfPiecesOnACheckersBoard {

  public static void main(String[] args) {
    // @formatter:off
    int[][] testData = new int[][] {
      {3, 2},
      {4, 2},
      {5, 5},
      {6, 6},
      {8, 12}
    };
    // @formatter:on

    for (int[] data : testData) {
      System.out.println("Input: " + data[0]);
      System.out.println("Expected: " + data[1]);
      System.out.print("Actual:   ");
      System.out.println(new NumberOfPiecesOnACheckersBoard().f(data[0]));
      System.out.println();
    }
  }

  // Begin golf
  int f(int s) {
    return (int) Math.ceil(s * ((s - 1) / 2) / 2.0);
  }
  // End golf

}

プログラム出力:

Input: 3
Expected: 2
Actual:   2

Input: 4
Expected: 2
Actual:   2

Input: 5
Expected: 5
Actual:   5

Input: 6
Expected: 6
Actual:   6

Input: 8
Expected: 12
Actual:   12

throws Exception許容されます。
ニール

1
OPは機能を許可しました。
リルトシアスト

Scanner入力にクラスを使用できます。それは私が考えるバイトの束を節約するでしょう。(一般的な使用法ではBufferedReader/ InputStreamReaderコンボの方が良いかもしれませんが、これはコードゴルフでありScanner、単純な入力では問題なく動作します。)
ダレルホフマン

スタンドアロン関数に変換し、標準入出力の代わりにパラメーター/戻り値を使用すると、大きな違いが生じました。

2

Zilog ez80マシンコード、9バイト

16進数で:

6C 2D CB3D ED6C 2C CB3D

組み立て中:

ld l,h
dec l
srl l
mlt hl
inc l
srl l

入力はレジスタhにあり、出力はlます。

Zilog ez80は、8ビットアキュムレータと24ビットレジスタを備えた8ビットプロセッサです。z80とは異なり、これにはmlt(8ビット乗算)命令があり、16ビットモードでは、ここhlでレジスタペアの上位バイトと下位バイトを乗算し、に格納しhlます。

これは、結果の2倍が8ビットに収まる値に対してのみ機能します。つまり、n≤23です。


2

TI-BASIC、13バイト

⁻int(⁻.5Ansint(Ans/2-.5

TI-BASICの暗黙的な乗算は役立ちますが、整数除算はありません。⁻int(⁻Xceil(x)の短縮形です。


2

vba、46

Function f(x)
f=(((x-1)\2)*x+1)\2
End Function

数式で?f(x)または= f(A1)を使用して呼び出します


2

Pyth、17 14 13バイト

Ypnypnのおかげで-3バイト!*演算子の番号を再配置して、1バイトを節約しました。

/+*Q-/Q2-1%Q2 1 2 (original)
/h*Q-/Q2!%Q2 2
/h*-/Q2!%Q2Q2

説明:

nが偶数の場合、n / 2個の行でn / 2-1行を占有でき、合計でn *(n / 2-1)/ 2個になります。この式は(n *(n / 2-1)+1)/ 2と同等です

nが奇数の場合、ピースの数が2倍になり、ピースの2倍がn-1行にまたがる方法を見つけることができます。1つのピースを取り上げると、n-1行を(n- 1)/ 2個の行からなるグループで、各グループにn個あるため、この場合の式は(n *(n / 2)+1)/ 2です

両方の式が非常に似ているので、コードを記述できます。

/h*-/Q2!%Q2Q2
        %Q2   Check if the number is odd
       !      Logical not to make 1 if even and 0 if odd
    /Q2       n/2
   -          n/2-1 if even, and n/2 if odd
  *        Q  n*(n/2-1) if even, n*(n/2) if odd
 h            Add one
/           2 Divide the result by two.

ゴルフ言語を初めて使用しました。


2

Javascript、33バイト

a=prompt();alert(a*(a-1>>1)+1>>1)

ES6関数が許可されている場合、18バイト:

a=>a*(a-1>>1)+1>>1

2

MATLAB、37 25バイト

@(a)ceil(fix(a/2-.5)*a/2)

これはすべてのテストケースで機能するはずです。

Octaveでも動作します。こちらからオンラインで試すことができます


古いコードの場合、プログラムをというワークスペースのファイルに追加しましたcheckerboard.m。次のように入力するだけで実行できますcheckerboardプロンプトで入力、起動したらプロンプトで必要なサイズを入力します。結果が印刷されます。

新しいコードの場合、ここに投稿されたコードをプロンプトに入力し、匿名関数をとして呼び出しますans(n)


賛成票をありがとう、ついに1000 Repに達した:)
トムカーペンター

@ThomasKwaそれを指摘してくれてありがとう。12バイトを保存しました:)。
トムカーペンター

2

網膜、18バイト

11(..?$)?
$_
11?
1

入力と出力は単項です。

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

Retinaの最新バージョン(このチャレンジより新しいバージョン)は、さらに4バイトの10進数I / Oを処理できます。

.+
$*
11(..?$)?
$_
11?

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

単項入力と10進出力では、16バイトを実行できますが、それは少しストレッチのようです。

11(..?$)?
$_
11?

説明

まだ他の人と同じアプローチですが、数値の単項表現で正規表現の置換を使用しています。

11(..?$)?
$_

これは計算しn*((n-1)/2)ます。これを行うには、一度に2文字を一致させ(2で除算)、文字列全体で置き換えます(乗算n)。n1文字または2文字しか残っていない場合、文字列の残りの部分をスキップすることで減少します。

11?
1

これは2による整数除算で、切り上げられます。2つの文字を1つに置き換える(2で割る)だけですが、最後の一致が1文字のみで構成されることを許可します(切り上げ)。


1000回目の回答おめでとう:p
アドナン


1

プロローグ、39 38バイト

コード:

p(N):-X is ((N-1)//2*N+1)//2,write(X).

説明:

Subtract 1 from input and integer divide by 2 to get number of rows available.
Multiply that number by input to get number of squares available. 
Add one and integer divide by 2 to round up, since at at least half the rows 
will have a checker at the first square.
Print.

例:

p(8).
12

こちらからオンラインでお試しください

編集: ceil / 2を+ 1 // 2に置き換えて1バイトを保存しました


1

おたふく風邪、17バイト

R I W I-1\2*I+1\2

アルゴリズムの簡単な説明をしてくれたエミグナに感謝します。これは、操作が厳密に左から右(PEMDASではない)に実行されるという、Mumpsの数学の「欠陥」を利用するため、括弧は必要ありません。:-)

ただし、キャッシュのアンサンブル(私がアクセスできるおたふく風邪の環境)は、入力で押してもキャリッジリターンを自動的に出力しないため、出力は少し奇妙に見えます。よりきれいにしたい場合は、前後の改行に4文字を追加します。

R I W !,I-1\2*I+1\2,!

ありがとう!




1

バッチ、30バイト

@cmd/cset/a(%1*((%1-1)/2)+1)/2

stdinへの入力が必要な場合は38バイト:

@set/pa=
@cmd/cset/a(a*((a-1)/2)+1)/2
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.