Si vous exprimez un entier positif en binaire sans zéros de tête et remplacez chaque 1
par a (
et chaque 0
par a )
, alors toutes les parenthèses correspondront-elles?
Dans la plupart des cas, ils ne le feront pas. Par exemple, 9 est 1001
en binaire, qui devient ())(
, où seules les deux premières parenthèses correspondent.
Mais parfois, ils correspondent. Par exemple, 44 est 101100
en binaire, qui devient ()(())
, où toutes les parenthèses gauches ont une parenthèse droite correspondante.
Écrivez un programme ou une fonction qui prend un entier de base positif dix et affiche ou retourne une valeur vraie si la version binaire entre parenthèses du nombre a toutes les parenthèses correspondantes. Si ce n'est pas le cas, imprimez ou renvoyez une valeur falsifiée .
Le code le plus court en octets gagne.
Exemples véridiques inférieurs à 100:
2, 10, 12, 42, 44, 50, 52, 56
Exemples de fausseté inférieurs à 100:
1, 3, 4, 5, 6, 7, 8, 9, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 43, 45, 46, 47, 48, 49, 51, 53, 54, 55, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99
Réponses:
TeaScript , 9 octets
16 18 20 22 24Enregistré 2 octets grâce à @ETHproductions
Woah. C'est court. Utilise l'approche de @ xnor. Cela utilisera la fonction de remplacement récursif (
W
) qui remplacera tout10
égal à()
rien. Si la chaîne est vide, elle est équilibrée.L'utilisation d'une version de TeaScript créée après la publication de ce défi pourrait devenir 7 octets:
Non golfé
Explication
la source
~--c
c'est faux dans exactement le même scénario quec--
.Pyth, 10 octets
Essayez cette suite de tests dans le compilateur Pyth.
Comment ça marche
la source
!u:G`Tk.BQ
. Sans doute plus facile à comprendre.Python2, 87 octets
Une implémentation terrible qui abuse des erreurs de syntaxe.
la source
JavaScript (ES6),
555451 octetsOctets enregistrés grâce à @ Vɪʜᴀɴ et @xsot !
Explication
la source
f=
. Vous pouvez également utiliser use+c
au lieu dec|0
to case à un entier. Vous pouvez également utiliser(+c?d++:d--)
ce qui est encore plus courtf=
? Parce que beaucoup d'autres réponses JavaScript sur le site nomment leurs fonctions.11
, retournetrue
quand il devrait revenirfalse
n=>![...n.toString(d=2)].some(c=>(d+=c*2-1)<2)*d==2
Python 2, 45 octets
Une fonction récursive. Lit les chiffres binaires
n
de la fin, en comptanti
le niveau d'imbrication actuel des parens. S'il tombe en dessous0
, rejetez. Lorsque nous atteignons le début, vérifie si le nombre est0
.En fait, nous commençons le décompte à
i=1
pour qu'il soit facile de vérifier s'il est tombé0
. Le seul cas de réussite du terminal estn==0
eti==1
, vérifié avecn<i<2
. Nous forçons cette vérification à se produire sin==0
, ou si ellei
tombe0
, auquel cas elle échoue automatiquement.feersum a économisé deux octets en restructurant les cas non récursifs avec des inégalités de court-circuit.
la source
f=lambda n,i=1:n>0<i*f(n/2,i+(-1)**n) or n<i<2
, au moins, sauve 1.CJam, 11 octets
C'est un peu impur: pour les nombres entre parenthèses, il imprimera un ou plusieurs blocs. Pour les numéros sans parenthèse, il se bloquera sans rien imprimer sur STDOUT. Si vous essayez ceci en ligne dans l' interpréteur CJam , gardez à l'esprit qu'il ne fait pas de distinction entre STDOUT et STDERR.
Étant donné que les chaînes non vides / vides sont véridiques / fausses dans CJam et que la sortie imprimée est toujours une chaîne, elle respecte sans doute les règles. Au coût supplémentaire de 3 octets supplémentaires , pour un total de 14 octets , on peut en fait une laisse truthy ou falsy chaîne sur la pile qui sera imprimé:
Cela se bloque toujours pour les numéros sans parenthèse, ce qui est autorisé par défaut .
Essais
Comment ça marche
CJam, 15 octets
Essayez ce violon dans l'interpréteur CJam ou vérifiez tous les cas de test à la fois .
Comment ça marche
la source
Python, 51 octets
Une fonction anonyme. Évalue une expression qui ressemble à
Chaque remplacement supprime tout
10
ce qui correspond()
. Une fois tous les remplacements effectués, la fonction retourne si ce qui reste n'est que le préfixe binaire0b
. Il suffit plus que de faire desn
remplacements, car unk
nombre à -digit prend au plus desk/2
étapes et sa valeur est la plus élevée2**k
.la source
Rubis, 40
Manipulation de chaîne simple. Laisse '10' jusqu'à ce qu'il n'en reste plus.
la source
Sérieusement , 17 octets
Sorties
0
pour faux et1
pour vrai. Essayez-le en ligne .Explication:
la source
Japt, 23 octets
Japt est une version abrégée de Ja vaScri pt . Interprète
Cela me rappelle jusqu'où Japt doit encore aller par rapport à TeaScript. Après avoir réorganisé l'interprète dans les prochains jours, j'aimerais ajouter des caractères de "raccourci" comme Vɪʜᴀɴ.
Comment ça marche
Peu de temps après ce défi, @ Vɪʜᴀɴ (maintenant connu sous le nom de @Downgoat) m'a aidé à implémenter une fonction de remplacement récursif, comme
W
dans la réponse TeaScript. Cela signifie que ce défi peut désormais être effectué en seulement 5 octets:Testez-le en ligne!
la source
Mathematica, 49 octets
la source
1,0
de la liste et testez si le résultat est une liste vide.Octave, 48 octets
la source
C ++,
10494 octetsExécuter avec ce compilateur , doit spécifier une entrée standard avant de s'exécuter.
Explication
n>>=1
.c+=n&1?-1:1
conserve le nombre de parenthèses ouvertes)
.n&c>=0
s'arrête lorsqu'il ne reste que des 0 en tête ou que les parenthèses se ferment plus qu'elles n'ouvrent.la source
Haskell,
4946 octetsExemple d'utilisation:
f 13
->False
.Je garde une trace du niveau d'imbrication
l
comme beaucoup d'autres réponses. Cependant, le cas «équilibré» est représenté par1
, donc le cas «plus-)
que-(
» l'est0
.PS: a trouvé l'ajustement du niveau d'imbrication
l+(-1)^n
dans la réponse de xnor .la source
signum
semble trop compliqué, pourquoi pas juste_#0=1<0
?l>0
place del==1
?l==1
est équilibré. Sil>1
, les parenthèses ne sont pas équilibrées.Python 2,
6057565553525049 octetsMerci à xnor pour avoir économisé deux octets et feersum pour avoir porté le nombre final d'octets à 49!
Explication
Le numéro d'entrée,,
n
est traité à partir de son bit le moins significatif.i
est un compteur qui garde la trace du nombre de 0 et de 1. Notez qu'il est initialisé1
pour enregistrer un octet. La boucle s'interrompra avant d'n
atteindre 0 si le nombre de 1 dépasse le nombre de 0 (i<=0
).Pour que les parenthèses soient équilibrées, deux conditions sont requises:
i==1
)n==0
). Edit: J'ai réalisé que cette condition n'est pas nécessaire car ellei
doit être non positive sin!=0
la condition précédente est suffisante.la source
i
et nen
sont pas négatifs, alorsi==n==0
c'esti+n==0
.i
peut être négatif si la boucle s'interrompt prématurément.i|n==0
devrait toujours fonctionner.while i*n
devrait fonctionnerJavaScript ES5,
11887858277 octetsTechnique intéressante à mon avis. Beaucoup moins, grâce à @ETHproductions et @NotthatCharles
JavaScript ES6,
77575654 octets-21 octets aux productions ETH.
la source
function p(x){x=x.toString(2);r=/10/;while(x.search(r)>=0){x=x.replace(r,"")}return!x}
x=>([...x=x.toString(2)].map(_=>x=x.replace(/10/,"")),!x)
L'astuce est de déplacer la boucle while dans un.map
, car il n'y a jamais plus de 10 dans une entrée que sa longueur.map
.x=>[...x=x.toString(2)].map(_=>x=x.replace(/10/,""))&&!x
IDK s'il peut devenir plus court cependant.D,
209170 octetsCela fait exactement ce qu'il est censé faire sans ajouts ni avantages.
la source
C, 67 octets
À peu près un portage de ma soumission python.
la source
Prolog, 147 octets
Comment ça marche
Convertit le nombre décimal N en sa représentation binaire sous forme de liste (inversée). Sens:
Ensuite:
Récursive sur la liste [H | T] en augmentant N si l'élément head vaut 0 sinon en le diminuant.
Si N à tout moment devient négatif ou si N à la fin n'est pas 0, retourne faux, sinon vrai.
La coupure
Existe-t-il pour empêcher le retour en arrière et trouver des solutions non binaires aux
tests b (N, [N])
Essayez-le en ligne ici
Exécutez-le avec une requête comme:
la source
PowerShell, 106 octets
Je ne gagnerai aucune compétition de la plus courte durée, c'est certain. Mais bon, au moins ça bat Java?
Utilise l'appel très long .NET
[convert]::ToString($a,2)
pour convertir notre numéro d'entrée en une chaîne représentant les chiffres binaires. Nous passons ensuite en boucle à travers cette chaîne avec1..$b.length|%{..}
. Chaque boucle, si notre chiffre est un1
(évalué avec%2
plutôt que-eq1
pour économiser quelques octets), nous incrémentons notre compteur; sinon, on le décrémente. Si nous atteignons un résultat négatif, cela signifie qu'il y a eu plus)
que ce qui a été(
rencontré jusqu'à présent, alors nous produisons0
etexit
. Une fois que nous avons parcouru la boucle,$c
est soit0
un certain nombre>0
, alors nous prenons le non logique de celui-!
ci, qui obtient la sortie.Cela a la particularité de sortir
0
si les parens ne correspondent pas parce que nous en avons plus)
, mais de sortirFalse
si les parens ne correspondent pas parce que nous en avons plus(
. Déclarations de fausseté essentiellement fonctionnellement équivalentes, juste intéressantes. Si les parens correspondent tous, les sortiesTrue
.la source
GNU Sed (avec extension eval), 27
Sed n'a pas vraiment une idée définie de véridique et de falsey, alors ici je prétends que la chaîne vide signifie véridique et toutes les autres chaînes signifient falsey.
Si cela n'est pas acceptable, nous pouvons alors procéder comme suit:
GNU Sed (avec extension eval), 44
Cela renvoie 1 pour véridique et 0 sinon.
la source
𝔼𝕊𝕄𝕚𝕟 (ESMin), 21 caractères / 43 octets
Try it here (Firefox only).
Notez que cela utilise des variables prédéfinies à des nombres (spécifiquement 2 et 0). Il existe des variables numériques prédéfinies de 0 à 256.
19 caractères / 40 octets, non concurrentiel
Try it here (Firefox only).
Décidé d'implémenter la sortie implicite ... Cependant, les formulaires de sortie précédents sont toujours pris en charge, vous avez donc plusieurs options de sortie!
la source
Java,
129131 octetsPeut probablement être raccourci. Explication à venir. Merci à Geobits pour 4 octets de moins!
la source
int k=0;
avecint j=0;
?int k=0,j=0;for(...
vous pouvez ensuite placer lachar[]
déclaration dans l'initialiseur de boucle pour enregistrer un point-virgule également.C ++, 61 octets
Je pense que la réponse C ++ actuelle est fausse: elle retourne une valeur véridique pour tous les nombres pairs, par exemple 4. Avertissement: Je n'ai pas pu utiliser le compilateur mentionné, j'ai donc utilisé g ++ 4.8.4. Le problème réside dans l'utilisation de l'opérateur binaire ET au lieu de l'opérateur logique ET qui est utilisé pour rompre tôt lorsque le nombre de parenthèses fermantes dépasse le nombre de parenthèses ouvrantes. Cette approche pourrait fonctionner si
true
est représentée comme un mot avec un motif de bits vrai. Sur mon système, et probablement la plupart des autres systèmes,true
est équivalent à1
; un seul bit est vrai. En outre,n/=2
est plus court quen>>=1
. Voici une version améliorée en fonction:la source
𝔼𝕊𝕄𝕚𝕟 (très non compétent), 6 caractères / 8 octets
Try it here (Firefox only).
J'ai décidé de revisiter ce défi après très, très longtemps. 𝔼𝕊𝕄𝕚𝕟 s'est tellement amélioré.
La raison pour laquelle il s'agit d'une réponse distincte est que les 2 versions sont presque complètement différentes.
Explication
Convertit l'entrée en binaire, remplace récursivement les instances de 10, puis vérifie si le résultat est une chaîne vide.
la source
C # 98 octets
ouvert à toutes suggestions. j'aime ce défi même si c'est vieux
la source