Створіть сітку якомога ближче до квадрата


10

Створіть функцію або програму, яка робить сітку максимально наближеною до квадрата

  • Вам буде дано ціле число N як вхід, цілі числа (1,2,3,25 тощо)
  • Вихід повинен бути ідеальною прямокутною сіткою з N літер якомога ближче до квадрата
  • Квадрат (wannabe) повинен складатися з однієї з літер O або X, як вказано користувачем

Бали :

  • Мікрокодування лише на O або X: +1
  • Параметр (0/1, правда / хибність, щось подібне) для обертання результатів (наприклад, з 5 або 8): -10
  • Сконструюйте квадрат (використовуйте як O, так і X у певній схемі): -5

Шаблон вважається дійсним, якщо він містить обидва типи символів (де вісь x / y> = 3) і візерунок залишається однаковим, коли гортати горизонтально або вертикально (дозволено обмін Xs з 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

Якщо можливо, наведіть приклад в Інтернеті.


Чи достатньо функції, чи ви хочете повноцінної програми?
Джон Дворак

"Оформити квадрат ... у випадку 9 змінити центр" - за яких точних обставин шаблон не є контрольною дошкою? Чи можете ви навести приклад?
Джон Дворак

повторно редагування: я правильно прочитав , що я отримую три очки за це "xo"[i]замість i? Це не здається вартим. Взагалі всі ваші нагороди здаються ніби низькими.
Джон Дворак

"якась картина" - це щось неясне. Чи враховується, якщо я заміню перший "x" на "o"?
Джон Дворак

Приємне запитання. Єдиний цікавий бонус / штраф - це ротаційний. Особисто я б дотримувався одного, жорсткого коду (тобто став пені за замовчуванням) і ліквідував би всі бонуси / штрафи, крім, можливо, ротаційного. Не дуже добре мати занадто багато бонусів або штрафних санкцій. Важливо - чітко вказати головну проблему.
Рівень річки Св.

Відповіді:


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'⍴⍨: створити матрицю такого розміру та заповнити її чергуванням Oта X.


2

CJam, 25 22 21 (31 - 10)

Це функціональний орган. Якщо ви хочете повну програму, додайте ririїї на фронт. Якщо ви хочете використовувати його як блок коду, оточіть його {}. Перевірте це на cjam.aditsu.net .

Він приймає введення як два цілих аргументи: перемикач на те, чи є прямокутник вертикальним (будь-яке ненульове значення) або горизонтальним (нуль), і число Os, яке потрібно використовувати.

: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 справжньою мовою
Джон Дворак

Твоє пояснення ніби не порушено. Ви зараз редагуєте?
Джон Дворак

@JanDvorak Так, я був на півдорозі відредагував його і випадково натиснув Tab і Enter. Це зараз виправлено.

2

JavaScript (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

Python, 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: Я тестував це, але, здається, скопіював неправильну версію. Там було, >де мало бути <. Це зараз виправлено. Дякую за замітку!
Еміль

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 до n.
    • Якщо це так, обчисліть різницю між довжиною та шириною.
    • Якщо його немає, поверніть велику кількість ( n).
  • Візьміть найменші перепади довжини в ширину, щоб найкраще нагадувати квадрат.
  • Використовуйте (надто стислий) String#*метод, щоб «намалювати» квадрат.

Чому мене зняли з посади? Чи містить моя відповідь помилку?
britishtea

У вас помилка друку. Останнє слово має бути "квадратним", а у вас "sqaure". (Я не прихильник, я вказую на цю помилку).
Ісмаїл Мігель

1

APL (Dyalog Unicode) , 30 - 15 = 15 байт SBCS

Анонімна інфіксація лямбда. Приймає N як правий аргумент, а параметр - як лівий аргумент. Прямокутники або матимуть смужки X і O, або будуть викресленими.

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

Спробуйте в Інтернеті!

{} "Dfn"; лівий аргумент (парам), правий аргумент ( N ):

⍳⍵ɩ ndices 1… N

∘.×⍨ таблиця множення цього

⍵= маска, де N дорівнює цьому

ɩ доменні справжніх значень у масці

c← зберігати це в c(для c andidates)

 підрахуйте кандидатів

.5× половина, помножена на це

 стеля (заокруглення)

⊃∘c виберіть цей елемент c

⍴∘'XO' використовувати це для циклічного перетворення "XO"

⍉⍣⍺ перенести, якщо парам


1

05AB1E (спадщина) , оцінка: 7 (22 байти - 15 бонусів)

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

Спробуйте в Інтернеті або перевірте ще кілька тестових випадків .

NСпочатку приймає входи , потім булеве значення ( 0/ 1), чи слід він обертатись чи ні.

Використовує застарілу версію 05AB1E Python, оскільки zip зі списком рядків неявно сплющується та приєднується до символів, на відміну від нової версії для перезапису Elixir 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, а лівий верхній кут - an O. Зайве говорити, що ця схема зберігається при транспортуванні дошки.

Демонстрація: регулярна , перенесена



0

Petit Computer BASIC, 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¶OXдля 1-байтового збереження, але це помилка зараз.)

¿N⟲

Якщо другий вхід є ненульовим, тоді поверніть висновок. (Якщо потрібен 0або 2прийнятний другий вхід , то це може бути ⟲Nдля 1-байтного збереження.)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.