Défi
Vous allez créer un programme / une fonction qui prend une entrée de chaîne de longueur n
et:
- Place l'
kth
omble au centre de l'espace, oùk = (n+1)/2
. Ce sera l'emplacement de votre Ground Zero. - Place le reste des caractères non blancs disposés de manière aléatoire autour du zéro du sol. La distance pythagoricienne du char ne doit pas dépasser
n
. - Sort le résultat.
Si vous avez besoin de clarifications, consultez l'exemple ci-dessous.
Règles
- Les échappatoires standard s'appliquent!
- Les E / S doivent être sous la forme d'une chaîne.
- L'entrée sera toujours étrange pour vous assurer d'avoir un caractère central à mettre à zéro.
- Chaque sortie valide doit se produire avec une probabilité non nulle.
C'est du golf de code ; le code le plus court en octets gagne!
Exemple
Contribution: qwert
Les limites de l'explosion émanant de Ground Zero (la marque de x est valide pour le reste des caractères):
x
xxxxxxx
xxxxxxxxx
xxxxxxxxx
xxxxxxxxx
xxxxxexxxxx
xxxxxxxxx
xxxxxxxxx
xxxxxxxxx
xxxxxxx
x
Exemple de sortie:
t
r
q e
w
Réponses:
APL (Dyalog Classic) ,
6866656362 octetsEssayez-le en ligne!
{ }
fonction anonyme avec argument⍵
n←≢⍵
variablen
est la longueurs←2⍴1+2×n
variables
est la forme du résultat: 2n + 1 par 2n + 1''⍴⍨s
créer un carré d'espaces avec cette formeA@I⊢B
place les élémentsA
à (paires) d'indicesI
dans la matriceB
+.ר⍨n-⍳s
distances au carré du centre de la matrice(××n≥*∘.5)
matrice booléenne indiquant où ces distances sont non nulles et≤n
⍸
paires de coordonnées pour les 1 dans la matrice booléennei[n?≢i← ... ]
choisissez n d'entre eux au hasard (pas de doublons)n⊣¨¨@(⊢≡¨⌽)
changer le central enn n
⍵@( ... )⊢ ...
mettre les caractères de l'argument aux indices donnés dans la matrice des espacesla source
JavaScript (ES6), 211
216 220Modifier 1 octet enregistré thx @usandfriends
Tester
la source
g.map(r=>r.join``)...
new Date()%h-l
au lieu deMath.random()*h-l|0
. Il enregistre des octets.Rubis,
211207203196 caractèresMerci à edc65 pour 4 personnages
Explication:
->(x){...}
définir une fonction anonyme qui prend un argumentx
x=x.chars
transformerx
d'une chaîne en un tableau de chaînes à un caractèreo,b,c=x.size
stocker la longueur de l'entréeo
pour une utilisation ultérieure.b
etc
doivent simplement être initialisés à quelque chose , alors enregistrez 2 caractères en les attachant à une affectation précédente.l=o*2+1
il s'agit de la longueur / largeur du champ où tous les personnages pourraient éventuellement aller, ainsi que du diamètre du cercle d'explosion.Array.new(l){Array.new l,' '}
créer un tableau 2D de taillel
xl
de caractères d'espace.a[o][o]=x.delete_at o/2
définit le centre du tableau au centre des valeurs dex
(l'entrée), tout en supprimant cette valeur dex
... while x[0]
exécutez le bloc (dans ce cas, le code avantwhile
car il est en ligne) encore et encore jusqu'à ce qu'ilx
soit vide. En rubis, l'accès à un index qui n'existe pas revientnil
, ce qui est une valeur de falsey.a[b=rand(l)][c=rand(l)]==' '
Attribuezb
etc
à des valeurs aléatoires où 0 <= n <l
. Ensuite, vérifiez si l'endroit àb
,c
est vide (aka est défini sur le caractère espace)(b-o)**2+(c-o)**2<=o*o
Vérification de la distance pythagoricienne.o
est la longueur de l'entrée.**
est l'opérateur d'exponentiation de ruby, etval<=o*o
est plus court queval**0.5<=o
.a[b][c]=x.pop
supprimer la dernière valeur dex
. Définissez la positiona
,b
à cette valeur dans le tableaua
a[b][c]=x.pop if a[b=rand(l)][c=rand(l)]==' '&&(b-o)**2+(c-o)**2<=o*o while x[0]
Définissez une position aléatoire sur la dernière valeur si cette position est libre et se trouve dans le rayon d'explosion; continuez ainsi jusqu'à ce que nous manquions de caractères à placer.$/
est défini sur la nouvelle ligne du système d'exploitation. Il est également plus court que"\n"
a.map(&:join).join $/
Mappez tous les tableaux dansa
une version à chaîne unique d'eux-mêmes (par exemple['a','b','c']
->'abc'
). Prenez ce nouveau tableau et joignez-le à des nouvelles lignes. Retour implicite.la source
Python 3 , 286 octets
L'essayer en ligne est une option.
Oups, tombé sur ce sujet en raison d'une activité récente, n'a pas remarqué qu'il avait plus de deux ans jusqu'à ce que j'y passe un bon moment. Eh bien, deux réponses sont un peu tristes, c'est donc probablement une bonne idée de poster quand même. Je suis sûr qu'il existe des dizaines de façons d'améliorer cela - je n'ai pas remarqué jusqu'à présent que les commentaires sont toujours étranges, ce qui aurait été utile de savoir.
Explication
i=input()
l=len(i)
Cette entrée, bien sûr, enregistre la longueur de la chaîne car elle est utilisée plusieurs fois.a=range(-l,l+1)
- un outil rapide pour créer un itérateur allant des distances disponibles loin de l'origine dans les deux sens le long d'une dimension.g=[(y,x)for y in a for x in a]
construit une liste de coordonnées de tuple qui constitue la grille finale entière.p=[(y,x)for y,x in g if abs(x+y*1j)<=l and x|y]
crée un sous-ensemble de la liste contenant uniquement les coordonnées sur lesquelles les lettres non centrales peuvent éventuellement atterrir.m=i[l//2]
établit le caractère central.d=[*i.replace(m,"",1).center(len(p))]
- le personnage central est sorti, nous laissant avec les autres débris. Lacenter()
fonction est très agréable ici, car elle nous permet de remplir la ligne (avec par défaut un espace) jusqu'à ce qu'elle soit longue d'un certain nombre de caractères. Ici, c'est le nombre d'espaces sur lesquels les lettres peuvent atterrir, reflétant ainsi la distribution dont nous avons besoin.r.shuffle(d)
mélange naturellement ladite distribution comme étant réellement ... distribuée.La boucle,,
for c in g: o+=m if c==(0,0)else d.pop()if c in p else" "
regarde le carré entier des tuiles réalisables, indépendamment de tout ce qui peut y atterrir ou non, et si nécessaire, ajoute un caractère à notre chaîne de sortieo
. Les personnages sont extraits de notre échantillon de débris afin qu'ils n'apparaissent qu'une seule fois.if c[1]==l:o+="\n"
- Ajoute également des sauts de ligne. Retour.la source