Je reproduis la deuxième partie du premier jour de l'Avent de Code, avec la permission du créateur.
Le Père Noël essaie de livrer des cadeaux dans un grand immeuble d'appartements, mais il ne trouve pas le bon étage - les instructions qu'il a obtenues sont un peu déroutantes. Il commence au rez-de-chaussée (étage 0) et suit ensuite les instructions un caractère à la fois.
Une parenthèse ouvrante (
signifie qu'il doit monter d'un étage et une parenthèse fermante )
signifie qu'il doit descendre d'un étage.
L'immeuble est très haut et le sous-sol est très profond; il ne trouvera jamais les étages supérieurs ou inférieurs.
Étant donné un ensemble d'instructions, trouvez la position du premier personnage qui le fait entrer dans le sous-sol (étage -1).
À titre d'exemples:
l'entrée le )
fait entrer dans le sous-sol à la position de caractère 1.
l'entrée le ()())
fait entrer dans le sous-sol à la position de caractère 5.
Une entrée longue est donnée ici qui devrait donner la solution 1797.
C'est le golf de code, donc la solution la plus courte l'emporte!
Réponses:
Gelée,
87 octetsMerci à @ Sp3000 d'avoir joué au golf sur 1 octet!
Essayez-le en ligne!
Comment ça fonctionne
la source
Python 2, 44 octets
Cette solution intelligente a été trouvée par hallvabo, xsot, mitchs et whatisgolf sur ce problème sur le golf Anarchy . Si l'un d'entre vous souhaite le publier à la place, je le supprimerai.
L'astuce consiste à laisser l'analyseur de Python faire le travail. La fonction
input()
essaie d'évaluer une chaîne d'entrée et renvoie une erreur sur le premier paren sans correspondance. Cette erreur, lorsqu'elle est détectée, a la formequi comprend le numéro de caractère où l'erreur s'est produite.
la source
Python,
7977 octetsIl y a probablement une meilleure façon de procéder, mais je suis à court d'idées. C'est aussi mon premier post sur codegolf.
Merci à @Erwan. pour jouer au golf sur 2 octets.
la source
[0:g]
par[:g]
-2*ord(z)+81
par2*(z<')')-1
Python 3, 59
Enregistré 3 octets grâce à grc.
Je n'aime vraiment pas faire l'indexation manuelle des chaînes en Python. Ça fait tellement mal.
la source
C, 55 octets
Essayez-le ici .
Edit: Je ne sais pas pourquoi j'ai laissé une variable inutilisée là-dedans ...
la source
CJam, 10 octets
ou
ou (crédits à Dennis)
Testez-le ici.
Explication
Comme A Simmons l'a déjà noté,
()
est un choix chanceux pour CJam car ce sont les opérateurs de décrémentation / incrémentation, respectivement. Cela signifie que si nous partons de zéro, nous recherchons l'étape à laquelle le Père Noël atteint l'étage 1.la source
Labyrinthe , 18 octets
Essayez-le en ligne! Cette réponse est le résultat d'une collaboration avec @ MartinBüttner.
Explication
L'amorce Labyrinth habituelle (je dis "habituelle", mais je la réécris à chaque fois):
n*10 + <digit>
. Cela permet de constituer facilement de grands nombres. Pour commencer un nouveau nombre, utilisez_
, qui pousse zéro.Ce code est un peu bizarre car, à des fins de golf, la boucle principale combine deux tâches en une. Pour la première moitié de la première passe, voici ce qui se passe:
Maintenant que la pile a été initialisée avec un -1 en haut, le traitement réel peut commencer. Voici ce que fait la boucle principale.
Le dernier doublon ajoute un élément à la pile pour chaque itération que nous effectuons. C'est important parce que, lorsque nous atteignons zéro et que nous allons de l'avant au NOP, nous faisons:
la source
Oracle SQL 11.2,
160159 octetsNon golfé
la source
Retina ,
2221Essayez-le en ligne ou essayez le grand cas de test. (L'URL est grande pour le grand cas de test, faites-moi savoir si elle se casse pour vous, semble OK en chrome.)
1 octet économisé grâce à Martin!
Nous faisons correspondre le premier ensemble de parenthèses équilibrées et l'extrayons, puis nous comptons le nombre de fois où la chaîne vide correspondra à ce résultat. Je ne sais pas si c'est la meilleure façon de le faire dans Retina, en particulier si le mode PCRE le rend plus court, mais l'utilisation du
$#_
remplacement semblait être plus longue en raison d'une erreur par une erreur et du problème d'avoir plus d'une correspondance.Cet algorithme provoque un comportement étrange pour une entrée invalide, il suppose essentiellement que si le Père Noël ne se rend pas au sous-sol, il s'y téléporte mystérieusement après les autres mouvements.
la source
Grep + AWK, 51 octets
La
grep
commande place chaque caractère sur une nouvelle ligne.la source
Pyth, 13 octets
Explication
Essayez-le ici
Ancien algorithme, 15 octets
Explication:
Essayez-le ici
Ou si autorisé à utiliser des caractères autres que
(
and)
, 9 octets (déplacement du prétraitement vers l'entrée)Explication
Essayez-le ici
la source
JavaScript (ES6), 58 octets
Fonctionne en supprimant récursivement une paire de
()
s correspondants jusqu'à ce que le premier caractère soit a)
. Avertissement: n'essayez pas ceci sur des chaînes qui n'ont pas assez de)
s. Exemple:À ce stade, il constate que 12 caractères ont été supprimés au total, de sorte que la réponse est 13.
la source
MATL ,
1211 octets1 octet enregistré en utilisant l'idée de Dennis de calculer -1 élevé à la chaîne d'entrée
Essayez-le en ligne!
la source
CJam,
1210 octetsEssayez-le ici.
Deux octets enregistrés grâce à Martin.
Explication:
la source
Javascript, 117 octets
Ignore les autres personnages. Utilise
prompt
etalert
.la source
Perl, 34 + 1 = 35 octets
Merci à Dennis pour quelques conseils.
Courez avec le
-p
drapeau. Cela fonctionne en Perl 5.10, mais les versions ultérieures ont besoin d'un espace ici:++ while
Version plus ancienne, non golfée:
la source
Python, 44 octets
Le plancher
i
commence à1
ce que nousi
finissions par être la valeur de falsey0
. S'il n'est pas terminé, ajoutez-en un récursivement pour obtenir le premier caractère supprimé et le numéro d'étage mis à jour en fonction de ce caractère.la source
Javascript, 57 octets
Assez simple, itère simplement sur l'entrée, incs if '(' decs if ')'. Rend le premier négatif.
la source
Rubis, 47 octets
Fonction anonyme.
la source
C, 73 octets
Attend une entrée sur STDIN; aucun caractère autre que
(
et)
peut apparaître dans l'entrée (au moins jusqu'à ce que nous ayons atteint la réponse). L'entrée doit être ASCII.Emet la réponse sur STDOUT.
Utilise la différence de 1 bit entre l'ASCII pour
(
et)
.Version bien formatée:
la source
f=c=0
initialisation de la bouclefor(f=c=0;f!=...
pour enregistrer un octet?PowerShell,
756562 octetsUtilise une technique similaire à celle des nombres binaires parenthifiables pour parcourir tous les caractères en entrée, en conservant une longe en cours d'
$c
exécution+1
pour chacun(
et-1
pour chacun)
, puis en testant si nous avons atteint un résultat négatif (c'est-à-dire que nous sommes au sous-sol).Édition - économisé 10 octets en itérant sur les caractères réels plutôt que sur leurs index
Édition 2 - économisé 3 octets supplémentaires en échangeant la vérification d'égalité pour modulo, donc la conversion est implicite
la source
Mathematica,
6255 octetsTous les noms de fonction longs! Fonctionne de manière similaire à la réponse CJam de Simmons.
la source
Befunge 25 octets
Sorties en unaire. Cela vous démarre au premier étage et ira jusqu'à 0.
la source
Raquette (102)
Non golfé
la source
APL, 18 caractères
En anglais:
¯1*')'=⍵
: -1 où input = ")", 1 sinon;+\
: somme courante;1⍳⍨¯1=
: trouve l'indice du premier -1.la source
Lua,
928987 octetsIl prend un argument de ligne de commande.
Modifier: enregistré 3 octets
Edit: enregistré 2 octets, et corrigé un bug qui pouvait se produire sur les cas de bord, il sort maintenant via son code de sortie
Non golfé
la source
k / kona ,
2321 octets2 octets enregistrés en supprimant les parenthèses inutiles.
Usage:
la source
Perl, 40 + 1 = 41 octets
Nécessite le
-p
drapeau:Suppose une entrée valide.
Comment ça fonctionne:
la source
Javascript (ES6),
6867 octetsPrend l'entrée comme premier argument
Explication
la source
Python (3,5),
787162 octetsune solution récursive
c'est similaire à cette solution pour mini golf
nous pouvons supposer que le père Noël atteint toujours le sous-sol
la source