Geralmente, diz-se que "Fazer X sem Y" pode ser uma armadilha para iniciantes que escrevem desafios ( fonte ). No entanto, sou arrogante e acho que posso definitivamente fazer um X sem Ys. Aleatoriamente. Oh sim, isso será bom.
Desafio: Dado um número inteiro ímpar n
maior ou igual a 1, produza um ex de comprimento lateral n
feito de caracteres ascii imprimíveis aleatórios sans "y" e "Y" e o espaço. Todos os caracteres permitidos devem ter uma chance diferente de zero, mas não necessariamente uniforme. Este é um código de golfe, portanto o código mais curto em bytes vence. Você deve, no entanto, escolher aleatoriamente cada caractere - ou seja, os braços do ex não devem ser iguais, a menos que por acaso.
Os caracteres a aparecer
!#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXZ[\]^_`abcdefghijklmnopqrstuvwxz{|}~"
Construindo o ex
Comprimento lateral 1:
x
Comprimento lateral 3:
x x
x
x x
Comprimento lateral 5:
x x
x x
x
x x
x x
etc.
Saídas de exemplo
input
output
empty line
3
h 2
^
9 5
1
:
5
D 1
W z
W
q j
W 1
Implementação de exemplo
Você não precisa manipular entradas inválidas.
!
para~
sansy
eY
y
e然
.Respostas:
Pitão,
28272625 bytesSuíte de teste.
fonte
~
personagem, porque o intervalo não o inclui. Você pode corrigir isso alterando~
o código no caractere literal DEL.Ruby, 102 bytes
Array#sample
não faz repetições para amostragem do conjunto de caracteres, mas tudo bem, porque a distribuição de caracteres não precisa ser perfeitamente uniforme! Função recursiva, retorna uma matriz de linhas.Experimente online!
fonte
Na verdade, 62 bytes
Este é um dos programas mais longos que já escrevi.
Experimente online!
Explicação:
Parte 1 : configurando a lista de caracteres
Experimente online!
Parte 2 : construindo a matriz booleana para um X
Experimente online!
Parte 3 : escolhendo caracteres aleatórios
Experimente online!
fonte
Mathematica, 146 bytes
Função anônima. Pega um número como entrada e retorna uma string como saída.
fonte
Python 2, 171 bytes
Garantido para escolher caracteres aleatórios com probabilidade uniforme.
Experimente aqui: link ideone
EDIT: Agradecimentos a Morgan Thrapp pelas correções.
fonte
from random import*
economiza 2 bytes. Você também pode associar as duas primeiras linhas doj
loop com um ponto e vírgula para salvar alguns bytes. (Também acreditoZ
e{
têm uma maior probabilidade de ocorrer do que algumas outras cartas, não que isso importa para a questão)bool(i^j and i^-j)
->i not in(j,-j)
Python,
142139135 bytesEsta é uma implementação direta e cria o caractere quadrado por caractere. Se o caractere estiver na diagonal : use um caractere aleatório; else : use um espaço. Isso também usa uma substituição de regex e int aleatório para gerar não Ycaracteres:
Explicação [Antiga]
Atualizar
import*
- Graças a @KevinLaufonte
randint
provavelmente é mais curto para seus propósitos, maisfrom random import*
. Além disso, remova parte desse espaço em branco desnecessário.[i,33][i in(89,121)]
funciona em vez disso, necessitando de um ternário de longo prazo em suaf
função! Também veja se você pode remover o espaço que é logo após suasprint
declaraçõesre.sub("y|Y","t",chr(random.randint(33,126))+' ')[j!=i!=x-j-1]
salva 6 bytes sobre a... if ... else ...
construção.Dyalog APL , 35 bytes
⎕
solicitar o número⍳
1 através dessa∘.=⍨
tabela de igualdade de números (ou seja, a diagonal possui 1s)(⊢∨⌽)
OU sua imagem espelhada (fornece as duas diagonais)95×
multiplicar por 95?
rand int entre 1 e 95 para as diagonais, rand flutuar entre 0 e 1 para o restante⌊
andar se livrar dos carros alegóricos,(⊢+∊∘57 89)
adicione um aos elementos que são membros de {57,89} (AA - 32)32+
adicione 32 para transformar os 0s em espaços e outros números no intervalo apropriado⎕UCS
convertam em textoTryAPL !
fonte
Python 2.7, 205 bytes:
Experimente Online! (Ideona)
fonte
MATL , 28 bytes
Experimente online!
Todos os caracteres permitidos têm a mesma probabilidade de aparecer. Também funciona para entrada uniforme.
fonte
C, 154 bytes (ou 119 sem a placa da caldeira)
Ou 119 bytes como uma função
X(h)
comsrand(time(0))
cuidado em outro lugar:Demolir:
fonte
código de máquina x86, 70 bytes
Meu código executável, desmontado:
É uma função que recebe o tamanho do X em ecx e um ponteiro para o buffer de saída em edx.
Ele preenche o buffer de saída sequencialmente com bytes. Existem
2 * n - 1
iterações (iguais ao número de caracteres não espaciais para saída). Em cada iteração, ele faz o seguinte:A conversão de um número aleatório para um caractere aleatório não é notável:
A parte interessante é o cálculo do número de espaços. Ele deve gerar os seguintes números (exemplo para N = 9):
Os números são obtidos alternadamente de duas progressões aritméticas. O primeiro desce com o passo -2 e o segundo com o passo 1. Quando a primeira progressão chega a -1 (no meio do X), há uma falha (-1 é removida) e depois as progressões mudam de direção.
As progressões são armazenadas em registradores
ebx
eedx
- as partes altasbh
edh
armazenam o número atual, e as partes baixasbl
edl
armazenam a etapa. Para alternar entre as progressões, o código troca os registros comxchg
.Quando a progressão chega a -1 (ao redor do
mylab
rótulo), aumenta os dois registros, alternando as etapas de-2, 1
para-1, 2
. Isso também muda as funções dos registros, e então troca as partes altas dos registros.No final da função, ele armazena um byte zero para indicar o final da string.
fonte
Lua, 277 bytes
Bem ... Lua é muuuito bom em manipular strings: D. Primeira vez eu tive que usar
local
em uma declaração! Eu poderia salvar alguns bytes usando Lua 5.1 em vez de 5.3, porque eles moveram a função globalunpack
para o objetotable
em Lua 5.2. Mas eu prefiro ficar com a versão mais recente que tenho :).Define uma função que deve ser chamada com um único parâmetro (o segundo é usado para fins de recursão) e retorna uma string.
Ungolfed
fonte
JavaScript (ES6),
137131125 bytesOnde
\n
representa o caractere literal de nova linha. Editar: salvou 1 byte movendo o' '
interior daString.fromCharCode
expressão. Economizei 5 bytes, tornando minha geração aleatória de caracteres não uniforme; a expressãor+72&95
é zero para os valores que são mapeados paraY
ey
e um!
é gerado em seu lugar. Salvei 4 bytes quando percebi que a propagaçãoString.fromCharCode
evita a necessidadejoin
. Economizou 2 bytes roubando um truque de @ edc65.fonte
PowerShell v2 +, 112 bytes
Lê a entrada na linha de comando.
Para cada linha, é criada uma matriz de espaços, os índices corretos são preenchidos com caracteres extraídos da função e
f
, em seguida, a matriz de caracteres é unida à saída como uma linha.fonte
[char]
exterior elenco deRandom
, e lançando a-join
ser um operador unário ---Param($i)function f{[char](Random(33..126-ne121-ne89))};1..$i|%{$a=,' '*$i;$a[$_-1]=f;$a[$i-$_]=f;-join$a}
function
equivalente do PowerShell por um lambda e usar o operador&
de chamada para chamá-lo. O seguinte é 103 bytesParam($i)$z={[char](Random(33..126-ne121-ne89))};1..$i|%{$a=,' '*$i;$a[$_-1]=&$z;$a[$i-$_]=&$z;-join$a}
-ne
, movendo o[char]
elenco para um[char[]]
elenco$a
(trocando' '
por32
no processo) e movendo$z
a definição para uma parênteses na primeira vez que é chamado. Abaixo de 99 (woo! Sub-100!)Param($i)1..$i|%{$a=,32*$i;$a[$_-1]=&($z={Random(33..126-ne121,89)});$a[$i-$_]=&$z;-join[char[]]$a}
$a
a definição para parênteses na primeira vez em que for usada. Para baixo para 98 agora -Param($i)1..$i|%{($a=,32*$i)[$_-1]=&($z={Random(33..126-ne121,89)});$a[$i-$_]=&$z;-join[char[]]$a}
Eu acho que vou parar por aqui ;-) heheMATLAB, 86 bytes
Alguns exemplos:
fonte
changem
! Ótimo nome!Pip , 33 bytes
32 bytes de código, +1 para
-l
sinalizador. Curiosamente, o código começa comY
e termina comy
...Recebe entrada como um argumento de linha de comando. Experimente online!
Explicação
Constrói uma grade do tamanho apropriado; substitui elementos nas diagonais por um caractere não y aleatório e todos os outros elementos por espaço.
fonte
php, 135 bytes
A abordagem bastante direta usa str_pad para criar uma série de espaços com o comprimento necessário, substitui os caracteres necessários por caracteres aleatórios, substitui qualquer Y (sem distinção entre maiúsculas e minúsculas) por X e ecoa a linha.
Gera avisos 2n + 3, mas, como sempre, tudo bem.
fonte
Emacs Lisp, 269 bytes
Ungolfed e ligeiramente modificado:
fonte
JavaScript (ES6), 128
131Editar 3 bytes salvos thx @Neil
Tão volumoso, provavelmente não é a melhor abordagem. Bônus - funciona com entrada ímpar ou par.
fonte
r+7&31
dá o mesmo resultado que(r&31)-25
.C, 268 bytes
Ligue
f()
com o tamanho dox
empate.fonte
srand
dentro de suas funções, elas não podem confiar no estado global. No entanto, você pode obter um programa muito mais curto com dois loops aninhados e usando o caractere backspace. A solução geral pode parecer isso , mas acho que uma variante específica do Windows usandoclock
seria válida.gcc version 4.8.1
Windows egcc version 5.3.0
no Cygwin, ele não funciona ... (no IdeOne Works)Matrizes , 79 bytes (não concorrentes)
Matricks se destaca como o início de fazer x e todos os valores aleatórios, mas falha quando se trata de condicionais ...
Marquei isso como não-concorrente porque tive que corrigir alguns bugs e colocar todos os novos recursos em funcionamento após o lançamento deste desafio.
Correr com
python matricks.py x.txt [[]] <input> --asciiprint
Explicação:
Isso também suporta números pares.
fonte
Python 2,
204191183 bytesOk, a competição Python aqui está ficando acirrada. Aqui está minha tentativa de raspar o máximo de bytes possível.
Até agora eu estou preso(Ok, preso novamente).Créditos para @NonlinearFruit pela maneira como os caracteres aleatórios são selecionados.
Versão de 183 bytes:
Experimente Online! (Ideona)
A principal mudança é reescrever a condição
Como
que economiza 7 bytes.
Versão de 191 bytes:
Experimente Online! (Ideona)
As principais alterações são a maneira como os caracteres aleatórios são selecionados e alguns rearranjos de código, como
s=input();i=s;
tornar-ses=i=input();
, remover ar=range
atribuição, pois não é mais necessária e chamarabs
diretamente, pois resulta em menos bytes de código.Superando a resposta mais curta anterior em Python por 1 byte!@R. A abordagem de Kap é usada para gerar os caracteres aleatórios. Cada iteração do loop while é impressa uma linha do ex.Versão de 204 bytes :
Experimente Online! (Ideona)
Versão ungolfed para ter uma idéia de como funciona:
Era difícil lidar com o gabinete de 1 caractere!
fonte
SmileBASIC, 97 bytes
Em vez de ter que calcular o número de espaços entre cada caractere ou algo assim, decidi imprimir em todos os locais onde
X==Y
ouX+Y==Size+1
.O gerador de caracteres aleatórios apenas adiciona 1 se gera
y
ouY
, portanto,z
eZ
é um pouco mais comum que o normal.fonte
PHP, 100 bytes
recebe entrada do argumento da linha de comando; corra com
-nr
.loop combinado imprime caracteres dependendo da posição
demolir
fonte