ASCII Doodling: Лазер у коробці


31

Іноді, коли я малюю, я малюю прямокутник, починаю з діагоналі від одного з кутів, а потім просто простежую лінію, "відбиваючи" її щоразу, коли потрапляю в бік прямокутника. Я продовжую це, поки не потрапляю на інший кут прямокутника (і сподіваюся, що співвідношення сторін мого прямокутника не було ірраціональним;)). Це як би простежити шлях лазера, засяяного у коробці. Ви повинні зробити результат цього за допомогою мистецтва ASCII.

Як приклад розглянемо коробку шириною 5та висотою 3. Ми завжди почнемо у верхньому лівому куті. В #відзначає межу вікна. Зверніть увагу, що ширина і висота стосуються внутрішніх розмірів.

#######    #######    #######    #######    #######    #######    #######
#\    #    #\    #    #\   \#    #\  /\#    #\  /\#    #\/ /\#    #\/\/\#
# \   #    # \  /#    # \  /#    # \/ /#    # \/ /#    #/\/ /#    #/\/\/#
#  \  #    #  \/ #    #  \/ #    # /\/ #    #\/\/ #    #\/\/ #    #\/\/\#
#######    #######    #######    #######    #######    #######    #######

Змагання

Враховуючи (позитивну) ширину та висоту коробки, ви повинні отримати остаточний результат відстеження лазера. Ви можете написати програму або функцію, взявши введення через STDIN (або найближчу альтернативу), аргумент командного рядка, аргумент функції та вивести результат за допомогою STDOUT (або найближчої альтернативи) або через значення повернення функції або аргументи.

Ви можете використовувати будь-який зручний список, рядок або формат чисел для введення. Вихід повинен бути одним рядком (якщо ви не надрукуєте його в STDOUT, що, звичайно, ви можете робити поступово). Це також означає, що ви можете взяти висоту першої та ширину другу - просто вкажіть точний формат введення у своїй відповіді.

У жодному рядку виводу не повинно бути ні провідної, ні пробільної пробілів. Ви можете необов'язково виводити один зворотний рядок.

Ви повинні використовувати простір, /, \і #та відтворювати тестові випадки точно так , як показано на малюнку.

Випробування

2 2
####
#\ #
# \#
####

3 2
#####
#\/\#
#/\/#
#####

6 3
########
#\    /#
# \  / #
#  \/  #
########

7 1
#########
#\/\/\/\#
#########

1 3
###
#\#
#/#
#\#
###

7 5
#########
#\/\/\/\#
#/\/\/\/#
#\/\/\/\#
#/\/\/\/#
#\/\/\/\#
#########

22 6
########################
#\  /\  /\  /\  /\  /\ #
# \/  \/  \/  \/  \/  \#
# /\  /\  /\  /\  /\  /#
#/  \/  \/  \/  \/  \/ #
#\  /\  /\  /\  /\  /\ #
# \/  \/  \/  \/  \/  \#
########################

1
Можливо, приємне наступне питання, як тільки цей пробіжить свій шлях, полягає в тому, щоб зробити це завдання з довільною формою коробок і вихідних точок.
Санчіз

@sanchises Я насправді вважав це (і може все-таки розмістити його), але вирішив піти з прямокутником, сподіваючись, що хтось може придумати чітку формулу. Я також розглядав декілька вихідних точок, таких, які Xбули б необхідні для переїздів. Можливо, наступного разу. ;)
Мартін Ендер


Це було б ідеально для анімаційного пункту. "Анімація 1 сплеск (одна коса коса) 1 цикл / нескінченний"
Martijn

Відповіді:


20

Pyth, 43 41 39 байт

K*\#+2QKVvzp<*QXX*dyivzQN\\_hN\/Q\#\#)K

Спробуйте в Інтернеті: компілятор / виконавець Pyth . Введіть числа у такому порядку: висота першого рядка, ширина другого рядка.

Завдяки isaacg, який допоміг зберегти два байти.

Пояснення:

У моєму рішенні не простежується лазер, він використовує просту модель, що включає в себе gcd. Якщо m, nце розміри коробки, нехай d = gcd(m, n). Розмір візерунка рівно 2*d x 2*d.

Наприклад, шаблон, що повторюється для 7 5

#########
#\/\/\/\#
#/\/\/\/#
#\/\/\/\#
#/\/\/\/#
#\/\/\/\#
#########

є

\/
/\

( gcd(7, 5) = 1, розмір візерунка 2 x 2)

І повторюваний зразок для 22 6

########################
#\  /\  /\  /\  /\  /\ #
# \/  \/  \/  \/  \/  \#
# /\  /\  /\  /\  /\  /#
#/  \/  \/  \/  \/  \/ #
#\  /\  /\  /\  /\  /\ #
# \/  \/  \/  \/  \/  \#
########################

є

\  /
 \/ 
 /\
/  \

( gcd(22, 6) = 2, розмір візерунка 4 x 4)

Моє рішення робить наступне для кожного з рядків: він просто генерує одну лінію шаблону, повторює її кілька разів і вирізає в кінці, щоб вона вмістилася у вікно.

