Вибухають коти!


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 Це модифікація програми для кішок, за винятком того, що ви підірвете вхід.
Mama 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

пар координат для 1s в булевій матриці

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 thx Я не знаю, як я його пропустив
edc65

Використовуйте new Date()%h-lзамість Math.random()*h-l|0. Це економить байти.
ericw31415

1
@ ericw31415 використовувати лише 0. Це також економить байти. Але обидва не працюватимуть
edc65

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,' '}зробити lй lрозмір 2D масиву символів пробілу.

a[o][o]=x.delete_at o/2встановлює центр масиву в центр значень x(вхід), при цьому видаляючи це значення зx

... while x[0]запустіть блок (у цьому випадку код раніше, whileоскільки він є вбудованим) знову і знову, поки не xбуде порожнім. У рубіні доступ до індексу, який не існує, повертається nil, що є значенням фальси.

a[b=rand(l)][c=rand(l)]==' 'Призначте bі cвипадкові значення, де 0 <= n < l. Потім перевірте , якщо пляма на b, cпорожньо (ака набір для символу пробілу)

(b-o)**2+(c-o)**2<=o*oПеревірка відстані Піфагора. o- довжина вводу. **є оператором експозиції рубіну і 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'). Візьміть цей новий масив і приєднайте його до нових рядків. Неявне повернення.


o * o коротше ** 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.