체커 보드의 조각 수


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

규칙

  • 제출은 하나의 정수를 취하여 보드의 조각 수를 출력하거나 반환하는 프로그램 또는 함수 등이어야합니다.
  • 입력이 음이 아닌 정수> 2라고 가정 할 수 있습니다.
  • 이것은 이므로 바이트 수가 가장 적은 프로그램이 승리합니다!
  • 보드 왼쪽 아래의 사각형은 항상 어둡습니다. 조각은 어두운 사각형에만 배치됩니다
  • 당신은 조각으로 전체 행을 차지해야합니다

3
전체 프로그램과 STDIN / STDOUT에 제한이있는 이유는 무엇입니까? 필요한 프로그램 및 / 또는 입력 오버 헤드가있는 언어에는 불공평 한 IMO.
lirtosiast

@ThomasKwa, 당신이 맞아요. 기능 등이 허용됨
Adnan

답변:


5

Par , 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으로 나누기 오류로 종료됩니다.

펼쳐진 코드는 다음과 같습니다.

enter image description here

내가 말했듯이 코드는 완전히 선형입니다. 실행 된 경로를 회색-보라색-녹색-빨강-파랑 순서로 함께 조각 할 수 있습니다. 경로는 실제로 :왼쪽에 닿을 때까지 조금 더 계속 됩니다. /(제어 흐름 만 리디렉션)을 제거하면 전체 프로그램이 선형으로 풀립니다.

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

문제는 어떻게 작동 하는가입니다. Hexagony의 메모리는 16 진 그리드의 선 그래프이며, 그리드의 각 가장자리에는 정수 값 (초기 0)이 포함됩니다. 메모리 포인터 (MP)는 항상 한쪽 가장자리에 있으며 해당 가장자리를 따라 특정 방향을 가리 킵니다. 산술 연산은 일반적으로 두 에지 지적에 적용 및 MP가 켜져 가장자리에 저장된다.

이 프로그램에서는 A , B 라는 세 개의 모서리를 사용합니다. , C 하고 MP는 다음과 같이 시작합니다.

enter image description here

이것이 작동하는 방법은 다음과 같습니다.

?  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.

{{두 번째 행에서 &가 아무 것도하지 않는 것처럼 메모리 에지를 두 번 이동 시키는가? 두 지역 모두 0이되어야합니다
Eumel

@Eumel 코드가 실행되는 순서는 아닙니다. 첫 번째 후에 {IP가 2왼쪽 모서리로 이동합니다 . 애프터 )오른쪽 모서리에서의 IP가 점프 '왼쪽 하단에. 그런 다음 IP는 라인 2와 4를 이상한 순환 방식으로 통과시킵니다.
Martin Ender

오, 나는 그것이 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

정말 편리합니다 ½ (float split Kto 2), (ceiling)이 있으므로 나누기 전에 하나를 추가 할 필요가 없습니다.

설명과 함께 여기 에서 시도 하십시오 .


5

파이썬 2, 22 21 바이트

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

나는 홀수 N과 짝수 N의 두 가지 경우로 먼저 분리합니다.

홀수 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)로 결합 할 수 있습니다. ceil (x / 2) = floor ((x + 1) / 2)이므로 바닥 구분을 사용할 수 있습니다 ((N - 1) // 2 * N + 1) // 2.


3

자바 스크립트, 37 35 바이트

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

설명

나머지 답변과 유사한 기술을 사용합니다. 이것은 ungolfed 알고리즘입니다.

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

Japt , 16 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

코드의 두 부분이 너무 비슷하다는 점을 고려할 방법이 있었으면합니다. 제안을 환영합니다!

이전 버전 (16 바이트) :

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

3

자바, (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허용됩니다.
Neil

1
OP 허용 기능.
lirtosiast

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명령에는 16 비트 모드에서 레지스터 쌍의 상위 바이트와 하위 바이트를 곱한 (8 비트 곱하기) 명령이 있으며 여기 hl에 다시 저장됩니다 hl.

이것은 결과의 두 배가 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이 홀수 인 경우 조각 수의 두 배가 어떻게 보이는지 알 수 있습니다. 조각 수의 두 배가 n-1 행에 걸쳐 있으며 한 조각을 제거하면 n-1 행을 (n- 1) / 2 개의 행으로 구성된 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

자바 스크립트, 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 회 담당자에 도달했습니다.
Tom Carpenter

@ThomasKwa 지적 해 주셔서 감사합니다. 12 바이트 저장 :).
Tom Carpenter

2

레티 나 , 18 바이트

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

입력과 출력이 단항 입니다.

온라인으로 사용해보십시오!

최신 버전의 Retina (이 과제보다 최신 버전)는 추가 4 바이트에 대해 10 진수 I / O를 처리 할 수 ​​있습니다.

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

온라인으로 사용해보십시오!

단항 입력과 십진수 출력을 사용하면 16 바이트를 수행 할 수 있지만 약간의 확장처럼 보입니다.

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

설명

여전히 다른 사람과 동일한 접근 방법이지만 숫자의 단항 표현에 정규식 대체를 사용합니다.

11(..?$)?
$_

이 계산합니다 n*((n-1)/2). 한 번에 두 문자를 일치시키고 (2로 나눔) 전체 문자열로 대체하여 (곱셈 n)이를 수행합니다. n한두 문자 만 남은 경우 나머지 문자열을 건너 뛰어 감소 합니다.

11?
1

이것은 2로 나눈 정수 나누기입니다. 우리는 단순히 두 문자를 하나 (2로 나누기)로 바꾸지 만 마지막 일치는 하나의 문자 (반올림)로만 구성 할 수 있습니다.


1000 번째 답변을 축하합니다 : p
Adnan

1

파이썬 3, 39 바이트

이것은 약간 부풀어 오르지 만 이것보다 훨씬 더 골프를 칠 수 있을지 확신하지 못합니다. 테스트를위한 링크.

n=int(input());print(((n-1)//2*n+1)//2)

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

Emigna 덕분에간단한 알고리즘 설명 에게 . 이것은 연산이 PEMDAS가 아닌 왼쪽에서 오른쪽으로 엄격하게 실행되므로 괄호가 필요하지 않은 Mumps의 수학 "결함"을 이용합니다. :-)

그러나 캐시의 앙상블 (내가 액세스 할 수있는 볼거리)은 입력을 누를 때에도 캐리지 리턴을 자동으로 출력하지 않기 때문에 출력은 다소 이상하게 보입니다. 더 예쁘게하려면 사전 / 사후 캐리지 리턴에 4자를 추가하십시오.

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

감사!


1

배쉬, 32 바이트

read a;echo $((a*(a-1>>1)+1>>1))


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.