가능한 한 정사각형에 가까운 격자를 만듭니다


10

그리드를 가능한 한 정사각형에 가깝게 만드는 함수 또는 프로그램 만들기

  • 입력, 정수 (1,2,3,25 등)로 정수 N 이 주어집니다.
  • 출력은 가능한 한 정사각형에 가까운 N 문자 의 완벽한 직사각형 격자 여야 합니다.
  • (wannabe) 사각형은 사용자가 지정한 문자 O 또는 X 중 하나로 구성되어야합니다.

포인트 :

  • O 또는 X로만 하드 코딩 : +1
  • 출력을 회전시키는 매개 변수 (0/1, true / false, 비슷한 것) (예 : 5 또는 8) : -10
  • 정사각형을 설계하십시오 (O 및 X를 일종의 패턴으로 사용). -5

패턴에 두 유형의 문자가 모두 포함 된 경우 (x / y- 축> = 3) 패턴은 수평 또는 수직으로 뒤집어 졌을 때 동일하게 유지됩니다 (X와 Os를 교환하는 것이 허용됨)

INPUT: 4         INPUT: 5       INPUT: 8              INPUT: 9
OO               OOOOO          XXXX                  XOX
OO                              XXXX                  OXO  
                                or rotated 90deg      XOX

허용되지 않는 예 (길이가 같은 행 또는 열이 아님)

BAD RESULT: 5a        BAD RESULT: 5b      BAD RESULT: 8
OOO                   OO                  OOO
OO                    OO                  OOO
                      O                   OO

가능하면 온라인 예를 제공하십시오.


기능이 충분합니까, 아니면 전체 프로그램을 원하십니까?
John Dvorak

"정사각형 디자인 ... 9 중심 변경의 경우"-패턴이 바둑판이 아닌 정확한 상황은 무엇입니까? 예를 들어 줄 수 있습니까?
John Dvorak

다시 편집 : 내가 "xo"[i]대신에 3 점을 얻는다는 것을 올바르게 읽 i습니까? 그만한 가치가 없어 보입니다. 일반적으로 모든 보상은 다소 낮은 것 같습니다.
John Dvorak

"일부 패턴"은 다소 모호합니다. 첫 번째 'x'를 'o'로 바꾸면 계산됩니까?
John Dvorak

좋은 질문. 흥미로운 보너스 / 페널티는 회전입니다. 개인적으로 나는 하나의 하드 코딩 된 캐릭터 (즉, 페널티를 기본값으로 설정)를 고수하고 회전을 제외한 모든 보너스 / 페널티를 제거합니다. 너무 많은 보너스 나 페널티를받는 것은 좋은 생각이 아닙니다. 중요한 것은 주요 문제를 명확하게 지정하는 것입니다.
Level River St

답변:


6

CJam, 16 (31-10-5)

두 개의 정수가 입력되는데, 첫 번째 는 방향 0또는 1방향이고 두 번째 는 그리드 의 수 O또는 숫자입니다 X.

그것은 대체를 인쇄 O하고 X.

