Desafio
Você criará um programa / função que aceita uma entrada de string de comprimento n
e:
- Coloca o
kth
caractere no centro do espaço, ondek = (n+1)/2
. Este será o local do seu marco zero. - Coloca o restante dos caracteres que não são de espaço em branco dispostos aleatoriamente em torno do ponto zero. A distância pitagórica do carvão não deve exceder
n
. - Mostra o resultado.
Se você precisar de esclarecimentos, veja o exemplo abaixo.
Regras
- Aplicam-se brechas padrão!
- A E / S deve estar na forma de uma sequência.
- A entrada sempre será estranha para garantir que você tenha um caractere central para colocar no ponto zero.
- Toda saída válida deve ocorrer com uma probabilidade diferente de zero.
Isso é código-golfe ; o menor código em bytes vence!
Exemplo
Entrada: qwert
Os limites da explosão que emana do ponto zero (marca de x é um local válido para o resto dos caracteres):
x
xxxxxxx
xxxxxxxxx
xxxxxxxxx
xxxxxxxxx
xxxxxexxxxx
xxxxxxxxx
xxxxxxxxx
xxxxxxxxx
xxxxxxx
x
Exemplo de saída:
t
r
q e
w
Respostas:
APL (Dyalog Classic) ,
6866656362 bytesExperimente online!
{ }
função anônima com argumento⍵
n←≢⍵
variáveln
é o comprimentos←2⍴1+2×n
variávels
é a forma do resultado: 2n + 1 por 2n + 1''⍴⍨s
crie um quadrado de espaços com essa formaA@I⊢B
coloca elementosA
em (pares de) índicesI
na matrizB
+.ר⍨n-⍳s
distâncias ao quadrado do centro da matriz(××n≥*∘.5)
matriz booleana indicando onde essas distâncias são diferentes de zero e≤n
⍸
pares de coordenadas para os 1s na matriz booleanai[n?≢i← ... ]
escolha n deles aleatoriamente (sem duplicatas)n⊣¨¨@(⊢≡¨⌽)
mude o central paran n
⍵@( ... )⊢ ...
coloque os caracteres do argumento nos índices fornecidos na matriz de espaçosfonte
JavaScript (ES6), 211
216 220Editar 1 byte salvo thx @usandfriends
Teste
fonte
g.map(r=>r.join``)...
new Date()%h-l
vez deMath.random()*h-l|0
. Ele salva bytes.Rubi,
211207203196 caracteresAgradecimentos a edc65 por 4 caracteres
Explicação:
->(x){...}
define uma função anônima que recebe um argumentox
x=x.chars
transformarx
de uma sequência em uma matriz de sequências de um caractereo,b,c=x.size
armazene o comprimento da entradao
para uso posterior.b
ec
simplesmente precisa ser inicializado em algo , então salve 2 caracteres anexando a uma tarefa anterior.l=o*2+1
este é o comprimento / largura do campo onde todos os caracteres podem ir, também o diâmetro do círculo de explosão.Array.new(l){Array.new l,' '}
faça uma matriz 2D de tamanhol
xl
de caracteres de espaço.a[o][o]=x.delete_at o/2
define o centro da matriz como o centro dos valores dex
(a entrada), enquanto exclui esse valor dex
... while x[0]
execute o bloco (nesse caso, o código anteriorwhile
porque está embutido) repetidamente atéx
ficar vazio. Em ruby, acessar um índice que não existe retornanil
, que é um valor falsey.a[b=rand(l)][c=rand(l)]==' '
Atribuab
ec
a valores aleatórios onde 0 <= n <l
. Em seguida, verifique se o ponto a partirb
,c
está vazia (aka está definido para caractere de espaço)(b-o)**2+(c-o)**2<=o*o
Verificação de distância de Pitágoras.o
é o comprimento da entrada.**
é o operador de exponenciação do rubi eval<=o*o
é menor queval**0.5<=o
.a[b][c]=x.pop
exclua o último valor dex
. Definir a posiçãoa
,b
para que o valor na matriza
a[b][c]=x.pop if a[b=rand(l)][c=rand(l)]==' '&&(b-o)**2+(c-o)**2<=o*o while x[0]
Defina uma posição aleatória para o último valor se essa posição estiver livre e estiver dentro do raio da explosão; continue fazendo isso até ficarmos sem caracteres para colocar.$/
está definido como a nova linha do sistema operacional. Também é mais curto que"\n"
a.map(&:join).join $/
Mapeie todas as matrizesa
para uma versão de cadeia única (ex:['a','b','c']
->'abc'
). Pegue essa nova matriz e junte-a às novas linhas. Retorno implícito.fonte
Python 3 , 286 bytes
Tentá-lo online é uma opção.
Ops, tropeçou nisso devido a atividade recente, não percebi que tinha mais de dois anos até que passei um bom tempo nisso. Bem, duas respostas são meio tristes, então provavelmente é uma boa ideia postar assim mesmo. Tenho certeza de que há dezenas de maneiras de melhorar isso - não percebi até agora que a entrada é sempre estranha, o que seria útil saber.
Explicação
i=input()
é entrada, é claro,l=len(i)
está salvando o comprimento da string porque é usada algumas vezes.a=range(-l,l+1)
- uma ferramenta rápida para criar um iterador que varia as distâncias disponíveis da origem nos dois sentidos ao longo de uma dimensão.g=[(y,x)for y in a for x in a]
cria uma lista de coordenadas da tupla que compõem toda a grade final.p=[(y,x)for y,x in g if abs(x+y*1j)<=l and x|y]
cria um subconjunto da lista que contém apenas as coordenadas nas quais as letras não centrais podem pousar.m=i[l//2]
estabelece o caractere central.d=[*i.replace(m,"",1).center(len(p))]
- o personagem central é retirado, deixando-nos com os outros detritos. ocenter()
função é muito boa aqui, porque nos permite preencher a linha (com um espaço padrão) até que tenha um certo número de caracteres. Aqui, esse é o número de espaços em que as letras podem pousar, espelhando assim a distribuição que precisamos.r.shuffle(d)
embaralha naturalmente a distribuição para ser realmente ... distribuída.O loop,,
for c in g: o+=m if c==(0,0)else d.pop()if c in p else" "
examina todo o quadrado de blocos viáveis, independentemente de qualquer coisa que possa estar sobre ele ou não, e conforme necessário, adiciona um caractere à nossa string de saídao
. Os caracteres são retirados de nossa amostra de detritos para que apareçam apenas uma vez.if c[1]==l:o+="\n"
- Adiciona quebras de linha também. Retorna.fonte