Habituellement, il est dit que "Faire X sans Y" peut être un piège pour les débutants qui écrivent des défis ( source ). Cependant, je suis arrogant et pense que je peux certainement faire un X sans Ys. Au hasard. Oh oui, ce sera bien.
Défi: Étant donné un entier impair n
supérieur ou égal à 1, affiche un ex de côté n
composé de caractères ascii imprimables au hasard, sans "y" et "Y", ainsi que de l’espace. Tous les personnages autorisés doivent avoir une chance non nulle de se produire, mais pas nécessairement uniforme. Ceci est un code-golf donc le code le plus court en octets gagne. Vous devez cependant randomiser chaque caractère - c'est-à-dire que les jambes de force de l'ex ne doivent pas être égales, sauf si c'est par hasard.
Les caractères à paraître
!#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXZ[\]^_`abcdefghijklmnopqrstuvwxz{|}~"
Construire l'ex
Longueur du côté 1:
x
Longueur du côté 3:
x x
x
x x
Longueur du côté 5:
x x
x x
x
x x
x x
etc.
Exemple de sorties
input
output
empty line
3
h 2
^
9 5
1
:
5
D 1
W z
W
q j
W 1
Exemple d'implémentation
Vous n'avez pas besoin de gérer des entrées non valides.
!
à~
sansy
etY
y
et然
.Réponses:
Pyth,
28272625 octetsSuite de tests.
la source
~
personnage, car la gamme ne l'inclut pas. Vous pouvez résoudre ce problème en remplaçant~
le code par le caractère DEL littéral.Ruby, 102 octets
Array#sample
ne répétez pas l'échantillonnage à partir du jeu de caractères, mais c'est correct car la répartition des caractères ne doit pas nécessairement être parfaitement uniforme! Fonction récursive, retourne un tableau de lignes.Essayez-le en ligne!
la source
En fait, 62 octets
C'est l'un des programmes les plus longs que j'ai jamais écrit.
Essayez-le en ligne!
Explication:
Partie 1 : configurer la liste des personnages
Essayez-le en ligne!
Partie 2 : construction du tableau booléen pour un X
Essayez-le en ligne!
Partie 3 : choisir des caractères aléatoires
Essayez-le en ligne!
la source
Mathematica, 146 octets
Fonction anonyme. Prend un nombre en entrée et retourne une chaîne en sortie.
la source
Python 2, 171 octets
Garanti de choisir des caractères aléatoires avec une probabilité uniforme.
Essayez-le ici: lien ideone
EDIT: Merci à Morgan Thrapp pour les corrections.
la source
from random import*
enregistre 2 octets. Vous pouvez également joindre les deux premières lignes de laj
boucle avec un point-virgule pour enregistrer des octets. (Aussi, je croisZ
et{
ai plus de chance de survenir que certaines autres lettres, cela ne compte pas pour la question.)bool(i^j and i^-j)
->i not in(j,-j)
Python,
142139135 octetsCeci est une implémentation simple qui crée le carré caractère par caractère. Si le caractère est en diagonale : utilisez un caractère aléatoire, sinon : utilisez un espace. Ceci utilise également une substitution regex et random int pour générer des non Ycaractères:
Explication [ancien]
Mise à jour
import*
- Merci à @KevinLaula source
randint
est probablement plus court pour vos besoins, plusfrom random import*
. En outre, supprimez une partie de cet espace blanc inutile.[i,33][i in(89,121)]
fonctionne à la place nécessitant un ternaire à longue haleine dans votref
fonction! Voyez également si vous pouvez supprimer l'espace qui se trouve juste après vosprint
déclarationsre.sub("y|Y","t",chr(random.randint(33,126))+' ')[j!=i!=x-j-1]
enregistre 6 octets sur la... if ... else ...
construction.Dyalog APL , 35 octets
⎕
invite pour le numéro⍳
1 à ce nombre∘.=⍨
table d'égalité ( à savoir la diagonale a 1s)(⊢∨⌽)
lui - même ou son image dans un miroir (donne deux diagonales)95×
multiplier par 95?
rand int entre 1 et 95 pour les diagonales, rand flotteur entre 0 et 1 pour le reste⌊
étage à supprime les flottants,(⊢+∊∘57 89)
ajoute un aux éléments membres de {57,89} (Yy - 32),32+
ajoute 32 pour que les 0 soient des espaces, et les autres nombres, dans la plage appropriée,⎕UCS
convertis en texteTryAPL !
la source
Python 2.7, 205 octets:
Essayez-le en ligne! (Idéone)
la source
MATL , 28 octets
Essayez-le en ligne!
Tous les personnages autorisés ont la même probabilité d'apparaître. Fonctionne même pour l'entrée.
la source
C, 154 octets (ou 119 sans la plaque de la chaudière)
Ou 119 octets en fonction
X(h)
desrand(time(0))
pris en charge ailleurs:Panne:
la source
code machine x86, 70 octets
Mon code exécutable, désassemblé:
C'est une fonction qui reçoit la taille du X dans ecx et un pointeur sur le tampon de sortie dans edx.
Il remplit la mémoire tampon de sortie séquentiellement d'octets. Il y a des
2 * n - 1
itérations (égales au nombre de caractères sans espace à afficher). À chaque itération, il effectue les opérations suivantes:La conversion d'un nombre aléatoire en un caractère aléatoire n'est pas remarquable:
La partie intéressante est le calcul du nombre d'espaces. Il doit générer les nombres suivants (exemple pour N = 9):
Les nombres sont pris alternativement de deux progressions arithmétiques. Le premier descend à l’étape -2 et le second à l’étape 1. Lorsque la première progression arrive à -1 (au milieu du X), il y a un problème (-1 est supprimé), puis les progressions changent de direction.
Les progressions sont stockées dans des registres
ebx
etedx
- les parties hautesbh
etdh
stockent le numéro actuel, et les parties bassesbl
etdl
stockent le pas. Pour alterner les progressions, le code échange les registres avecxchg
.Lorsque la progression arrive à -1 (autour de l'
mylab
étiquette), les deux registres sont augmentés, les étapes passant de-2, 1
à-1, 2
. Cela modifie également les rôles des registres, de sorte qu'il permute les parties hautes des registres.À la fin de la fonction, il stocke un octet nul pour indiquer une fin de chaîne.
la source
Lua, 277 octets
Eh bien ... Lua est tellement bon à manipuler des chaînes: D. La première fois que je devais utiliser
local
dans une déclaration! Je pourrais économiser des octets en utilisant Lua 5.1 au lieu de 5.3 car ils ont déplacé la fonction globaleunpack
dans l’objettable
de Lua 5.2. Mais je préfère rester avec la dernière version que j'ai :).Définit une fonction qui doit être appelée avec un seul paramètre (le second est utilisé à des fins de récurrence) et renvoie une chaîne.
Ungolfed
la source
JavaScript (ES6),
137131125 octetsOù
\n
représente le caractère de nouvelle ligne littéral. Édition: 1 octet enregistré en déplaçant' '
l’String.fromCharCode
expression. J'ai sauvegardé 5 octets en rendant ma génération de caractères aléatoires non uniforme; l'expressionr+72&95
est égale à zéro pour les valeurs mappées surY
ety
et un!
est généré à leur place. Sauvegardé 4 octets quand j'ai réalisé que la propagationString.fromCharCode
évite d'avoir à le fairejoin
. Sauvegardé 2 octets en volant un tour de @ edc65.la source
PowerShell v2 +, 112 octets
Lit les entrées sur la ligne de commande.
Pour chaque ligne, un tableau d'espaces est créé, les index corrects étant remplis de caractères extraits de la fonction
f
, puis le tableau de caractères est joint à la sortie en tant que ligne.la source
[char]
casting en dehors deRandom
, et en retournant le-join
pour devenir un opérateur unaire ---Param($i)function f{[char](Random(33..126-ne121-ne89))};1..$i|%{$a=,' '*$i;$a[$_-1]=f;$a[$i-$_]=f;-join$a}
function
par l'équivalent PowerShell d'un lambda et en appelant l'opérateur&
d'appel. Ce qui suit est 103 octets -Param($i)$z={[char](Random(33..126-ne121-ne89))};1..$i|%{$a=,' '*$i;$a[$_-1]=&$z;$a[$i-$_]=&$z;-join$a}
-ne
, en transformant le[char]
casting en[char[]]
acteur$a
(en échangeant' '
pour32
le processus) et en déplaçant$z
la définition dans un parens lors de son premier appel. Moins de 99 (woo! Sous-100!) -Param($i)1..$i|%{$a=,32*$i;$a[$_-1]=&($z={Random(33..126-ne121,89)});$a[$i-$_]=&$z;-join[char[]]$a}
$a
la définition dans un parent après sa première utilisation. Jusqu'à 98 maintenant -Param($i)1..$i|%{($a=,32*$i)[$_-1]=&($z={Random(33..126-ne121,89)});$a[$i-$_]=&$z;-join[char[]]$a}
je pense que je vais m'arrêter ici ;-) heheMATLAB, 86 octets
Quelques exemples:
la source
changem
! Grand nom!Pip , 33 octets
32 octets de code, +1 pour le
-l
drapeau. Curieusement, le code commence parY
et finit pary
...Prend l'entrée en tant qu'argument de ligne de commande. Essayez-le en ligne!
Explication
Construit une grille de la taille appropriée; remplace les éléments sur les diagonales par un caractère non-y aléatoire et tous les autres éléments par un espace.
la source
php, 135 octets
Une approche assez simple utilise str_pad pour créer une chaîne d'espaces de la longueur requise, remplace les caractères nécessaires par des caractères aléatoires, puis remplace tout Ys (insensible à la casse) par X et echos la ligne.
Génère 2n + 3 avis mais, comme d'habitude, c'est bien.
la source
Emacs Lisp, 269 octets
Ungolfed et légèrement modifié:
la source
JavaScript (ES6), 128
131Éditez 3 octets enregistrés thx @Neil
Si volumineux, probablement pas la meilleure approche. Bonus - cela fonctionne avec des entrées impaires ou paires.
la source
r+7&31
donne le même résultat que(r&31)-25
.C, 268 octets
Appelez
f()
avec la taille dex
dessiner.la source
srand
intérieur de vos fonctions, elles ne peuvent pas compter sur un état global. Cependant, vous pouvez réaliser un programme beaucoup plus court avec deux boucles imbriquées et utilisant le caractère de retour arrière. Une solution générale pourrait ressembler à ceci , mais je pense qu’une variante spécifique à Windowsclock
serait valide.gcc version 4.8.1
Windows etgcc version 5.3.0
pour Cygwin ne fonctionne pas ... (sur IdeOne Works)Matricks , 79 octets (non concurrents)
Matricks excelle comme le début de la fabrication du x et de toutes les valeurs aléatoires, mais il échoue en ce qui concerne les conditionnelles ...
J'ai marqué ceci comme non compétitif parce que je devais corriger quelques bugs et faire fonctionner toutes les nouvelles fonctionnalités après la publication de ce défi.
Courir avec
python matricks.py x.txt [[]] <input> --asciiprint
Explication:
Cela prend également en charge les nombres pairs.
la source
Python 2,
204191183 octetsD'accord, la concurrence de Python devient féroce ici. Voici ma tentative de supprimer autant d'octets que possible.
A présent, je suis coincé(ok, encore coincé).Crédits à @NonlinearFruit pour la façon dont les caractères aléatoires sont sélectionnés.
Version de 183 octets:
Essayez-le en ligne! (Idéone)
Le principal changement consiste à réécrire le conditionnel
comme
ce qui sauve 7 octets.
Version de 191 octets:
Essayez-le en ligne! (Idéone)
Les principales modifications concernent la manière dont les caractères aléatoires sont sélectionnés et certaines modifications de code, telles que le
s=input();i=s;
devenirs=i=input();
, la suppression de l'r=range
attribution, qui n'est plus nécessaire, et l'appelabs
direct, car il en résulte moins d'octets de code.Battre la réponse la plus courte précédente en Python de 1 octet!@R. L'approche de Kap est utilisée pour générer les caractères aléatoires. A chaque itération de la boucle while, une ligne de l'ex est imprimée.Version de 204 octets :
Essayez-le en ligne! (Idéone)
Version non-golfée pour avoir une idée de son fonctionnement:
Il était difficile de gérer le cas d'un caractère!
la source
SmileBASIC, 97 octets
Au lieu d'avoir à calculer le nombre d'espaces entre chaque caractère ou quelque chose, j'ai décidé d'imprimer seulement dans tous les lieux où
X==Y
ouX+Y==Size+1
.Le générateur de caractères aléatoires ajoute simplement 1 s'il génère
y
ouY
, ainsiz
etZ
sont légèrement plus communs que d'habitude.la source
PHP, 100 octets
prend en charge l'argument de la ligne de commande; courir avec
-nr
.la boucle combinée imprime les caractères en fonction de la position
panne
la source