Votre tâche consiste à, étant donné un entier non signé n
, trouver le plus grand nombre qui peut être créé en supprimant un seul octet (8 bits consécutifs) de données.
Exemple
Compte tenu du nombre 7831
, nous le convertissons d'abord en binaire (en supprimant les zéros non significatifs):
1111010010111
Nous trouvons ensuite le groupe consécutif de 8 bits qui, une fois retiré, donnera le nouveau résultat le plus important. Dans ce cas, il existe 3 solutions, présentées ci-dessous
1111010010111
^ ^
^ ^
^ ^
Suppression de l'un de ces rendements 11111
, que nous convertissons ensuite à sa valeur décimale 31
pour la réponse.
Cas de test
256 -> 1
999 -> 3
7831 -> 31
131585 -> 515
7854621 -> 31261
4294967295 -> 16777215 (if your language can handle 32 bit integers)
Règles
- Il est garanti que la longueur du bit
n
sera supérieure à 8. - Votre solution devrait théoriquement fonctionner pour toute longueur de bit
n
supérieure à 8, mais en pratique, elle n'a besoin de fonctionner que pour les entiers 255 <n <2 16 - L'entrée / sortie doit être décimale.
- Vous pouvez soumettre un programme complet ou une fonction.
- Il s'agit de code-golf , donc le programme le plus court (en octets) gagne!
Réponses:
Gelée , 6 octets
Un lien monadique prenant un numéro et renvoyant un numéro.
Essayez-le en ligne!
Comment?
Utilise un beau rapide ,
Ƥ
développé par miles ...la source
J , 12 octets
Essayez-le en ligne!
la source
&.
; c'est le genre de problème parfait pour cela.Python 2 , 41 octets
Essayez-le en ligne!
la source
JavaScript (ES6), 54 octets
Fonctionne jusqu'à 2 ** 31-1. Parce que quelqu'un a demandé une réponse un peu tordue ...
la source
Pyth , 21 octets
Il s'agit d'une fonction récursive (doit être appelée avec
y
, ou voir le lien).Essayez-le ici!
la source
Mathematica, 69 octets
Essayez-le en ligne!
Cette solution fonctionne pour les grands nombres Essayez-la en ligne!
-3 octets de KellyLowder
la source
Max[c=#~RealDigits~2;Array[Drop[c[[1]],#;;#+7]~FromDigits~2&,Last@c-7]]&
Python 3 ,
686660 octets-2 octets grâce à M. Xcoder!
-4 octets grâce aux ovs!
-2 octets grâce à Erik l'Outgolfer!
Essayez-le en ligne!
la source
n.bit_length()-8
est équivalent àlen(bin(n))-10
.Wolfram Language (Mathematica) , 46 octets
Essayez-le en ligne!
Cette version ne peut gérer que des entrées jusqu'à 2 518 -1, sinon nous rencontrons la limite de taille de pile de Mathematica. (La limite peut varier entre les installations de Mathematica.) La deuxième solution de cette réponse évite cela.
Comment ça marche
Une approche récursive basée sur la logique suivante:
0
inférieure à toute entrée256
, car la suppression d'un octet du nombre mange le nombre entier. C'est notre cas de base, c'est pourquoi il est inclus même si les spécifications nous promettent que nous n'aurons pas à gérer de telles entrées.Max
des deux options: manger l'octet le plus bas (en nous donnant l'entrée divisée par256
) ou couper le bit le plus bas, récuser sur l'entier restant et ajouter le bit le plus bas lorsque nous avons terminé.Wolfram Language (Mathematica) , 55 octets
Essayez-le en ligne!
Une version alternative qui construit une table au lieu de la récursivité, donc elle fonctionne pour les nombres de toute taille que Mathematica peut gérer.
la source
Rétine ,
716764 octetsEssayez-le en ligne! Link ne comprend que les cas de test les plus rapides, afin de ne pas surcharger indûment le serveur de Dennis. Edit: sauvé 3 octets grâce à @MartinEnder. Explication:
Convertissez de décimal en binaire.
Construisez une liste de chaînes obtenues en supprimant 8 chiffres consécutifs de toutes les manières possibles.
Triez-les dans l'ordre inverse et prenez le premier (le plus grand).
Reconvertissez en décimal. (Voir l' explication de @ MartinEnder .)
la source
Java (OpenJDK 8) ,
138134 octetsEssayez-le en ligne!
la source
i.toBinaryString(i)
peut êtrei.toString(i,2)
.ReRegex ,
294275 octets19 octets enregistrés en utilisant de meilleures définitions de «fonction»
Je dirais que c'est assez bon pour une langue Regex uniquement.
La bibliothèque de base permet la conversion entre Unary et Decimal (ce qui est nécessaire car la spécification de défi indique explicitement décimal), mais ne prend pas en charge Binary; J'ai donc dû l'écrire dans le cadre du script en y ajoutant 120 octets.
Essayez-le en ligne!
Par des expressions rationnelles individuelles.
Pas
Premièrement, nous importons la bibliothèque «de base», qui donne deux expressions régulières. Celui qui se transforme
u<numbers>
en unaire. Et celui qui convertitd<unary_underlines>
en décimal. En effet, le défi nécessite des E / S en base10.Ensuite, nous définissons une poignée de regex qui convertissent unaire en binaire.
Le premier d'entre eux,
b(\d*):(_*)\2_b/b1$1:$2b/
rechercheb
, éventuellement suivi de quelques chiffres binaires, puis a:
, puis n'importe quel nombre de soulignements, suivi du même nombre exact de soulignements plus un, et enfin un autreb
.Nous remplaçons ensuite cela par
b1
suivi des chiffres binaires d'avant,:
et juste la première moitié des traits de soulignement, et enfin la dernièreb
.Donc, cela vérifie si l'unaire n'est pas divisible par deux, et si c'est le cas, ajoute 1 à ses chiffres binaires, puis le divise moins un par deux.
Le second
b(\d*):(_+)\2b/b0$1:$2b/
est presque idendique, mais ne recherche pas de supplément_
, ce qui signifie qu'il ne correspond que s'il est divisible par deux, et dans ce cas, ajoute un à la0
place.Le troisième vérifie si nous n'avons plus de chiffres unaires, et si c'est le cas, supprime le rembourrage pour ne laisser que les chiffres binaires.
Le dernier vérifie s'il n'y a jamais eu de chiffres binaires fournis, et dans ce cas, laisse simplement
0
.Le groupe suivant de regex que nous définissons consiste à reconvertir le binaire en unaire, et est légèrement plus simple.
Le premier de ce groupe,
B(_*):1/B$1$1_:/
tout comme son antithèse, détecte alors unB
, suivi de n'importe quelle quantité de chiffres unaires:1
. Il ne vérifie pas la correspondanceB
dans ce cas, car il ne recherche qu'un seul chiffre à la fois. Si cela correspond, il double le nombre de chiffres unaires précédemment appariés et en ajoute un, puis supprime celui-ci.Le second
B(_*):0/B$1$1:/
,, est presque identique au premier, sauf qu'il correspond à a0
plutôt qu'à a1
, et n'ajoute pas de chiffre unaire supplémentaire.Le dernier de ces derniers,
B(_*):B/$1/
vérifie s'il n'y a plus de chiffres binaires, et si c'est le cas, décompresse l'unaire. Contrairement à son antithèse, cela n'a pas besoin d'un cas 0 spécial.Ensuite, nous définissons les
j
regexes, qui agissent comme une fonction de division.Le premier,
j(\d*),\1(\d)(\d{7})(\d*):/j$1$2,$1$2$3$4:,B:$1$4B/
fait la plupart des travaux lourds. Il recherchej
, éventuellement suivi de chiffres binaires qui sont "l'incrémenteur", puis une virgule suivie de l'incrémenteur puis exactement 8 chiffres binaires suivis du reste du nombre binaire, puis a:
. Le premier des 8 chiffres est ajouté à l'incrémenteur, l'incrémentant ainsi, puis tout sauf les 8 chiffres de l'entrée binaire est ajouté après le:
suivant a,
. Donc (si nous utilisions 2 chiffres au lieu de 8)j,1001:
deviendraitj1:1001:,01
alorsj10:1001,01,11
. En outre, les éléments de tableau ajoutés sont enveloppés dansB
s, pour les reconvertir en unaire.L'autre
j(\d*),\1\d{0,7}:,?(.*)/,$2,/
vérifie s'il reste moins de 8 chiffres binaires à vérifier après l'incrémenteur et, dans l'affirmative, supprime tout autre que le tableau encapsulé dans,
s. Par exemple.,_,___,
Pendant et après la création du tableau, nous définissons les expressions rationnelles de comparaison.
La première d'entre elles,
,((_+)_+),(\2),/,$1,/
vérifie une virgule suivie d'une certaine quantité de soulignements, puis de quelques autres, suivis d'une virgule, puis de la première quantité de soulignements, qu'une virgule. Il le remplace ensuite par le nombre total de soulignements dans le premier élément entouré de l',
art.Ce dernier,
,(_+),(\1_*),/,$2,/
vérifie la présence d'une virgule suivie d'une certaine quantité de tirets bas suivis d'une autre virgule, puis du même montant ou de plusieurs tirets bas, et d'une dernière virgule. Cela laissera à la place le bon élément.Enfin, quand il y a un élément restant correspondant
^,(_*),$
, nous supprimons les virgules environnantes et reconvertissons en décimal viad<>
. Ensuite, plus aucune expression régulière ne peut se déclencher et la sortie est présentée.L'entrée est initialement placée dans le modèle
j,b:u<(?#input)>b:
, qui convertit d'abord l'entrée décimale en unaire, par exemple5
->j,b:_____b:
, puis l'unaire résultant en binaire,j,101:
puis divise le binaire (qui ne fonctionne pas pour l'exemple), obtient le plus grand élément, convertit retour à la décimale, et terminé.la source
C (gcc),
91octets-23 octets de Colera Su
Prend en charge jusqu'à
2**31-1
Essayez-le en ligne!
Commence par les 8 bits les plus bas
(j=0)
, puis monte, changeant la sortie si le nombre avec des bits[j,j+8)
coupés est plus grand que notre courant, et continue jusqu'à ce que x n'ait pas de bits au-dessusj+8
la source
x>>j+8
etx>>j+8<<j|x%(1<<j)
dans une variable (parenthèses supprimées) le réduira à 68 octets .Gelée , 12 octets
Essayez-le en ligne!
Octets enregistrés grâce à Jonathan Allan !
la source
JavaScript (ES6),
9491 octets-3 octets grâce à Justin Mariner
Je lance simplement une solution basée sur des chaînes JavaScript, mais j'espère que quelqu'un publiera une solution distincte basée sur les bits afin que je puisse apprendre quelque chose.
Ma solution récupère récursivement un morceau de 8 bits de la chaîne, en prenant la valeur maximale trouvée.
Afficher l'extrait de code
la source
+(...)
qui se transforme'0b'+c[1]+c[2]
en nombre, car il le faitMath.max
déjà. Essayez-le en ligne! ( spécification pour référence future )C # (.NET Core) ,
122 + 13 = 135120+ 13 = 133 octetsEssayez-le en ligne!
+13 pour
using System;
J'imagine qu'il existe un moyen de le faire sans utiliser
Convert
. De toute façon, je suis sûr que cela pourrait être réduit.Remerciements
-2 octets grâce à Kevin Cruijssen
UnGolfed
la source
while
enfor
et en le mettantvar b
:for(var b=Convert.ToString(n,2);i<b.Length-7;)
,t
et en ne l'utilisant pasMath.Max
, mais une vérification manuelle à la place:n=>{int m=0,i=0,t;for(var b=Convert.ToString(n,2);i<b.Length-7;m=t>m?t:m)t=Convert.ToInt32(b.Remove(i++,8),2);return m;}
( 120 + 13 octets )PHP, 67 + 1 octets
Exécuter en tant que pipe avec
-nR
ou l' essayer en ligne .la source
Pyth, 19 octets
Réponse alternative:
Explication:
L'autre réponse utilise une approche similaire, sauf qu'elle tourne en premier à droite et obtient tous les bits sauf les 8 derniers.
la source
MATL ,
2321 octetsEssayez-le en ligne!
Malheureusement,
Bn8-:8:!+q&)
ne produit que les tranches à supprimer, pas le reste que nous aimerions conserver.la source
Bn8-:"GB[]@8:q+(XBvX>
(attribuer[]
avec(
au lieu d'utiliser&)
, et remplacer&:
par:
et addition)Java (OpenJDK 8) , 73 octets
Essayez-le en ligne!
la source
Octave ,
8180 octetsEssayez-le en ligne!
Il s'agit d'une solution différente de ma tentative d'origine, économisant 14 octets supplémentaires.
Le code se décompose comme suit:
Sur la sixième ligne, le nombre de groupes est calculé en trouvant l'exposant de la puissance suivante de deux plus grand que l'entrée (nombre de bits dans le numéro d'entrée), et en soustrayant 7 car nous supprimons 8 bits de chaque groupe - le nombre résultant est stocké dans
b
pour plus tard.Nous calculons ensuite un tableau de puissances de deux sur la cinquième ligne qui est assez grand pour tous les groupes possibles qui peuvent être supprimés. Nous enregistrons cela en variable
c
pour plus tard.À la ligne suivante (quatrième ligne), nous multiplions l'entrée par le tableau de puissances de deux (essentiellement le décalage binaire de chaque nombre vers le haut) et convertissons le résultat en binaire. Si nous prenons l'exemple du 7831, cela donne un tableau 2D contenant:
Si nous coupons ensuite les 8 bits du centre, cela équivaut à supprimer chacun des groupes de 8 bits. Cela se fait par la troisième ligne.
Le tableau résultant est reconverti en décimal sur la deuxième ligne. Nous devons également diviser par
c
pour annuler la mise à l'échelle qui a été effectuée pour chaque groupe au départ.Enfin, sur la première ligne, une fonction anonyme est déclarée et la valeur maximale de tous les groupes est calculée.
nextpow2(x+1)
plutôt quennz(bin2dec(x))
Tentative d'origine -
120 9895 octetsEssayez-le en ligne!
Le code est divisé comme suit:
Fondamentalement, il calcule une matrice contenant les groupes de valeurs possibles qui peuvent être supprimés, puis détermine laquelle finit par donner le plus grand nombre.
En travaillant ligne par ligne, la cinquième ligne calcule les groupes qui peuvent être supprimés. Par exemple, prenez 7831. Il s'agit d'un nombre de 13 bits, donnant aux groupes:
Le résultat de la cinquième ligne est un tableau logique 2D qui peut être utilisé pour l'indexation.
La quatrième ligne du code convertit l'entrée en un tableau de bits (représentés par les caractères «0» et «1»), puis la réplique
n
-7 fois (oùn
en nombre de bits) en donnant une ligne pour chaque regroupement possible. Le masque de groupe ci-dessus est utilisé pour supprimer chacun des groupes possibles.Sur la troisième ligne, le résultat est ensuite remodelé pour annuler l'aplatissement indésirable résultant de l'application du masque de groupe. La deuxième ligne se reconvertit en un tableau de nombres décimaux résultants. Et la première ligne définit la fonction anonyme comme étant la valeur maximale d'un tableau de groupes possibles.
la source
Perl 5 , 78 + 1 (
-p
) = 79 octetsEssayez-le en ligne!
la source
Ruby , 55 octets
Essayez-le en ligne!
la source
Perl, 53 octets
(le
use 5.10.1
pour amener perl au niveau 5.10.1 est gratuit)Donnez le numéro d'entrée sur STDIN. Manque de mémoire pour les grands nombres, mais le nombre 32 bits en entrée n'est pas encore un problème
la source