Alice est stagiaire dans une entreprise qui utilise Brainfuck comme langue principale pour le développement côté client et côté serveur. Alice vient d'écrire son premier code et elle est un peu nerveuse alors qu'elle se prépare pour sa première révision de code.
Alice veut que son code soit correctement formaté et joli, mais elle n'a pas le temps de lire le guide de style de code d'entreprise de 328 pages, alors elle a décidé de le formater comme un carré parfait . Hélas, la longueur du code peut être insuffisante pour former un carré, elle a donc décidé de laisser un espace rectangulaire au milieu. Les espaces doivent être parfaitement centrés et aussi proches du carré que possible.
Exemples
++++++ +++++ +++++ +++++ +++++ +++++
++++++ +++++ +++++ + ++ ++ ++ +++++
++++++ ++ ++ + + + ++ + +
++++++ +++++ +++++ +++++ ++ ++ +++++
++++++ +++++ +++++ +++++ +++++ +++++
Perfect OK Acceptable Unacceptable No way! Nope.
Écrivez un programme ou une fonction pour aider Alice. Étant donné le code d'Alice en tant que chaîne d'entrée, sortez le code correctement formaté comme décrit ci-dessous si possible. Si le formatage est impossible, sortez les emoji qui pleurent :~(
.
Il s'agit de code-golf donc les réponses sont notées en octets avec moins d'octets comme objectif.
Contraintes
- Votre programme ou fonction doit prendre une seule chaîne en entrée et produire une ou plusieurs lignes de texte (ou renvoyer une chaîne multi-lignes ou un tableau de chaînes, si vous implémentez une fonction).
- La chaîne d'entrée peut contenir tous les caractères ASCII, y compris les espaces blancs.
- Tous les espaces blancs en entrée doivent être ignorés. Ils ne doivent pas compter pour la longueur du code et ne doivent pas être utilisés en sortie.
- La chaîne d'entrée contient au moins un caractère non blanc.
- Le code formaté doit avoir les mêmes caractères non blancs dans le même ordre que dans le code d'entrée.
- Le code formaté doit être un carré parfait, c'est-à-dire que toutes les lignes doivent avoir la même longueur et le nombre de lignes doit être égal à la longueur des lignes.
- Le code formaté peut contenir un espace au milieu.
- Seuls les espaces (code ASCII 32) peuvent être utilisés dans l'espace.
- L'écart (s'il est présent) doit être rectangulaire.
- Chaque ligne de code formaté doit contenir au moins un caractère non blanc, c'est-à-dire que la largeur de l'espace doit être strictement inférieure à la largeur du carré (l'espace 5x1 est inacceptable pour le carré 5x5).
- L'écart doit être horizontal, c'est-à-dire que la largeur de l'espace doit être supérieure ou égale à la hauteur de l'espace.
- L'écart doit être parfaitement centré.
- Par conséquent, la largeur de l'espace et la parité de la hauteur doivent être identiques à la parité de la largeur carrée (par exemple, pour un espace carré de 5x5, il peut s'agir de 1x1, 3x1 ou 3x3).
- Si possible, émettez un carré sans aucun espace.
- En cas de solutions multiples, choisissez-en une avec un espace le plus proche du carré, c'est-à-dire que la différence entre la largeur et la hauteur de l'espace est minime (par exemple: l'espace 10x10 est plus préférable que 8x6 et 8x6 est plus préférable que 6x2).
- S'il y a toujours égalité, choisissez une solution avec une zone d'espace minimale (par exemple, l'espace 2x2 est plus préférable que 4x4).
- S'il est impossible de formater le code, sortez
:~(
. - La nouvelle ligne après la dernière ligne est facultative.
- [Nouveau] Vous pouvez sans risque supposer que tout caractère dont le code est inférieur à 33 est un espace blanc. J'espère que cela vous aidera pour le golf.
Les tests
Input Output Code length Comment
+++++++++ +++ 9 Alice is lucky,
+++ her code perfectly fits a square.
+++
++++++++ +++ 8 Though code length isn't enough for a square,
+ + a small gap fixes it.
+++
++++++ :~( 6 No luck, code cannot be formatted.
Hello, Hell 12 Input may contain any ASCII characters,
World! o , but whitespaces in input should be ignored.
W o
rld!
+++++ + +++++ +++++ 22 Gap is not required to be a square,
+++++ + +++++ +++++ it can be a rectangle.
+ +
+++++
+++++
+++ + +++ ++++++++ 28 There exists another solution:
+++ + +++ + + 6x6 square with 4x2 gap,
+++ + +++ + + but in Alice's opinion square gap
+++ + +++ + + makes code more readable.
+ +
+ +
+ +
++++++++
Tests délicats
This must be Thism 24 7x7 with 5x5 gap looks good,
5x5 with 1x1 ustbe but 5x5 with 1x1 gap is better,
gap. 5x 5w because gap area is smaller.
ith1x
1gap.
+++ +++ +++ :~( 18 In case you tried 5x5 square
+++ +++ +++ with 7x1 gap ;)
Ressources
Pour économiser de l'espace, vous pouvez trouver des exemples de code et des cas de test supplémentaires sur tio.run
[Nouveau] Vous pouvez consulter le tableau des solutions acceptées pour les entrées jusqu'à 100 caractères . J'ai inversé la largeur et la hauteur car cela semble plus intuitif.
Inspiré par: un carré de texte
Changements
Ajout de 2 tests, correction d'un bug dans l'exemple de code.
Ajout d'un tableau de solutions jusqu'à 100, ajout d'une clarification des espaces blancs.
Réponses:
C (gcc) , 354 octets
Essayez-le en ligne!
la source
isspace(x)
parx<33
.JavaScript (ES6),
284 ... 274270 octets4 octets enregistrés grâce à @Shaggy
Renvoie un tableau de chaînes.
Essayez-le en ligne!
la source
This must be 5x5 with 1x1 gap.
(24 caractères)[\s\n]
l'être\s
?++w>x-2
w++>=x-2
w++>=x
\s
Stax , 80 octets
Exécuter et déboguer
Comment ça marche?
Déballé, non golfé et commenté, cela ressemble à ceci.
Exécutez celui-ci
la source
Charbon de bois , 120 octets
Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:
Supprimez les espaces de l'entrée, puis inversez-les et divisez-les en caractères, afin que nous puissions boucler plus facilement sur les caractères plus tard.
Commencez avec une taille de zéro, indiquant qu'aucun résultat n'a (encore) été trouvé.
Vérifiez toutes les longueurs de côté jusqu'à la longueur de la chaîne. (Le fait de jeter une division rendrait bien sûr le code plus rapide.)
Si le résultat s'avère être un carré parfait, enregistrez la taille du carré et définissez-le également comme taille de bordure.
Boucle sur les hauteurs et largeurs de bordure possibles (la largeur de la bordure n'est pas supérieure à la hauteur de la bordure, ce qui fait que la hauteur de l'espace n'est pas supérieure à la largeur de l'espace.)
Si la taille de la bordure est la longueur souhaitée et que nous n'avons pas encore de solution ou qu'elle n'est pas aussi carrée que cette solution, mettez à jour la solution avec ces tailles de carré et de bordure.
Si nous avons une solution ...
Dessinez un rectangle d'un caractère arbitraire de la taille carrée donnée.
Si la bordure est suffisamment petite pour laisser un espace, effacez-le. (La commande de dessin dessinera vers le haut et vers la gauche pour les valeurs négatives et n'aime pas du tout les valeurs nulles.)
Remplacez tous les caractères (restants) par des caractères de l'entrée.
Sinon, sortie
:~(
.la source
Gelée ,
9185 octetsEssayez-le en ligne!
Un lien monadique qui prend la chaîne d'entrée comme argument et renvoie une chaîne avec la sortie formatée ou
:~(
.la source
Python 2,
287281279 octetsEssayez-le en ligne!
Utilise la comparaison de listes lexicographiques de Python en utilisant les mêmes valeurs pour choisir une solution et l'imprimer. Je suis à peu près sûr que
1042 ou plus d'octets peuvent encore être rasés.Explication
Supprimez les espaces blancs en les divisant en espaces blancs et en les rejoignant
""
, puis convertissez l'entrée en liste pour plus tard. Initialiser égalementl
à la longueur du code réel etp
à la liste des possibilités valides.Parcourez toutes les possibilités de tailles d'écart de
0*0
àl*l
. Calculez la longueur du bord du carré avecl
des caractères de code et desx*y
espaces commes
.Vérifiez si les conditions suivantes correspondent:
s % 1 == 0
, c'est-à-dire qu'un carré parfait serait forméx < s-1 > y
, c'est-àx
- dire ety
sont tout au pluss-2
et s'insèrent dans le carrés % 2 == x % 2 == y % 2
, c'est-à-dire les deuxx
ety
correspondent à la parité du bord et peuvent être centrésx < 1
, c.-à-d.x == 0
, ignorer tout sauf l'exigence de carré parfaitSi les conditions correspondent, ajoutez les éléments suivants dans un tuple
p
pour trouver celui optimal:abs(x-y)/2
; trouver d'abord la différence minimale dex
ety
pour obtenir l'écart le plus carré. C'est toujours le cas, donc nous divisons par 2.int(s)
; trouver ensuite la longueur minimale du côté. Puisques
est un entier et augmente en tant que zone d'espacex*y
, il trie par zone d'espace.-x
; trouver ensuite la largeur maximale pour préférer les espaces horizontaux. Cela vient après la zone en raison de la façon dont elle a été développée, mais la zone est la mêmex*y
ety*x
fonctionne donc.Si nous avons trouvé des dispositions valides, trouvez celle optimale comme décrit ci-dessus. Calculez la bordure horizontale
b
et initialisez le numéro de ligneY
à 0.Si le numéro de ligne se
Y
trouve à l'intérieur de l'espace (la bordure verticale estb+d
, avecd
du tuple), ajoutez la valeur d'espaces de la largeur de l'espace après la bordure horizontalec
. (La modification dec
est pourquoi nous avons besoin que ce soit une liste.) Imprimez ensuite une ligne du carré et supprimez-lac
. Répétezs
fois, en incrémentant le numéro de ligne.Si aucune disposition n'a été trouvée, échouez.
la source
"some\ntext"
tant que délimiteurs. (input()
évalue une ligne d'entrée en tant que code Python.) Si cela n'est pas acceptable, faites-le moi savoir. La longueur 22 fonctionne également pour moi.Pyth ,
9998 octetsEssayez-le en ligne!
Cela utilise le même algorithme que ma réponse Python, mais de nombreux détails sont considérablement modifiés pour être plus courts en Pyth.
Pyth montre son âge ici, car il n'a pas été mis à jour depuis des siècles et n'utilise que les caractères ASCII imprimables (pour le code, pas les données), ce qui gaspille beaucoup d'espace.
Fait intéressant, si Pyth utilisait le même type d'emballage de base 256 que Stax, ce programme pourrait être ⌈98 log 256 95⌉ = 81 octets de long, juste à côté de Stax (80 octets) et Jelly (85 octets). Je pense que cela montre bien à quel point les langues de golf sont proches, même avec leurs paradigmes radicalement différents.
Explication (seulement légèrement moins illisible que le code)
#
enveloppe tout dans unwhile True:
qui supprime le message et se ferme en cas d'erreur.JscQ)
c
saute input (Q
) dans les espaces blancs, places
les parties ensemble et enregistre le résultat dansJ
.^UJ2
fait la liste des indices (U
) deJ
et prend sa2
nd puissance cartésienne (^
), résultant en toutes les paires[h,w]
avec0<=h<len(J)
et0<=w<len(J)
.+L@+lJ*Fd
: pour toutes (L
) ces pairesd
, ajoute (+
) la racine carrée (@
…2
) de (lal
valeur deJ
plus (+
) le produit (*F
) de la paired
) au côté gauche de la paire, créant un triplet[side length, gap height, gap width]
.f!|%hT1&eT|t{%R2TgeStThT
:f
iltre pour tripletsT
où!|
):hT
) modulo 1 (%
…1
) est différente de zéro&
):eT
) est différente de zéro|
):R
) modulo 2 (%
…2
), avec les doublons ({
) et le premier unique (t
) supprimés, n'est pas videeS
) de la hauteur et de la largeur de l'espace (tT
) estg
plus ou moins égale à la longueur du côté (hT
)S
trie les triplets lexicographiquement (par longueur de côté, puis par hauteur d'écart).oaFtN
puiso
trie les triplets par laa
différence absolue entre la hauteur et la largeur de l'espace (tN
).À ce stade, si nous n'avons pas de solutions valides,
|
évalue son deuxième argument\n":~("
, qui imprime et renvoie:~(
.h
prend la solution optimale (ou":"
si aucune) et elle est enregistrée dansK
. Prend ensuiteh
sa longueur de côté (ou":"
si aucun), les
convertit en entier (ou échoue et quitte si aucun) et il est enregistré (=
) dansQ
.Chacun de (
m
)[gap height, gap width]
(tK
) est ensuite soustrait (-
) de la longueur du côté (Q
) et le résultat divisé par 2 (/
…2
). Les résultats sontA
signés pourG
etH
.Enfin, nous entrons dans une
W
boucle de hile.Z
commence à 0 et à chaque itération nous l'incrémentons mais utilisons l'ancienne valeur (~hZ
, pensezZ++
en C).W
) l'ancienne valeur se trouve dans ({
) le point d'r
ancrageG
à (longueur du côté -G
) (-QG
), affectez (=
) àJ
ce qui suit:c
sautezJ
à la position (]
)H
etj
placez les moitiés avec des intervalles de largeur d'espaceeK
(*
) un espace (d
). Si la valeur n'était pas dans la plage, revenez simplementJ
. Si ce résultat est vide, arrêtez la boucle.>
) les premiersQ
caractères deJ
et affectez (~
) le résultat àJ
. À partir de l'ancienne valeur deJ
, prenez (<
) les premiersQ
caractères et imprimez-les.Enfin, la
#
boucle recommence, des erreurs et se termine carcQ)
avecQ
contenant un nombre n'est pas valide.la source
05AB1E ,
9589 octetsQuelques octets ici et là peuvent certainement être joués.
Les trois premières étapes du programme sont inspirées de la réponse Stax de @recursive , alors assurez-vous de lui donner un vote positif!
Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
Étape 1: supprimez tous les espaces blancs:
Par exemple:L = 28 entraînera les triplets
[[6,2,4],[6,4,2],[8,6,6]]
.Étape 3: Vérifiez s'il nous reste encore des triplets. Sinon, sortie( a b s ( b - c ) , b × c ) .
":~("
; si c'est le cas, déterminez lequel utiliser en triant et en ne laissant que le premier. Nous faisons cela en triant les tuplesPar exemple: les triplets
[[6,2,4],[6,4,2],[8,6,6]]
seront triés[[8,6,6],[6,2,4],[6,4,2]]
, après quoi il ne[8,6,6]
reste que.Étape 4: Créez une liste sur la façon de diviser la chaîne pour insérer les espaces. Cela se fait comme ceci:
Donné[ a , b , c ] , créez une liste avec:
Par exemple: triplet
[7,3,5]
donnera la liste[15,2,2,35]
.Étape 5: Et enfin, nous avons divisé la chaîne en fonction de cette liste, rejoignez-la avecc quantité d'espaces, divisez-la en parties de taille c et réunissez-les par des sauts de ligne. Par exemple:
Chaînec = 5 nombre d'espaces à a = 7 à ceci:
"Alongtesttoseeifitworksasintended."
divisé selon la liste[15,2,2,35]
se traduira par:["Alongtesttoseei","fi","tw","orksasintended."]
. Ceci est ensuite rejoint par"Alongtesttoseei fi tw orksasintended."
. Et puis divisé en parties de taille["Alongte","sttosee","i f","i t","w o","rksasin","tended."]
. Qui est ensuite rejoint par des sauts de ligne pour sortir.la source