Вызов
Вы будете создавать программу / функцию, которая принимает строковый ввод длины n
и:
- Ставит
kth
символ в центр пространства, гдеk = (n+1)/2
. Это будет местоположение вашего эпицентра. - Помещает остальные непробельные символы случайным образом расположенные вокруг эпицентра. Пифагорейское расстояние от полукокса не должно превышать
n
. - Выводит результат.
Если вам нужны пояснения, см. Пример ниже.
правила
- Применяются стандартные лазейки!
- Ввод / вывод должен быть в форме строки.
- Ввод всегда будет нечетным, чтобы у вас был центральный символ, который нужно поставить на нулевой уровень.
- Каждый действительный результат должен иметь место с ненулевой вероятностью.
Это код-гольф ; самый короткий код в байтах выигрывает!
пример
Входные данные: qwert
Границы взрыва, исходящие из эпицентра (отметки X означают допустимые места для остальных символов):
x
xxxxxxx
xxxxxxxxx
xxxxxxxxx
xxxxxxxxx
xxxxxexxxxx
xxxxxxxxx
xxxxxxxxx
xxxxxxxxx
xxxxxxx
x
Пример вывода:
t
r
q e
w
Ответы:
APL (Dyalog Classic) ,
6866656362 байтаПопробуйте онлайн!
{ }
анонимная функция с аргументом⍵
n←≢⍵
переменнаяn
длинаs←2⍴1+2×n
переменнаяs
- это форма результата: 2n + 1 на 2n + 1''⍴⍨s
создать квадрат пространств с этой формойA@I⊢B
помещает элементыA
в (пары) индексовI
в матрицеB
+.ר⍨n-⍳s
квадрат расстояния от центра матрицы(××n≥*∘.5)
булева матрица, указывающая, где эти расстояния ненулевые и≤n
⍸
координатные пары для 1 в булевой матрицеi[n?≢i← ... ]
выберите n из них случайным образом (без дубликатов)n⊣¨¨@(⊢≡¨⌽)
изменить центральный наn n
⍵@( ... )⊢ ...
положить символы из аргумента по указанным индексам в матрице пространствисточник
JavaScript (ES6), 211
216 220Редактирование 1 байта сохранено thx @usandfriends
Тестовое задание
источник
g.map(r=>r.join``)...
new Date()%h-l
вместоMath.random()*h-l|0
. Это экономит байты.Рубин,
211207203196 символовСпасибо edc65 за 4 персонажа
Объяснение:
->(x){...}
определить анонимную функцию, которая принимает аргументx
x=x.chars
преобразоватьx
из строки в массив односимвольных строкo,b,c=x.size
сохранить длину вводаo
для последующего использования.b
иc
просто надо быть инициализирована что - то , так что сохранить 2 символа путем присоединения к предыдущему заданию.l=o*2+1
это длина / ширина поля, в котором могут находиться все символы, а также диаметр окружности взрыва.Array.new(l){Array.new l,' '}
создайте двумерный массив пространственных символов размераl
xl
a[o][o]=x.delete_at o/2
устанавливает центр массива в центр значенийx
(входных данных), удаляя это значение изx
... while x[0]
запустить блок (в этом случае код передwhile
потому что он встроенный) снова и снова, пока он неx
станет пустым. В ruby возвращается доступ к несуществующему индексуnil
, что является ошибочным значением.a[b=rand(l)][c=rand(l)]==' '
Присвоитьb
иc
случайным значениям, где 0 <= n <l
. Затем проверьтеb
,c
пусто ли место в (aka установлен на пробел)(b-o)**2+(c-o)**2<=o*o
Пифагорейская проверка расстояния.o
длина входа.**
является оператором возведения в степень ruby, иval<=o*o
короче чемval**0.5<=o
.a[b][c]=x.pop
удалить последнее значение изx
. Установить позициюa
,b
равную этому значению в массивеa
a[b][c]=x.pop if a[b=rand(l)][c=rand(l)]==' '&&(b-o)**2+(c-o)**2<=o*o while x[0]
Установите случайную позицию на последнее значение, если эта позиция свободна и находится в радиусе взрыва; продолжайте делать это, пока у нас не закончатся персонажи для размещения.$/
установлен на новую строку операционной системы. Это также короче"\n"
a.map(&:join).join $/
Сопоставьте все массивыa
с однострочной версией самих себя (например,['a','b','c']
->'abc'
). Возьмите этот новый массив и присоедините его с помощью новых строк. Неявный возврат.источник
Python 3 , 286 байт
Попробовать это онлайн это вариант.
Упс, наткнулся на это из-за недавней активности, не заметил, что ему было больше двух лет, пока я не потратил много времени на это. Ну, два ответа довольно грустно, так что это, вероятно, хорошая идея, чтобы опубликовать в любом случае. Я уверен, что есть десятки способов улучшить это - не замечал до сих пор, что входные данные всегда странные, что было бы полезно знать.
объяснение
i=input()
Конечно, входные данныеl=len(i)
сохраняют длину строки, потому что она используется довольно много раз.a=range(-l,l+1)
- быстрый инструмент для создания итератора, измеряющего доступные расстояния от начала координат в обоих направлениях по одному измерению.g=[(y,x)for y in a for x in a]
строит список координат кортежа, который составляет всю окончательную сетку.p=[(y,x)for y,x in g if abs(x+y*1j)<=l and x|y]
создает подмножество списка, содержащего только координаты, на которые могут попадать нецентральные буквы.m=i[l//2]
устанавливает центр персонажа.d=[*i.replace(m,"",1).center(len(p))]
- центральный персонаж убран, оставив нас с другими обломками.center()
Функция очень хорошо здесь, потому что это позволяет нам раздуть из линии (с по умолчанию пробел) до тех пор, пока это определенное количество символов. Здесь указано количество пробелов, на которые могут попасть буквы, что отражает распределение, которое нам нужно.r.shuffle(d)
естественно тасует, что распределение на самом деле ... распределено.Цикл,
for c in g: o+=m if c==(0,0)else d.pop()if c in p else" "
просматривает весь квадрат выполнимых тайлов, независимо от того, что на нем возможно, или нет, и при необходимости добавляет символ в нашу выходную строкуo
. Персонажи выталкиваются из нашего образца обломков, так что они появляются только один раз.if c[1]==l:o+="\n"
- Добавляет также разрывы строк. Возвращает.источник