Por lo general, se dice que "Hacer X sin Y" puede ser una trampa para los principiantes que escriben desafíos ( fuente ). Sin embargo, soy arrogante y creo que definitivamente puedo hacer una X sin ninguna Y. Al azar Oh sí, esto será bueno.
Desafío: dado un número entero impar n
mayor o igual a 1, genera un ex de longitud lateral n
hecha de caracteres ascii imprimibles al azar sin "y" e "Y", y el espacio. Todos los caracteres permitidos deben tener una probabilidad distinta de cero, pero no necesariamente uniformes. Este es un código de golf, por lo que gana el código más corto en bytes. Sin embargo, debes aleatorizar cada carácter, es decir, los puntales del ex no deberían ser iguales, a menos que sea por casualidad.
Los caracteres que aparecerán
!#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXZ[\]^_`abcdefghijklmnopqrstuvwxz{|}~"
Construyendo el ex
Longitud lateral 1:
x
Longitud lateral 3:
x x
x
x x
Longitud lateral 5:
x x
x x
x
x x
x x
etc.
Salidas de ejemplo
input
output
empty line
3
h 2
^
9 5
1
:
5
D 1
W z
W
q j
W 1
Implementación de ejemplo
No necesita manejar entradas inválidas.
!
a~
sansy
yY
y
y然
.Respuestas:
Pyth,
28272625 bytesBanco de pruebas.
fuente
~
personaje, porque el rango no lo incluye. Puede arreglar esto cambiando~
el código en el carácter DEL literal.Ruby, 102 bytes
Array#sample
no hace repeticiones para el muestreo del conjunto de caracteres, pero está bien porque la distribución de caracteres no tiene que ser perfectamente uniforme. Función recursiva, devuelve una matriz de líneas.Pruébalo en línea!
fuente
En realidad, 62 bytes
Este es uno de los programas más largos que he escrito.
Pruébalo en línea!
Explicación:
Parte 1 : configurar la lista de personajes
Pruébalo en línea!
Parte 2 : construir la matriz booleana para una X
Pruébalo en línea!
Parte 3 : elegir personajes aleatorios
Pruébalo en línea!
fuente
Mathematica, 146 bytes
Función anónima. Toma un número como entrada y devuelve una cadena como salida.
fuente
Python 2, 171 bytes
Garantizado para elegir personajes aleatorios con probabilidad uniforme.
Pruébelo aquí: enlace ideone
EDITAR: Gracias a Morgan Thrapp por las correcciones.
fuente
from random import*
ahorra 2 bytes. También puede unir las dos primeras líneas delj
bucle con un punto y coma para guardar algunos bytes. (También creoZ
y{
tengo una mayor probabilidad de ocurrir que algunas otras cartas, no es que sea importante para la pregunta)bool(i^j and i^-j)
->i not in(j,-j)
Python,
142139135 bytesEsta es una implementación sencilla de crear el carácter cuadrado por carácter. Si el personaje está en diagonal : usa un carácter aleatorio, de lo contrario : usa un espacio. Esto también utiliza una sustitución de expresiones regulares y un int aleatorio para generar no Ycaracteres:
Explicación [Antiguo]
Actualizar
import*
- Gracias a @KevinLaufuente
randint
es probablemente más corto para tus propósitos, másfrom random import*
. Además, elimine parte de ese espacio en blanco innecesario.[i,33][i in(89,121)]
¡Funciona en cambio necesitando un ternario de largo aliento en suf
función! También vea si puede eliminar el espacio que está justo después de susprint
declaracionesre.sub("y|Y","t",chr(random.randint(33,126))+' ')[j!=i!=x-j-1]
ahorra 6 bytes sobre la... if ... else ...
construcción.Dyalog APL , 35 bytes
⎕
solicite el número⍳
1 a través de esa∘.=⍨
tabla de igualdad de números (es decir, la diagonal tiene 1s)(⊢∨⌽)
O su imagen especular (da ambas diagonales) se95×
multiplica por 95?
rand int entre 1 y 95 para las diagonales, y flota entre 0 y 1 para el⌊
piso de descanso deshacerse de los flotadores(⊢+∊∘57 89)
agregue uno a los elementos que son miembros de {57,89} (Yy - 32)32+
agregue 32 para convertir los 0 en espacios, y otros números en el rango adecuado se⎕UCS
convierten en textoTryAPL !
fuente
Python 2.7, 205 bytes:
¡Pruébelo en línea! (Ideona)
fuente
MATL , 28 bytes
Pruébalo en línea!
Todos los personajes permitidos tienen la misma probabilidad de aparecer. Funciona incluso para entrada también.
fuente
C, 154 bytes (o 119 sin la placa de caldera)
O 119 bytes como una función
X(h)
consrand(time(0))
cuidado en otro lugar:Descompostura:
fuente
código de máquina x86, 70 bytes
Mi código ejecutable, desmontado:
Es una función que recibe el tamaño de la X en ecx, y un puntero al búfer de salida en edx.
Llena el búfer de salida secuencialmente con bytes. Hay
2 * n - 1
iteraciones (igual al número de caracteres que no son espaciales para generar). En cada iteración, hace lo siguiente:La conversión de un número aleatorio a un carácter aleatorio no es notable:
La parte interesante es el cálculo del número de espacios. Debe generar los siguientes números (ejemplo para N = 9):
Los números se toman alternativamente de dos progresiones aritméticas. El primero baja con el paso -2, y el segundo sube con el paso 1. Cuando la primera progresión llega a -1 (en el medio de la X), hay una falla (se elimina -1), y luego Las progresiones cambian de dirección.
Las progresiones se almacenan en registros
ebx
yedx
- las partes altasbh
ydh
almacenan el número actual, y las partes bajasbl
ydl
almacenan el paso. Para alternar entre las progresiones, el código intercambia los registros conxchg
.Cuando la progresión llega a -1 (alrededor de la
mylab
etiqueta), aumenta ambos registros, cambiando los pasos de-2, 1
a-1, 2
. Esto también cambia las funciones de los registros, por lo que intercambia las partes altas de los registros.Al final de la función, almacena un byte cero para indicar el final de la cadena.
fuente
Lua, 277 bytes
Bueno ... Lua es muuuy buena manipulando cuerdas: D. Primera vez que tuve que usar
local
en una declaración! Podría guardar algunos bytes usando Lua 5.1 en lugar de 5.3 porque movieron la función globalunpack
al objetotable
en Lua 5.2. Pero prefiero seguir con la última versión que tengo :).Define una función que debería llamarse con un único parámetro (el segundo se usa para fines de recursividad) y devuelve una cadena.
Sin golf
fuente
JavaScript (ES6),
137131125 bytesDonde
\n
representa el carácter literal de nueva línea. Editar: guardado 1 byte moviendo el' '
interior de laString.fromCharCode
expresión. Ahorré 5 bytes haciendo que mi generación aleatoria de caracteres no sea uniforme; la expresiónr+72&95
es cero para los valores que se asignan aY
yy
y!
se genera un en su lugar. Guarde 4 bytes cuando me di cuenta de que la propagaciónString.fromCharCode
evita tener que hacerlojoin
. Ahorró 2 bytes al robar un truco de @ edc65.fuente
PowerShell v2 +, 112 bytes
Lee la entrada de la línea de comando.
Para cada línea, se crea una matriz de espacios, los índices correctos se completan con caracteres extraídos de la función
f
, luego la matriz de caracteres se une a la salida como una línea.fuente
[char]
elenco fuera deRandom
, y volteando-join
para ser un operador unario ---Param($i)function f{[char](Random(33..126-ne121-ne89))};1..$i|%{$a=,' '*$i;$a[$_-1]=f;$a[$i-$_]=f;-join$a}
function
con el equivalente de PowerShell de un lambda y usar el operador&
de llamada para llamarlo. El siguiente es 103 bytes -Param($i)$z={[char](Random(33..126-ne121-ne89))};1..$i|%{$a=,' '*$i;$a[$_-1]=&$z;$a[$i-$_]=&$z;-join$a}
-ne
, moviendo el[char]
molde a ser un[char[]]
yeso en$a
(el canje' '
de32
en el proceso), y moviendo$z
's definición en un parens la primera vez que se llama. Hasta 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
la definición a un parens la primera vez que se usa. Hasta 98 ahora -Param($i)1..$i|%{($a=,32*$i)[$_-1]=&($z={Random(33..126-ne121,89)});$a[$i-$_]=&$z;-join[char[]]$a}
Creo que me detendré aquí ;-) jejeMATLAB, 86 bytes
Algunos ejemplos:
fuente
changem
. ¡Gran nombre!Pip , 33 bytes
32 bytes de código, +1 para
-l
bandera. Por extraño que parezca, el código comienzaY
y termina cony
...Toma entrada como un argumento de línea de comando. Pruébalo en línea!
Explicación
Construye una cuadrícula del tamaño apropiado; reemplaza elementos en las diagonales con un carácter aleatorio que no sea y, y todos los demás elementos con espacio.
fuente
php, 135 bytes
El enfoque bastante sencillo usa str_pad para hacer una cadena de espacios de la longitud requerida, reemplaza los caracteres necesarios con caracteres aleatorios y luego reemplaza cualquier Ys (insensible a mayúsculas y minúsculas) con Xs y repite la línea.
Genera avisos 2n + 3 pero, como de costumbre, está bien.
fuente
Emacs Lisp, 269 bytes
Sin golf y ligeramente modificado:
fuente
JavaScript (ES6),
128131Editar 3 bytes guardados gracias a @Neil
Muy voluminoso, probablemente no sea el mejor enfoque. Bonificación: funciona con entradas pares o impares.
fuente
r+7&31
da el mismo resultado que(r&31)-25
.C, 268 bytes
Llame
f()
con el tamaño delx
para dibujar.fuente
srand
dentro de sus funciones, no pueden confiar en el estado global. Sin embargo, puede lograr un programa mucho más corto con dos bucles anidados y utilizando el carácter de retroceso. Una solución general podría ser como este , pero creo que una variante específica utilizando ventanasclock
sería válido.gcc version 4.8.1
para Windows ygcc version 5.3.0
para Cygwin no funciona ... (en Ideone Works)Matrices , 79 bytes (no competidoras)
Matricks sobresale como el comienzo de hacer la xy todos los valores aleatorios, pero fracasa cuando se trata de condicionales ...
Marqué esto como no competitivo porque tuve que corregir algunos errores y hacer que todas las nuevas funciones funcionen después de que se publicó este desafío.
Corre con
python matricks.py x.txt [[]] <input> --asciiprint
Explicación:
Esto también admite números pares.
fuente
Python 2,
204191183 bytesDe acuerdo, la competencia de Python aquí se está volviendo feroz. Aquí está mi intento de reducir tantos bytes como sea posible.
Por ahora estoy atascado(Ok, atascado de nuevo).Créditos a @NonlinearFruit por la forma en que se seleccionan los caracteres aleatorios.
Versión de 183 bytes:
¡Pruébelo en línea! (Ideona)
El cambio principal es reescribir el condicional
como
que ahorra 7 bytes.
Versión de 191 bytes:
¡Pruébelo en línea! (Ideona)
Los cambios principales son la forma en que se seleccionan los caracteres aleatorios y algunos reordenamientos de código, como el
s=input();i=s;
devenirs=i=input();
, eliminar lar=range
asignación ya que ya no es necesaria y llamarabs
directamente, ya que da como resultado menos bytes de código.¡Superando la respuesta más corta anterior en Python por 1 byte!@R. El enfoque de Kap se usa para generar los caracteres aleatorios. Cada iteración del ciclo while se imprime una fila del ex.Versión de 204 bytes :
¡Pruébelo en línea! (Ideona)
Versión sin golf para tener una idea de cómo funciona:
¡Fue difícil manejar el caso de 1 personaje!
fuente
SmileBASIC, 97 bytes
En lugar de tener que calcular el número de espacios entre cada personaje o algo, decidí imprimir en todas las ubicaciones donde
X==Y
oX+Y==Size+1
.El generador de caracteres aleatorios solo agrega 1 si genera
y
oY
, por lo tanto,z
yZ
son un poco más comunes de lo habitual.fuente
PHP, 100 bytes
toma datos del argumento de la línea de comando; correr con
-nr
.bucle combinado imprime caracteres dependiendo de la posición
Descompostura
fuente