pb , 83 octets
^<b[1]>>>w[B!0]{<w[B!0]{t[B]<b[T]>>}<b[0]<b[0]<[X]>>}w[B=0]{<}t[B]<[X]t[B+T]vb[T/2]
Bien qu'il y ait au moins 3 caractères dans la chaîne d'entrée, le premier et le dernier sont supprimés. Cela laisse 1 caractère (doit être imprimé sans modification) ou 2 (doit être moyenné et imprimé). Pour gérer cela, les premier et dernier caractères de la chaîne sont additionnés et divisés par deux. S'il n'y avait qu'un seul caractère (a+a)/2==a
,. S'il y en avait deux, (a+b)/2
c'est le caractère qui doit être imprimé. pb "emprunte" l'évaluation de l'expression de Python (def expression(e): return eval(e, globals())
), ce qui est automatiquement bloqué.
La gestion d'une entrée vide me coûte 5 octets. Plus précisément, <b[1]>
sur la première ligne. Plus tôt, quand j'ai dit "string", c'était un mensonge total. pb n'a pas de chaînes, il a des personnages qui se trouvent être proches les uns des autres. Rechercher le «dernier caractère d'une chaîne» signifie simplement déplacer le pinceau vers la gauche jusqu'à ce qu'il touche un caractère. Lorsqu'aucune entrée n'est fournie, la boucle "tant qu'il y a au moins 3 caractères" est entièrement ignorée et elle commence à rechercher le dernier caractère. Sans cela <b[1]>
, il continuerait à chercher pour toujours. Ce code place un caractère avec une valeur de 1 à (-1, -1) spécifiquement pour être trouvé lorsque l'entrée est vide. Après avoir trouvé le "dernier caractère" de la chaîne, le pinceau suppose que le premier est à (0, -1) et y va directement, trouvant une valeur de 0. (1+0)/2
est 0 en pb,
Mais le monorail, ça continue d'imprimer! La spécification du défi dit (empty input) => (empty output)
! L'impression d'un caractère nul ne triche-t-elle pas? En outre, cela n'est pas lié, mais vous êtes intelligent et beau.
Merci, hypothétique question-poseur. Plus tôt, quand j'ai dit "imprimer", c'était un mensonge total. En pb, vous n'imprimez pas vraiment les valeurs, vous les placez simplement sur le canevas. Plutôt que "un moyen de sortie", il est plus précis d'imaginer le canevas comme un tableau 2D infiniment grand. Il permet des indices négatifs dans l'une ou l'autre dimension, et beaucoup de programmation en pb consiste vraiment à s'assurer que le pinceau arrive à l'emplacement sur le canevas que vous souhaitez. Une fois l'exécution du programme terminée, tout élément du canevas contenant des coordonnées X et Y non négatives est imprimé à l'emplacement approprié sur la console. Lorsque le programme démarre, tout le canevas est rempli de valeurs de 0. Afin de ne pas avoir à imprimer un nombre infini de lignes, chacune avec un nombre infini d'octets nuls, chaque ligne de sortie est imprimée uniquement jusqu'au dernier caractère différent de zéro et les lignes ne sont imprimées que jusqu'à la dernière avec un caractère différent de zéro. Donc, mettre un0
à (0, 0) est toujours une sortie vide.
Non golfé:
^<b[1]> # Prevent an infinite loop on empty input
>>w[B!0]{ # While there are at least 3 chars of input:
<w[B!0]{ # Starting at the second character:
t[B]<b[T]>> # Copy all characters one position to the left
# (Effectively erasing the first character)
}
<b[0]<b[0] # Delete both copies of the last character
<[X]>> # Get in place to restart loop
}
w[B=0]{<} # Go to last character of remaining string
t[B]<[X]t[B+T] # Find it plus the first character
vb[T/2] # Divide by 2 and print