Ваш код будет генерировать очень простое представление ДНК в ASCII-искусстве, навсегда. В качестве входных данных он будет принимать два числа в любом формате: в виде списка, в качестве аргументов функции, в stdin и т. Д.
- Интервал с плавающей запятой
I
в секундах от 0,0 до 1,0 (включительно) - Уровень масштабирования
Z
в виде целого числа от 1 до 64 (включительно)
Ваш код будет печатать одну строку в стандартный вывод или его эквивалент каждую I
секунду, создавая бесконечный вывод, который выглядит примерно так (для уровня масштабирования 4):
A
T-----a
G-------c
G-----c
g
t-----A
a-------T
c-----G
T
A-----t
C-------g
...
В частности, наше представление ДНК является парой синусоид , соединенных дефисом, один из символов a
, c
, g
и t
, с другой из символов A
, C
, G
и T
. Если x
это индексированный номером 0 строки, которую мы сейчас печатаем, то позиция символа в волне нижнего регистра определяется как 0 (sin(πx / Z) + 1) * Z
, а в волне верхнего регистра - (-sin(πx / Z) + 1) * Z
как округленная (без цвета) до ближайшей целое число. Дальнейшие подробности:
- В случаях, когда две волны перекрываются, вам нужно чередовать, какая волна находится спереди, начиная с заглавной волны. (Начиная с строчной волны, мы получили бы двойную спираль, которой не существует !)
- Игнорируя случай, A всегда соединяется с T и C всегда соединяется с G, как в реальной ДНК. Сами пары должны выбираться случайным образом с равномерным распределением по четырем возможностям. Неважно, если выбор пар одинаков или отличается при последовательных запусках вашего кода. Статистическое качество ваших случайных выборов не является проблемой, если выходные данные не имеют очевидной схемы и периода, по крайней мере, в миллиардах (ошибочные PRNG, такие как RANDU , хороши).
- У вас не должно быть завершающих пробелов или добавьте каждую строку к максимальному положению волн на этом уровне масштабирования (в приведенном выше примере - девять символов). Уровень масштабирования 1 может иметь одно дополнительное дополнительное завершающее пробел по математическим причинам.
Поскольку ДНК маленькая, ваш код должен быть максимально коротким.
Больше примеров:
Уровень масштабирования 8:
T
C-----g
A-----------t
C-------------g
G---------------c
T-------------a
T-----------a
T-----a
c
g-----C
t-----------A
g-------------C
a---------------T
...
Уровень масштабирования 2:
A
T---a
c
g---C
G
A---t
c
a---T
...
Уровень масштабирования 1 (обратите внимание на начальный пробел):
G
a
C
t
...
Ответы:
Ruby, Rev B
171161 байтФиксирование вывода для z = 1 стоит 10 байт. Это особый случай: на самом деле спираль имеет ширину 3 символа, если смотреть на нее под углом 90 градусов, а когда мы смотрим на нее под углом 0 градусов, ширина всего 1 символа.ноль пробелов на z = 1 больше не требуетсяНекоторая экономия за счет исключения скобок и умножения y.abs на 2 перед усечением при расчете необходимого количества символов.
Наконец, я избежал
include Math
(требуется дляsin
иPI
), используя арифметику комплексных чисел со степенями числаi
. Мнимая часть комплексного числа эквивалентна sin x, за исключением того, что оно повторяется с периодом 4 вместо периода 2 * PI. Сохранение для этого изменения было 1 или 0 байтов.Ruby, Rev A 165 байт
Это намного дольше, чем ожидалось. Есть несколько потенциальных возможностей для игры в гольф.
Комментарий в тестовой программе
источник
I=gets.to_i
должно бытьI=gets.to_f
.C
294289285283281270265237218 байтИли более длинная версия, которая анализирует входные данные из main:
Это довольно глупая общая реализация, с некоторыми добавленными трюками printf. Она содержит некоторые недостающие включения, использует синтаксис K & R для функции и использует инициализаторы диапазона GCC, так что это не очень стандартно. Кроме того, версия функции по-прежнему использует глобальные переменные, поэтому ее можно вызывать только один раз!
Версия функции принимает 2 параметра; подождите (в секундах) и увеличьте масштаб. Вот вызывающая сторона для этого:
Беги как:
Сломать:
источник
strtod
иatof
.C
569402361 байтДовольно быстро это удалось, так что я уверен, что есть и другие вещи, которые я мог бы сделать, чтобы уменьшить свой счет, но я просто счастлив, что мне удалось скомпилировать и запустить эту программу с первой попытки.
Де-гольф версия:
ОБНОВЛЕНИЕ: Я настроил цикл для печати всего в одном операторе печати и использовал тот факт, что переменные по умолчанию определены как int, чтобы сбрить некоторые байты. ОБНОВЛЕНИЕ 2: Некоторые переименовывают переменные и некоторые сокращают логику, чтобы сбрить еще несколько байтов.
источник
JavaScript (ES6)
241244227222231 байтЭто выглядело интересно - я люблю искусство ASCII!
Только началось, все еще в процессе игры в гольф ...
--- РЕДАКТИРОВАТЬ: оказывается, я не могу на самом деле положить его в eval () - в противном случае он не может получить доступ к VAR I и Z (поэтому добавляет 9 байтов)
- сэкономил 6 байтов благодаря user81655
- сэкономил 5 байтов благодаря Dave
объяснение
источник
c^=!e
вместоc+=a==b
(позволяет убрать%2
проверку позже). Также-m+2
может быть2-m
!c=c^(e==0)
; он применяет XOR так же, как вы ранее добавили. Если вы не знакомы с XOR, это побитовая операция: eXclusive OR (Википедия может объяснить это правильно)