Взрывающиеся кошки!


17

Вызов

Вы будете создавать программу / функцию, которая принимает строковый ввод длины nи:

  1. Ставит kth символ в центр пространства, гдеk = (n+1)/2 . Это будет местоположение вашего эпицентра.
  2. Помещает остальные непробельные символы случайным образом расположенные вокруг эпицентра. Пифагорейское расстояние от полукокса не должно превышатьn .
  3. Выводит результат.

Если вам нужны пояснения, см. Пример ниже.


правила

  • Применяются стандартные лазейки!
  • Ввод / вывод должен быть в форме строки.
  • Ввод всегда будет нечетным, чтобы у вас был центральный символ, который нужно поставить на нулевой уровень.
  • Каждый действительный результат должен иметь место с ненулевой вероятностью.

Это ; самый короткий код в байтах выигрывает!


пример

Входные данные: qwert

Границы взрыва, исходящие из эпицентра (отметки X означают допустимые места для остальных символов):

     x
  xxxxxxx
 xxxxxxxxx
 xxxxxxxxx
 xxxxxxxxx
xxxxxexxxxx
 xxxxxxxxx
 xxxxxxxxx
 xxxxxxxxx
  xxxxxxx
     x

Пример вывода:

       t
     r

q    e


      w

Выбирая позицию случайным образом, один символ может перейти в ту же позицию другого и перезаписать его. Это разрешено? (Мое предложение: нет)
edc65

Вы правы: Нет.
Mama Fun Roll

1
Какое это имеет отношение к взрыву? (Я действительно не понимаю актуальность названия ...)
кошка

1
@cat Это модификация программы cat, за исключением того, что вы взорвали ввод.
Мама Fun Roll

Ответы:


0

APL (Dyalog Classic) , 68 66 65 63 62 байта

{⍵@(n⊣¨¨@(⊢≡¨⌽)i[n?≢i←⍸(××n≥*∘.5)+.ר⍨n-⍳s])⊢''⍴⍨s21+2×n←≢⍵}

Попробуйте онлайн!

{ } анонимная функция с аргументом

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

⍵@( ... )⊢ ... положить символы из аргумента по указанным индексам в матрице пространств


3

JavaScript (ES6), 211 216 220

Редактирование 1 байта сохранено thx @usandfriends

s=>[...s].map((c,i)=>{for(R=_=>Math.random()*h-l|0;x=R(y=R()),!(i-(l/2|0)?x|y&&x*x+y*y<=l*l&g[y+=l][x+=l]<'!':x=y=l););z=[...g[y]],z[x]=c,g[y]=z.join``},l=s.length,g=Array(h=l-~l).fill(' '.repeat(h)))&&g.join`
`

Тестовое задание

f=s=>[...s].map((c,i)=>{for(R=_=>Math.random()*h-l|0;x=R(y=R()),!(i-(l/2|0)?x|y&&x*x+y*y<=l*l&g[y+=l][x+=l]<'!':x=y=l););z=[...g[y]],z[x]=c,g[y]=z.join``},l=s.length,g=Array(h=l-~l).fill(' '.repeat(h)))&&g.join`
`

// Less golfed
U=s=>(
  l=s.length,
  h=l-~l, // l+l+1
  g=Array(h).fill(' '.repeat(h)),
  [...s].map((c,i)=>{
    for(R=_=>Math.random()*h-l|0;
        x=R(y=R()), // set x,y to a random value in range -l ... l
        !(i - (l/2|0) // check if at mid point of input string
          ? x|y && // if not, check x and y must not be both 0
            x*x + y*y <= l*l &  // then check position inside the circle of ray L
            g[y+=l][x+=l] < '!' // then add offset L and check if position is not already used 
          : x=y=l // if at midpoint in input string, x and y have fixed value L
         );
       ); // loop until valid position found
    z = [...g[y]];  // modify string at current position: convert to array ...
    z[x] = c;       // ... set element ...
    g[y] = z.join`` // ... back to string
  }),
  g.join`\n`
)  

setInterval(_=>O.textContent=(f(I.value)),1000)
Word <input id=I value='qwert'><pre id=O></pre>


У вас есть дополнительное место передg.map(r=>r.join``)...
usandfriends

@usandfriends спасибо, я не знаю, как я это пропустил
edc65

Используйте new Date()%h-lвместо Math.random()*h-l|0. Это экономит байты.
ericw31415

1
@ ericw31415 использует только 0. Это также экономит байты. Но оба не
сработают

2

Рубин, 211 207 203 196 символов

Спасибо edc65 за 4 персонажа

->(x){x=x.chars
o,b,c=x.size
l=o*2+1
a=Array.new(l){Array.new l,' '}
a[o][o]=x.delete_at o/2
a[b][c]=x.pop if a[b=rand(l)][c=rand(l)]==' '&&(b-o)**2+(c-o)**2<=o*o while x[0]
a.map(&:join).join $/}

Объяснение:

->(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,' '}создайте двумерный массив пространственных символов размера lxl

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'). Возьмите этот новый массив и присоедините его с помощью новых строк. Неявный возврат.


о * о короче ** 0,5
edc65

0

Python 3 , 286 байт

import random as r
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))]
r.shuffle(d)
o=""
for c in g:
	o+=m if c==(0,0)else d.pop()if c in p else" "
	if c[1]==l:o+="\n"
print(o)

Попробовать это онлайн это вариант.

Упс, наткнулся на это из-за недавней активности, не заметил, что ему было больше двух лет, пока я не потратил много времени на это. Ну, два ответа довольно грустно, так что это, вероятно, хорошая идея, чтобы опубликовать в любом случае. Я уверен, что есть десятки способов улучшить это - не замечал до сих пор, что входные данные всегда странные, что было бы полезно знать.

объяснение

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"- Добавляет также разрывы строк. Возвращает.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.