K*\#+2QK   implicit: Q is the second input number (=width)
K          K = 
 *\#+2Q        "#" * (2 + Q)
       K   print K (first line)

Vvzp<*QXX*dyivzQN\\_hN\/Q\#\#)K  implicit: vz is the first input number (=height)
VQ                               for N in [0, 1, ..., vz-1]:
           ivzQ                             gcd(vz,Q)
          y                               2*gcd(vz,Q)
        *d                           string with 2*gcd(vz,Q) space chars
       X       N\\                   replace the Nth char with \
      X           _hN\/              replace the -(N+1)th char with /
    *Q                               repeat Q times
   <                   Q           only use the first Q chars
  p                     \#\#       print "#" + ... + "#"
                            )    end for
                             K   print K

Оскільки Xпідтримує «призначення» для рядків, ви можете змінити , m\ щоб *dі видалити s.
isaacg

@isaacg Хороший дзвінок. Я думав про використання *\ замість цього m\ недовго, але відкиньте його, оскільки він має однаковий розмір. Не думав про змінну dта непотрібну s.
Якубе

11

C, 256 байт

f(w,h){int i,j,x=1,y=1,v=1,u=1;char b[h+2][w+3];for(i=0;i<w+3;i++)for(j=0;j<h+2;j++)b[j][i]=!i||!j||i>w||j>h?i>w+1?0:35:32;while((x||y)&&(x<=w||y<=h))v=x&&w+1-x?v:(x-=v,-v),u=y&&h+1-y?u:(y-=u,-u),b[y][x]=v/u<0?47:92,x+=v,y+=u;for(i=0;i<h+2;i++)puts(b[i]);}

Можливо, я можу отримати це менше, ніж 200, і пояснення додаду пізніше, але я можу мати паперовий документ через кілька годин, який я повинен робити замість цього.


27
Підроблені інтернет-бали коштують більше, ніж ступінь освіти, я впевнений у цьому.
Адам Девіс


5

J, 85 байт

Нехай g = gcd(w,h). Функція заповнює елементи w/g by h/gматриці g by gплитками, що мають діагоналі та діагоналі /'s та \s'. Отриманий 4D масив обробляється в 2D (всередині коробки), а потім оточується #'s. (Номери 0 1 2 3використовуються замість, [space] / \ #а цифри змінюються на символи в кінці.)

Обчислення внутрішньої координати на основі прямого положення може, можливо, дати трохи коротше рішення.

' \/#'echo@:{~3,.~3,.3,~3,,$[:,[:,"%.0 2 1 3|:((,:2*|.)@=@i.@+.){~[:(2&|@+/&:i.)/,%+.

Використання:

   6 (' \/#'echo@:{~3,.~3,.3,~3,,$[:,[:,"%.0 2 1 3|:((,:2*|.)@=@i.@+.){~[:(2&|@+/&:i.)/,%+.) 22
########################
#\  /\  /\  /\  /\  /\ #
# \/  \/  \/  \/  \/  \#
# /\  /\  /\  /\  /\  /#
#/  \/  \/  \/  \/  \/ #
#\  /\  /\  /\  /\  /\ #
# \/  \/  \/  \/  \/  \#
########################

Спробуйте його онлайн тут.


0

Калькулятор Десмосу - не конкуруючи, щоб допомогти подальшим знанням

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

Вхідні дані:

h as height of box, with 0-indexing
w as width of box, with 0-indexing

Проміжні продукти:

Let b = gcd(h,w),
Let c = |b-h%2b| Or |b-mod(h,2b)|

Формула, скорочено:

(|b-(x+y)%2b|-c)(|b-(x-y)%2b|-c)=0

Виходи:

x as x position, 0-indexed, where the ball will land when released
y as y position, 0-indexed, where the ball will land when released

Як це працює:

(|b-(x+y)%2b|-c)*(|b-(x-y)%2b|-c)=0
                ^ OR operation - |b-(x+y)%2b|-c=0 or |b-(x-y)%2b|-c=0
|b-(x+/-y)%2b|-c = 0
|b-(x+/-y)%2b| = c
|b-(x+/-y)%2b| = c means (b-(x+/-y))%2b = + or -c 
b-(x+/-y)%2b = +/- c -> b +/- c = (x+/-y)%2b -> (x+/-y) = n*2*b + b +/- c 
Where n is integer.  This will force patterns to repeat every 2b steps in x and y.  
Initial pattern n=0: (x +/- y) = b +/- c -> y = +/- x + b +/- c
In the x positive and y positive plane only, these correspond to lines of positive and 
negative slope, set at intercept b, offset by c on either side.

Програма не відповідає кінцевому критерію - генеруючи мистецтво коробки та ліній ASCII, тому я подаю інформацію як неконкурентоздатну інформацію, щоб допомогти іншим виконати завдання. Зауважимо, що для того, щоб Десмос працював, коли c = 0 або c = b, був введений невеликий коефіцієнт зміщення 0,01, оскільки Десмос, здається, має межі Mod (A, B) (0, B) замість [0, B )

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