Pourquoi un simulateur?
De nos jours, les enfants n’ont ni le temps ni l’ambition voulus pour empiler des boîtes sur la balançoire ou pour jouer avec des objets physiques équilibrés. Cela laisse beaucoup de place sur le marché des logiciels pour un simulateur à levier qui, selon mes modèles, se vendra comme un fou!
Programmation d'aide recherchée
J'ai déposé le brevet pour un tel jeu (en attente), mais j'ai besoin d'un programmeur expert pour écrire la logique du jeu pour moi. À ma connaissance, il est de pratique courante de rémunérer les programmeurs en fonction de la taille en octets du programme final. En tant que tel, je vais attribuer ce contrat lucratif au plus bas soumissionnaire.
spécification
Un levier est une série de cases ou d'espaces vides équilibrés par un point d'appui. Chaque boîte a un poids particulier de un à neuf et les espaces n’ont pas de poids. Comme vous le savez, le poids d'une boîte sur le levier est directement proportionnel à sa distance par rapport au point d'appui. Une boîte de poids 4
qui se trouve sur le troisième espace du point d'appui apportera 12
des unités de force efficaces à ce côté du levier.
J'ai besoin d'un programme qui, avec un levier d'entrée, émettra un signal indiquant si le levier sera incliné vers la gauche, vers la droite ou s'il sera parfaitement équilibré.
Directives I / O
- Vous allez écrire pour moi un programme.
- L'entrée contiendra une ligne de texte.
- L'entrée viendra de
stdin
ou sous forme d'une chaîne de ligne de commande. - Les cases seront représentées par les caractères '
1
' à travers '9
'. Ces caractères représentent leurs poids respectifs. Un espace vide sera représenté par un espace ''. Le point d'appui sera représenté par un caret '
^
'.
Un exemple de levier d’entrée pourrait ressembler à: 8 2^ 941
Ce levier est parfaitement équilibré: (4*8) + 0 + 0 + (1*2) == 0 + (2*9) + (3*4) + (4*1) == 34
- Il n'y aura pas d'espaces de début ni de fin. Il n'y aura pas de nouvelle ligne de fuite.
- Nul besoin de traiter une entrée malformée, l’entrée aura toujours exactement un pivot, et uniquement des nombres et des espaces.
- La sortie indiquera si le levier est lourd à gauche, à droite ou équilibré.
- Votre programme doit avoir exactement 3 sorties possibles pouvant résulter d’une entrée bien formée. Vous pouvez choisir ce que ce sont.
- La sortie doit être soit imprimer
stdout
soit le code de retour du programme.
Cas de test
Ici , je l' utilise L
, R
, B
signifie gauche lourd, droit lourd, équilibré:
Entrée:
11 ^9
sortie:B
Entrée:
321^ 12
sortie:L
Entrée:
9^ 1
sortie:R
(Si quelqu'un a des cas de test "plus difficiles", n'hésitez pas à les éditer).
Bibliographie
Pas nécessairement inspiré par, mais lié à l' équilibre d'un ensemble de poids sur une bascule
la source
The output must either be print to stdout or be the return code of the program.
Eh bien, maintenant vous me demandez de faire une distribution de Linux qui utilise la notation de bascule pour les codes de sortie.^16
,16^
ou^
? (Supposons que cela soit possible)Réponses:
Python 2, 69 octets
Le module
ord(c)%16
extrait la valeur d'un caractère numérique tout en obtenant 0 pour l'espace. Pour chaque caractère, sa contribution au couple est calculée comme son poids multiplié par la distance signée du pivoti-s.find('^')
, et ces derniers sont additionnés et comparés à 0, produisant l'un des-1,0,1
. Le caractère^
est calculé pour avoir un poids de 14, mais cela n'a pas d'importance, car c'est sur le pivot.Un port Pyth de 18 octets par Maltysen:
Pour le code Python, si un programme complet est requis, voici 79 octets. L'idée est de démarrer l'index
i
décalé des.find('^')
et de le décompter.la source
Javascript ES6, 62 octets
-1
si laissé est plus lourd0
si équilibré1
si le droit est plus lourdUngolfed:
Tests exécutés (attribution d'une fonction anonyme à
f
):R B L
à-1 0 1
e.split``
par[...e]
(merci @ V)~~'^'
évaluée à0
...)la source
f=
et dire qu’il génère une fonction anonyme. (-2 bytes FYI)Japt , 22 octets
Japt est une version abrégée de Ja vaScri pt . Interprète
Retourne
-1
pourL
,0
pourB
et1
pourR
.Comment ça fonctionne
la source
APL,
39 à30 octetsAprès avoir relu les règles, j’ai changé ceci en sortie
-1
0
1
au lieu deL
B
R
, en économisant neuf octets.Essayez ici .
la source
Pyth, 20 octets
Suite de tests
-1
pour biaisé à gauche,0
pour équilibré,1
pour partiellement à droite.Comment ça fonctionne:
la source
Haskell,
116968276 octetsLa sortie est
0
équilibrée,-1
lourde à gauche et lourde1
à droite.Exemple d'utilisation:
f "321^ 12"
->-1
Comment ça marche: trouvez la partie avant le
^
. Multipliez la chaîne d'entrée et la liste des poids qui commence par- length-of-first-part
. Le^
a un poids de 0 et ne pas ajouter à la somme. J'utilise l'astuce du mod 16 de @ xnor pour convertir les chiffres / espaces en valeurs entières. Si la somme est négative (positive), le levier est lourd à gauche (à droite) et équilibré si la somme est à 0.la source
TeaScript , 23 octets
25J'ai essayé d'écrire une réponse Pyth mais ça s'est passé horriblement: \
Cela
²
semble tellement déplacé mais cela économise 1 octet, alors je le garderai.Essayez-le en ligne!
Tester tous les cas
Pour le schéma de sortie que j'ai choisi:
-1
si Left est plus lourd que Right (L
)0
si Left est aussi lourd que Right (B
)1
is Left est moins lourd que Right (R
)Ungolfed && Explanation
Cela utilise des cartes et réduit pour faire le travail.
la source
pb ,
349329 octetsC'était un problème. pb n'a pas été conçu pour être bon dans ce genre de chose.
Il n'y a même pas de multiplication .Mais bon, ça marche.La partie la plus difficile était, après avoir obtenu les sommes de (poids * distance) de chaque côté, de déterminer quelle lettre imprimer. pb n'a pas
>
ou<
opérateurs, juste==
et!=
. Il n'y a pas de moyen facile de déterminer quelle valeur est la plus grande. Je ne peux même pas soustraire et comparer avec 0 ... sauf si je fais quelque chose de vraiment stupide.Ensuite, vous allez simplement à X = (côté gauche - côté droit), et voilà votre réponse! Supprimez tout ce qui se trouve sur cette ligne pour le nettoyer, puis imprimez la valeur trouvée en (0, 0).
... Mais il y a un moyen légèrement plus court. Au lieu d'utiliser 'L', 'B' et 'R', utilisez ces valeurs - 'B' et ajoutez 'B' à nouveau lors de l'impression. De cette façon, vous ne devez jamais placer «B» à X = 0, vous devez simplement le laisser comme le 0 qu'il était déjà. Le seul problème est qu'une fois que vous faites cela, le programme devient très maladroit en mode veille.
'L'-'B'==76-66==10=='\n'
. Tout semble bien fonctionner, jusqu'à ce qu'un grand nombre de nouvelles lignes soient imprimées et qu'il soit impossible de garder une trace de ce qui se passe: D En mode d'exécution normal de pbi, tout fonctionne correctement, car les nouvelles lignes sont supprimées avant que quoi que ce soit ne soit imprimé. console.la source
Perl 5, 72 octets
la source
MATLAB 91, 57, 55octave, 50 octetsJe ne m'attendais pas à jouer plus loin, mais passer à Octave a permis d'économiser 5 octets supplémentaires! Wow, celui-ci a pris du temps ...
Il produit
-Inf, NaN, Inf
pourL, B, R
respectivement.Suite de tests!
Explication:
C'est certainement un code difficile à lire, mais je vais essayer de vous expliquer le mieux possible. Je vais basculer entre l'explication du bloc de code et le texte.
Regardons ce qui se passe entre les crochets:
Celui-ci est un peu délicat:
Les chiffres de chaque côté de l'échelle doivent être multipliés par la distance au caret. Si nous utilisons des nombres négatifs sur le côté gauche et des nombres positifs sur le côté droit, nous pouvons simplement additionner le vecteur pour voir quel côté est le plus lourd.
Supposons que la chaîne d'entrée est:
'321^ 12'
. Nous voulons que ce qui suit:3*(-3)+2*(-2)+1*(-1)+1*3+2*4
. Le vecteur que nous avons créé à l'intérieur des crochets commence à1-i
, ce qui est dans ce cas-3
, puisque le curseur est en 4ème position. Cela monte parnnz(x)-i
incréments de un. Nous pouvons utiliser à lannz(x)
place denumel(s)
, carx
est une chaîne ne contenant pas de zéros.Donc:
Maintenant, nous pourrions faire la multiplication élément par élément
s.*[...]
et en prendre la somme. Mais, puisque nous avons deux vecteurs, nous pouvons aussi multipliers
par la transposée de[...]
et calculer la somme en utilisant la multiplication matricielle:Cela nous donne soit un nombre négatif, ce qui signifie que le côté gauche est plus lourd, un zéro, ce qui signifie qu'il est équilibré, soit un nombre positif, ce qui signifie que le côté droit est plus lourd. Au lieu d'utiliser l'approche naïve de
sign(...)
, nous la multiplions parinf
, ce qui nous donnera soit-Inf
ouInf
à gauche et à droite. Nous obtenonsNaN
pour0*inf
, car c'est indéfini.Cela nous donne trois valeurs distinctes pour les trois résultats possibles.
la source
, 22 caractères / 38 octets
Try it here (Firefox only).
la source
JavaScript, 146 octets
Assez massive.
Démo .
la source
function t(s){
pourrait devenirt=>{
etsplit('^')
pourrait devenirsplit`^`
Ruby,
111108 octetsExplication
Résume la valeur pondérée de chaque nombre de chaque côté. Ensuite, il utilise l'opérateur de vaisseau spatial ruby pour fournir 1,0, -1 d'égalité / inégalité des deux côtés, qui est l'index d'un tableau avec la sortie correcte.
la source
PowerShell,
8373 octetsMerci à TessellatingHeckler pour le golf.
Utilise essentiellement le même algorithme que l'ancien code ci-dessous, mais ici nous parcourons les caractères de la chaîne d'entrée un par un plutôt que de parcourir l'index, ce qui économise une poignée d'octets. Lance toujours le même message d'erreur spectaculaire lorsque l'algorithme atteint
^
- n'affecte pas STDOUT.précédent
Utilise le même algorithme génial que l'excellente réponse de Dendrobium , et utilise donc le même résultat que
-1 / 0 / 1
si l'entrée estleft-heavy / balanced / right-heavy
.Pouah. Longtemps en raison d'une fonctionnalité de
prédisposition aucasting de PowerShell. Le plus pertinent ici est commentchar
multiplié par lesint
fonctions. Prendre un tableau-index d'unstring
résultat dans unchar
objet. PowerShell convertit lechar
en sa valeur ASCII correspondante (plutôt que sa valeur littérale) avant la multiplication. Donc, quelque chose comme les$a='012'[0];[int]$a*2
résultats en96
.Cela signifie que nous devons le rediffuser sous forme de chaîne. Cependant, le simple fait de nous donner le
string
tempsint
nous lestring
répète souvent. Par exemple,$a='0';$a*2
aboutirait à00
.Cela signifie que nous devons lancer le
char
versostring
avant la retransmission, pour que laint
multiplication puisse avoir lieu, avant de l'ajouter à notre accumulateur$x
.Ajoutez à cela un long chemin pour parcourir une chaîne et l'appel .NET pour afficher le signe, et nous obtenons un très long morceau de code.
NB - Cela jettera une erreur spectaculaire quand il arrivera
^
dans la chaîne, indiquant qu'il ne peut pas le convertir enint
. N'affecte pas STDOUT.la source
param($b)$i=-$b.indexOf('^');[char[]]$b|%{$x+=$i++*+"$_"};[math]::Sign($x)
à 74 octets. Cela a pris beaucoup de temps et plusieurs tentatives d'approche. math :: sign a l'air si long, mais je ne vois aucun moyen d'améliorer ce point.$i++*+"$_"
est équivalent à$i++*"$_"
if$i
est un int.CJam, 29 octets
Essayez-le en ligne
Le résultat est
-1
pour gauche-lourd,0
pour équilibré,1
pour droite-lourd.Cela semblait un peu long, mais j’ai essayé de nombreuses alternatives, et elles se sont toutes terminées entre 29 et 33 octets. Un problème est que je ne pouvais pas trouver un moyen de convertir la chaîne en valeurs qui aboutiraient automatiquement à 0 pour les espaces. Donc, j'ai fini par remplacer explicitement les espaces par des «0 caractères», ce qui ajoute évidemment à la longueur du code.
Alternatives essayées:
ee
opérateur pour ajouter l'index à la liste de valeurs.Explication:
la source
Python 3,
196114 octetsCode régulier:
Explication:
stdin
.Un grand merci à @ThomasKwa pour avoir coupé 82 octets (plus de 40%)!
la source
print('LBR'[(B>D)-(B<D)])
pour la fin etB=D=0
au début.^
. Cela vous sauveabs()
aussi.C,
140139138134100 octetsRevenir:
Courir:
Comme nous avons ASCII:
On a:
Puis somme par facteur distance à
^
.la source
SpecBAS - 140 octets
t
est un total cumulé, les valeurs sont négatives lorsque la position du caractère est supérieure à la position carat. À la fin, il voit si le total est négatif, nul ou positif et affiche le caractère correspondant de R, B ou L.Je pourrais gagner quelques octets en affichant simplement -1, 0 ou 1, comme certaines des autres réponses.
la source
Java, 83 octets
la source