Loi sur l'équilibre
Une balançoire (censément du ci-ça français, qui signifie «ceci-cela») forme un tiers de la sainte trinité de l'équipement de jeux, avec le toboggan et la balançoire tout aussi omniprésents. Une balançoire est en parfait équilibre si, et seulement si, la somme des moments de chaque côté est équivalente. Une balançoire peut donc être équilibrée en ajoutant une quantité spécifique de poids sur le côté avec la somme de moment inférieure; atteindre cet objectif est votre objectif pour ce défi.
Défi
Votre défi consiste à prendre une représentation d'une bascule en entrée et à la sortir à nouveau, avec du poids ajouté à une extrémité de la bascule pour l'équilibrer.
Contribution
Votre programme doit prendre, dans tout format raisonnable, une balançoire ASCII telle que la suivante:
100 100
-------------------
^
La première ligne contient deux nombres, chacun représentant des poids sur la bascule. Exactement un poids est présent de chaque côté, chacun agissant à l'extrémité de son côté de la planche. Les poids sont garantis comme des entiers et s'alignent toujours avec leur extrémité correspondante de la planche. Ces chiffres ne chevaucheront jamais le point d'appui ( ^
).
La deuxième ligne représente la «planche» de la bascule. Chaque tiret ( -
) représente une longueur égale à l'autre tiret, à la seule exception du tiret directement sur le point d'appui ( ^
), qui n'a pas de longueur.
La troisième ligne représente le point d'appui de la bascule. Ce point d'appui est marqué par le seul caractère qui n'est pas un espace sur cette ligne, un circonflexe ('^'). Le point d'appui peut être positionné n'importe où le long de la longueur de la planche dans une entrée valide tant qu'il reste suffisamment d'espace pour que les nombres représentant les poids ne chevauchent pas le point d'appui dans l'entrée ou la sortie.
L'entrée est garantie d'avoir trois lignes et aucun espace blanc avant ou après les caractères qui constituent la bascule (à l'exception, bien sûr, de la troisième ligne, qui l'exige).
Production
Pour la sortie, la même représentation de bascule doit être imprimée sur stdout, mais avec un (et un seul) des poids remplacés par un poids plus grand, afin d'équilibrer la bascule. Les entrées sont garanties pour rendre cela possible en utilisant uniquement des entiers. Par conséquent, les poids doivent être affichés sans virgule décimale ni aucune autre notation similaire. Si votre langue n'utilise pas stdout, vous devez suivre le consensus de la communauté / méta sur la sortie. Les retours à la ligne de fin sont corrects, mais toute autre modification du format de représentation n'est probablement pas correcte.
Exemplification
Entrées de test et sorties correspondantes
Entrée 1
12 22
--------------------
^
Sortie 1
12 26
--------------------
^
Entrée 2
42 42
-----------
^
Sortie 2
42 42
-----------
^
Entrée 3
3 16
----------------
^
Sortie 3
14 16
----------------
^
Entrée 4
1 56
-------------------
^
Sortie 4
196 56
-------------------
^
Implémentation de référence - Python 3
# Takes a list of strings as input
def balance_seesaw(lines):
weights = [int(w.strip()) for w in lines[0].split()]
length = len(lines[1])
pivot = lines[2].find("^")
left_length = pivot
right_length = length - 1 - pivot
left_torque = weights[0] * left_length
right_torque = weights[1] * right_length
if left_torque > right_torque:
weights[1] = left_torque // right_length
elif right_torque > left_torque:
weights[0] = right_torque // left_length
weights = [str(w) for w in weights]
string_gap = " " * (length - sum(len(w) for w in weights))
lines[0] = weights[0] + string_gap + weights[1]
print("\n".join(lines))
balance_seesaw(["1 56",
"-------------------",
" ^ "])
Règles
Il s'agit de code-golf , donc les gains de code les plus courts sont comptés en octets. Vérifiez la méta si le comptage des octets est gênant dans votre langue.
Des règles / lacunes standard s'appliquent.
L'entrée doit être prise dans un format raisonnable. Une liste non exhaustive des formats appropriés est donnée comme suit:
- Une chaîne unique avec des lignes séparées par des caractères de nouvelle ligne
- Une liste de chaînes, chaque chaîne représentant une ligne
- Un tableau 2D ou une matrice de caractères
Défis liés
- Équilibrer un ensemble de poids sur une balançoire - Proposé en août 2015 par samgak
Réponses:
05AB1E ,
605150494745 octets10 octets enregistrés grâce à Emigna et 1 octet grâce à Adnan.
Toutes les lignes d'entrée doivent avoir le même nombre de caractères.
Essayez-le en ligne!
Il devrait y avoir une règle de base, comme "si votre code 05AB1E est plus long que 40 octets, vous le faites probablement mal". Cela semble si golfable, toute idée est la bienvenue!
la source
¬s¤s\‚
peut êtreõK
.kD²g->(‚
peut être¡€g
si vous ajoutez les espaces manquants dans la ligne inférieure du cas de test31SÍ
par1®‚
:)/ ï
par÷
.?JavaScript (ES6), 136
Ne fonctionne probablement pas dans Chrome, car il utilise une affectation déstructurée et des paramètres par défaut.Notez que la méthode de sortie JS standard
alert
est particulièrement inadaptée à la tâche, en raison de la police proportionnelle utilisée.Moins golfé
Tester
la source
Perl, 149 + 2 = 151 caractères
Nécessite des options de ligne de commande
-p0
(cela me donne une pénalité de 2 octets en plus des 149 octets du programme lui-même).Explication:
-p0
commutateur lit l'entrée entière jusqu'au premier octet NUL ou EOF. Ce problème n'autorise pas les NUL, nous obtiendrons donc l'intégralité de l'entrée dans la variable$_
utilisée pour les expressions rationnelles, etc., par défaut..+?
), mais je ne peux pas le faire descendre en dessous de 3 caractères, je peux donc aussi utiliser l'évidence\d+
. Le deuxième nombre est à la fin de la ligne, il peut donc être analysé comme.+
(2 caractères). La ligne centrale est utilisée pour déterminer la largeur des échelles; c'est analysé comme-+
(de nombreuses autres représentations fonctionneraient). Les espaces avant le curseur sur la dernière ligne sont+
. Une fois que le signe d'insertion (ou en fait n'importe quel espace non) apparaît, nous ignorons le reste de l'entrée.$1
,$2
,$3
,$4
. Donner une expression régulière comme argument pourmap
utiliser en plus un tableau de ces groupes comme tableau sur lequel mapper. Nous prenons donc leurs longueurs; c'est un moyen pratique de stocker les longueurs de$3
et$4
sans avoir à écrirelength
deux fois. Nous remplaçons également$_
par la longueur de$1
; nous ne nous soucions pas vraiment de la valeur de cela (le nombre de chiffres dans l'entrée gauche est un peu inutile), mais le fait qu'il soit court ($_
la longueur de est maintenant le nombre de chiffres dans le nombre de chiffres dans le premier poids, qui est forcément très faible par rapport à la largeur de la balance).$r
dans lequel les échelles sont divisées.$1*$r>$2
vérifie quel côté est le plus lourd. Nous stockons les nouveaux poids dans$x
et$y
; ceux-ci ont des calculs très simples une fois que le rapport des poids est connu.$x
,$,
et$y
en$_
produire la ligne supérieure, puis garder des espaces en ajoutant ($"
contient un seul espace par défaut et est plus courte qu'un espace littéral' '
serait) sur$,
jusqu'à ce qu'il soit la même longueur que la ligne médiane (c. -à- a une longueur$c
). (J'ai choisi la variable$,
car il est une variable intégrée qui peut être changé en toute sécurité dans ce contexte et commence à vide par défaut.) Commelength
fonctionne sur$_
par défaut, nous n'avons pas besoin de lui donner explicitement un argument. J'ai utilisé un Yoda conditionnel car il a besoin de beaucoup moins de syntaxe sans ambiguïté pour analyser correctement.$\
) pour contenir le reste de l'ensemble des échelles (qui est le même que dans l'entrée, donc je peux simplement utiliser$3
et$4
directement pour en produire la majeure partie). Notez que cela signifie qu'il n'y a aucun espace de fin sur la troisième ligne; l'ajouter rendrait le programme un peu plus long et ne semble d'aucune utilité, donc je l'ai laissé de côté.-p
commutateur se déclenche à nouveau; cette fois, il sort$_
suivi d'un "newline" ($\
). Parce que j'ai redéfini la nouvelle ligne de sortie, ces deux impressions implicites génèrent le nouvel ensemble d'échelles entre elles (bien que comme effet secondaire, il n'y ait pas de nouvelle ligne sur la sortie).-p
commutateur essaie maintenant de relire l'entrée, mais nous avons déjà récupéré l'intégralité du fichier, il lit donc EOF et termine le programme.la source
PHP,
212209205 octetsprobablement golfable
Prend l'entrée de l'argument de ligne de commande; échapper aux nouvelles lignes. Courez avec
-r
.Le remplacement par un espace réservé n'a pas fonctionné comme prévu; j'ai donc dû ajouter plus de parens au premier regex.
la source
Befunge,
223217 octetsEssayez-le en ligne!
la source
>
je pense, vient d'être laissé pour des raisons esthétiques. Cela dit, je semble avoir une solution de 215 octets dans mes notes, donc cela peut être possible (il y a aussi des bogues qui expliqueraient pourquoi je ne l'ai jamais soumis - je n'ai pas le temps de le tester maintenant).Python 2,
184183 octetsCertainement golfable
Assez simple. Prenez simplement les poids ajustés pour ajuster les deux côtés, voyez lequel est plus grand que l'original, et changez celui-là, et sortez.
EDIT Multiplication et division commutées car la division entière est maléfique (merci à @JonathanAllan de l'avoir remarqué)
EDIT -1 octet Changé
i().index('^')
eni().find('^')
(merci à @JonathanAllan [encore!])la source
a=[w[1]*R/I,w[0]*I/R]
(un exemple simple qui ne fonctionnerait pas serait a1
et2
avecI
et lesR
deux3
). À l' heure actuelle 194 184 pas par le chemin depuis les sauts de ligne compte comme un octet chacun, maisj
etk
sont coûter plus cher octets qu'ils économisent.I=i().find('^')
les raccourcis et la forme__repr__
abrégée pour faire la dernière ligneprint`w[0]`+' '*(W-len(`w`)+4)+`w[1]`+'\n'+'-'*W+'\n'+' '*I+'^'
et descendre à 182 - repl.it/EW8fC ++ 14, 482 octets
version plus lisible:
la source
Python 3,
235230 octets (référence minimisée)Je viens de minimiser la référence, car je suis très nouveau dans le code-golf.
Vous l'utilisez exactement comme l'exemple, mais la fonction est à la
s
place debalance_seesaw
.la source
w[o>p]=[o//k,p//t][o>p]
. De plus, la plupart des lignes pourraient être jointes pour se débarrasser de certains espaces supplémentaires.