:X"OX"*X<\Xmqi){(_X\%}g_X\/?/N*

이것은 함수 본문이므로 l~코드 앞에 다음과 같이 추가하십시오 .

l~:X"OX"*X<\Xmqi){(_X\%}g_X\/?/N*

그리고 같은 입력을 제공

0 10

같은 출력을 얻으려면

OXOXO
XOXOX

또는 같은 입력

1 10

...에 대한

OX
OX
OX
OX
OX

여기에서 온라인으로 사용해보십시오


작동 방식 :

l~                                 "Put the two input integers to stack";
  :X                               "Assign the number of cells to X";
    "OX"*                          "Take string "OX" and repeat it X times";
         X<                        "Slice it to take only first X characters";
           \                       "Swap top two stack elements, now string is at bottom";
            Xmqi)                  "Take square root of X, ceil it and put on stack";
                 {(_X\%}g          "Keep decrementing until it is perfectly divisible by X";
                         _X\/      "Copy it, divide X by that and put it on stack";
                             ?     "Based on first input integer, take either of numbers";
                              /    "Divide the XOXO string that many times";
                               N*  "Join the string parts with a new line";

예제 실행 :

l~ed:X"OX"*edX<ed\edXmqi)ed{(_X\%}ged_edXed\ed/ed?ed/edN*ed

#INPUT:
1 10

#OUTPUT:
Stack: [1 10]

Stack: [1 "OXOXOXOXOXOXOXOXOXOX"]

Stack: [1 "OXOXOXOXOX"]

Stack: ["OXOXOXOXOX" 1]

Stack: ["OXOXOXOXOX" 1 4]

Stack: ["OXOXOXOXOX" 1 2]

Stack: ["OXOXOXOXOX" 1 2 2]

Stack: ["OXOXOXOXOX" 1 2 2 10]

Stack: ["OXOXOXOXOX" 1 2 10 2]

Stack: ["OXOXOXOXOX" 1 2 5]

Stack: ["OXOXOXOXOX" 2]

Stack: [["OX" "OX" "OX" "OX" "OX"]]

Stack: ["OX
OX
OX
OX
OX"]

OX
OX
OX
OX
OX

3

APL (36-5-10 = 21)

{'OX'⍴⍨⍺⌽⊃∆/⍨⍵=×/¨∆←∆[⍋|-/¨∆←,⍳2/⍵]}

왼쪽 인수는 회전이고 오른쪽 인수는 크기입니다. 또한 간단한 패턴을 사용합니다 ( 'X'와 'O'만 번갈아 가며).

      0{'OX'⍴⍨⍺⌽⊃∆/⍨⍵=×/¨∆←∆[⍋|-/¨∆←,⍳2/⍵]}¨4 5 8 9
 OX  OXOXO  OXOX  OXO 
 OX         OXOX  XOX 
                  OXO 
      1{'OX'⍴⍨⍺⌽⊃∆/⍨⍵=×/¨∆←∆[⍋|-/¨∆←,⍳2/⍵]}¨4 5 8 9
 OX  O  OX  OXO 
 OX  X  OX  XOX 
     O  OX  OXO 
     X  OX      
     O       

설명:

  • ∆←,⍳2/⍵:에서 숫자의 모든 가능한 쌍을 생성 1보관합니다 .
  • ∆←∆[⍋|-/¨∆... ]: 각 쌍의 두 숫자의 절대 차이에서 오름차순으로 정렬 하고 결과를 다시 저장합니다 .
  • ⊃∆/⍨⍵=×/¨∆: 각 쌍에 대해 숫자를 곱하십시오. 에 곱하는 쌍만 선택 하고 일치하는 첫 번째 쌍 (정렬 때문에 '가장 정사각형')을 선택하십시오.
  • ⍺⌽:로 길이 목록 (2 개의 요소가있는)을로 회전합니다 .
  • 'OX'⍴⍨: 해당 크기의 행렬을 생성하고, 교대로 충전 OX.

2

하스켈, 59 자

r=replicate
f n=[r x$r y '0'|x<-[1..n],y<-[1..x],x*y==n]!!0

2

CJam, 25 22 21 (31-10)

이것은 함수 본문입니다. 완전한 프로그램을 원한다면 riri앞에 추가 하십시오. 코드 블록으로 사용하려면에 둘러싸십시오 {}. cjam.aditsu.net에서 테스트하십시오 .

두 개의 정수 인수로 입력합니다 : 사각형이 수직인지 (0이 아닌 값인지) 수평인지 (0)를위한 스위치와 O사용할 수입니다.

:Xmqi){(_X\%}g_X\/@{\}{}?'O*N+*

설명

:X "Assign the top item on the stack (the second input) to variable X";
mq "Take its square root";
i  "Convert to integer (round)";
)  "Increment it";

{  "Start code block";
  (  "Decrement";
  _X "Duplicate top item on stack; push X to the stack";
  \% "Swap top 2 items and take division remainder";
}g "Loop until top item on stack is 0; pop condition after checking it";

_X "Duplicate top item on stack; push X to the stack";
\/ "Swap top 2 items and divide";

"OMIT THIS BIT TO GET A 25-CHAR FUNCTION WITHOUT THE 10PT BONUS";
 @  "Rotate top 3 items on stack";
 {\}"Code block 1: swap top two items";
 {} "Code block 2: do nothing";
 ?  "If top item of stack is 0, run code block 1, otherwise run code block 2";

'O "Push the character O to the stack";
*  "Repeat it N times, where N is the second item from the top of the stack (O is first)";
N+ "Push a new line and concatenate it with the string on the top of the stack";
*  "Repeat the string N times";

1
바이트 수의 손실없이 큰 숫자의 경우 감소 속도가 훨씬 빨라야합니다
edc65

1
누가 하향 조정 했습니까? 왜?

2
난 단지 누군가가 CJam에게 실제 언어를 고려하지 않기 때문에 그것의 추측 할 수
존 드보락

당신의 설명이 다소 깨졌습니다. 현재 편집 중입니까?
John Dvorak

@JanDvorak 네, 편집 도중에 실수로 Tab과 Enter를 눌렀습니다. 이제 수정되었습니다.

2

자바 스크립트 (E6) 84 (83 + 1) 또는 101 (116-10-5)

패턴 + 회전 (파라미터 f, 0 또는 1)-보너스 15

F=(n,f)=>{
  for(r=x=0;y=n/++x|0,x<=y;)x*y-n?0:z=f?x:y;
  for(o='';n;)o+=(n--%z?'':(r^=1,c='\n'))+'OX'[r^(c^=1)];
  alert(o)
}

패턴 없음, 회전 없음-페널티 1

F=n=>{
  for(x=0;y=n/++x|0,x<=y;)x*y-n?0:z=y;
  alert(('O'.repeat(z)+'\n').repeat(n/z));
}

FireFox / FireBug 콘솔에서 테스트

F(30,0)

OXOXOX
XOXOXO
OXOXOX
XOXOXO
OXOXOX

F(30,1)

OXOXO
XOXOX
OXOXO
XOXOX
OXOXO
XOXOX

2

파이썬, 79 75 (보너스 없음)

보너스는 까다로워 보이므로 다음은 매우 간단한 Python 함수입니다.

def f(N):c=max(x*((x*x<=N)>N%x)for x in range(1,N+1));print(N/c*'O'+'\n')*c

관심있는 온라인 예 : repl.it/Zq9
Martijn

1
테스트 후 이것을 변경 했습니까? 나는 이것을 시도했지만 작동하지 않는다. 예를 들어 f(8)8 O초의 하나의 열을 주었다 .
marinus

@ marinus : 테스트했지만 잘못된 버전을 복사 한 것 같습니다. 있었다 >가되어 있어야합니다 <. 이제 수정되었습니다. 메모 주셔서 감사합니다!
Emil

1

루비, 74

f=->n{w=(1..n).min_by{|z|n%z>0?n:(n/z-n/(n/z))**2};$><<("X"*w+"\n")*(n/w)}

설명

  • 입력은 람다에 대한 인수로 사용됩니다. 기대합니다 Integer.
  • n(입력)이 1에서 1까지의 모든 정수로 나눌 수 있는지 확인하십시오 n.
    • 그렇다면 길이와 너비의 차이를 계산하십시오.
    • 그렇지 않은 경우 큰 수 ( n)를 반환하십시오 .
  • 사각형과 가장 유사한 길이 너비 차이를 최소화하십시오.
  • String#*사각형을 "그리기" (과도하게 간결한) 방법을 사용하십시오 .

왜 다운 보트를 받았습니까? 내 답변에 버그가 있습니까?
britishtea

오타가 있습니다. 마지막 단어는 "사각형"이어야하고 "sqaure"가 있습니다. (나는 downvoter가 아니며, 나는이 실수를 지적하고있다).
Ismael Miguel

1

APL (Dyalog Unicode) , 30-15 = 15 바이트 SBCS

익명의 람다. 소요 N을 왼쪽 인수로 오른쪽 인자와 PARAM한다. 사각형에는 X와 O의 줄무늬가 있거나 체커됩니다.

{⍉⍣⍺⍴∘'XO'⊃∘c⌈.5×≢c←⍸⍵=∘.×⍨⍳⍵}

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

{} "dfn"; 왼쪽 인수 (param)이고 오른쪽 인수 ( N )입니다.

⍳⍵ndi ndi 1… N

∘.×⍨ 그것의 곱셈표

⍵=N 이 그와 같은  마스크

ɩ 마스크의 참값의 ndices

c← 그것을 저장하십시오 c( c andidates)

 후보자 집계

.5× 반으로 곱하면

 천장 (반올림)

⊃∘c 그 요소를 선택하십시오 c

⍴∘'XO' 주기적으로 "XO"를 재구성하는 데 사용

⍉⍣⍺ param이면 전치


1

05AB1E (레거시) , 점수 : 7 (22 바이트 -15 보너스)

„OXI∍¹tï[D¹sÖ#<}äIiø}»

온라인으로 시도 하거나 더 많은 테스트 사례를 확인 하십시오 .

입력을 N먼저 가져온 다음 부울 ( 0/ 1)을 회전해야하는지 여부를 가져옵니다.

최신 Elixir 재 작성 버전 05AB1E와 달리 문자열 목록이 포함 된 zip은 묵시적으로 평탄화되고 문자를 결합하기 때문에 Python 레거시 버전 05AB1E를 사용합니다.

설명:

OX         # Push string "OX"
   I       # Extend it to a size equal to the first input
            #  i.e. 9 → "OXOXOXOXO"
            #  i.e. 10 → "OXOXOXOXOX"
¹t          # Take the first input again, and square-root it
            #  i.e. 9 → 3.0
            #  i.e. 10 → 3.1622776601683795
  ï         # Then cast it to an integer, removing any decimal digits
            #  i.e. 3.0 → 3
            #  i.e. 3.1622776601683795 → 3
   [        # Start an infinite loop:
    D       #  Duplicate the integer
     ¹sÖ    #  Check if the first input is evenly divisible by that integer
            #   i.e. 9 and 3 → 1 (truthy)
            #   i.e. 10 and 3 → 0 (falsey)
        #   #  And if it is: stop the infinite loop
    <       #  If not: decrease the integer by 1
            #   i.e. 3 → 2
   }        # After the infinite loop:
ä           # Divide the string into that amount of equal sized parts
            #  i.e. "OXOXOXOXO" and 3 → ["OXO","XOX","OXO"]
            #  i.e. "OXOXOXOXOX" and 2 → ["OXOXO","XOXOX"]
 Ii }       # If the second input is truthy:
   ø        #  Zip/transpose; swapping rows/columns of the strings
            #   i.e. ["OXOXO","XOXOX"] → ["OX","XO","OX","XO","OX"]
»           # And finally join the strings in the array by newlines
            #  i.e. ["OXO","XOX","OXO"] → "OXO\nXOX\nOXO"
            #  i.e. ["OX","XO","OX","XO","OX"] → "OX\nXO\nOX\nXO\nOX"
            # (and output the result implicitly)

0

GolfScript 26 (41-10-5)

:x),1>{x\%!},.,2/=.x\/@{\}*'X'*n+*1>'O'\+

스택에 두 개의 매개 변수가 있어야합니다.

  • 0정상 또는 1전치
  • n

패턴은 보드가 Xs 로 가득 하고 왼쪽 상단 모서리가입니다 O. 말할 필요도없이,이 패턴은 보드를 조 옮길 때 유지됩니다.

데모 : 일반 , 조옮김


0

매스 매 티카, 71 문자

f@n_:=#<>"\n"&/@Array["O"&,{#,n/#}&[#[[⌊Length@#/2⌋]]&@Divisors@n]]<>""

0

쁘띠 컴퓨터 기본, 72 바이트

INPUT N,S$FOR I=1TO SQR(N)IF N%I<1THEN M=I
NEXT
?(S$*M+" "*(32-M))*(N/M)


0

레티 나 0.8.2 , 66 바이트 + 1 바이트 페널티 = 67

.+
$*X
((^|\3)(X(?(3)\3)))+(\3)*$
$3 $3$#4$*X
X(?=X* (X+))| X+
$1¶

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

.+
$*X

입력을 Xs 문자열로 변환하십시오 .

((^|\3)(X(?(3)\3)))+(\3)*$

외부 캡처의 첫 번째 패스는 문자열의 시작과 일치하고 후속 패스에서는 내부 캡처의 이전 값이 일치합니다. 그런 다음 내부 캡처가 증가하고 일치합니다. 이것의 결론은 외부 캡처에 의해 소비되는 문자열의 양이 내부 캡처의 제곱이므로 입력의 제곱근을 초과 할 수 없다는 것입니다. 그 후의 반복은 내부 캡처가 스트링 길이의 요소가되도록합니다.

$3 $3$#4$*X

발견 된 요인을 저장하고 후속 반복 횟수를 더하여 다른 약수를 계산하십시오.

X(?=X* (X+))| X+
$1¶

요인을 직사각형으로 재 배열하십시오.


0

, 33 바이트 -10-5 = 18

Nθ≔⌊Φ⊕θ¬∨‹×ιιθ﹪θιηE÷θη⭆η§XO⁺ιλ¿N⟲

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

Nθ

입력 N.

≔⌊Φ⊕θ¬∨‹×ιιθ﹪θιη

범위를 가지고 0... N, 그 제곱보다 작없는 숫자 만 계속 N하고 분열 N, 그리고 그 숫자의 최소를 취할.

E÷θη⭆η§XO⁺ιλ

발견 된 요소를 사용하여 체커 보드 패턴을 사용하여 적절한 너비와 높이의 사각형을 출력하십시오. (이것은 UOη÷θηXO¶OX1 바이트 절약을위한 것이지만 지금은 버그가 있습니다.)

¿N⟲

두 번째 입력이 0이 아닌 경우 출력을 회전시킵니다. 두 번째 입력이 필요 0하거나 2허용 가능한 ⟲N경우 1 바이트를 절약 할 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.