"Ajuster les chiffres"
Sam a une idée "géniale" pour la compression! Pouvez-vous m'aider?
Voici un aperçu du schéma de compression de Sam. Prenez d'abord une représentation en base 10 de tout nombre naturel strictement inférieur à 2 ^ 16, et écrivez-le sous la forme d'une chaîne binaire sans zéros non significatifs.
1 -> 1 9 -> 1001 15 -> 1111 13 -> 1101 16 -> 10000 17 -> 10001 65535 -> 111111111111111
Remplacez maintenant tout groupe d'un ou plusieurs zéros par un seul zéro. En effet, le nombre est devenu plus maigre. Votre chaîne binaire ressemblera maintenant à ceci.
1 -> 1 -> 1 9 -> 1001 -> 101 15 -> 1111 -> 1111 13 -> 1101 -> 1101 16 -> 10000 -> 10 17 -> 10001 -> 101 65535 -> 111111111111111 -> 111111111111111
Maintenant, vous reconvertissez la chaîne binaire en une représentation de base 10, et la sortez dans n'importe quel format acceptable. Voici vos cas de test. Le premier entier représente une entrée et le dernier entier représente une sortie. Notez que certains nombres ne changent pas et peuvent donc être appelés "fit"
1 -> 1 -> 1 -> 1 9 -> 1001 -> 101 -> 5 15 -> 1111 -> 1111 -> 15 13 -> 1101 -> 1101 -> 13 16 -> 10000 -> 10 -> 2 17 -> 10001 -> 101 -> 5 65535 -> 1111111111111111 -> 111111111111111111 -> 65535 65000 -> 1111110111101000 -> 11111101111010 -> 16250
Vous pouvez utiliser n'importe quelle langue, mais veuillez noter que Sam déteste les failles standard. C'est le code golf donc le code peut être le plus court possible pour faire de la place aux numéros "compressés".
Remarque: Ce n'est PAS un schéma de compression acceptable. L'utiliser vous fera rapidement virer.
Citation-Needed: Je ne prends pas le crédit de ce concept. Cela vient du blog de @Conor O 'Brien ici voir cet OEIS de numéros d'ajustement. https://oeis.org/A090078
10000
?Réponses:
05AB1E ,
86 octetsExplication
Essayez-le en ligne
Enregistré 2 octets grâce à Adnan
la source
„00'0
par00¬
:).Utilitaires Bash + GNU, 27
Entrée lue depuis STDIN.
la source
dc
:)JavaScript (ES6), 41 octets
la source
Méduse , 20 octets
Essayez-le en ligne!
Explication
i
est entrée.b
le convertit en binaire (liste de chiffres)\d
avec des arguments2
et la liste des chiffres s'appliqued
(chiffres binaires au nombre) à chaque sous-chaîne de longueur 2 de la liste des chiffres.*
prend le signal des résultats: 00 passe à 0, tout le reste à 1.,1
pointe un 1 jusqu'à la fin, de sorte que le dernier chiffre ne soit pas perdu.# S
sélectionne parmibi
les chiffres qui ont un 1 sur la liste calculée ci-dessus: ceux qui ne sont pas les moitiés gauches de 00.d
reconvertit en nombre etp
imprime le résultat.la source
Python 2, 36 octets
Une implémentation récursive directe sans intégration de conversion de base ni opérations de chaîne. Moins golfé:
Quand
n
est un multiple de 4, il se termine par deux 0 en binaire, donc nous avons coupé un par étage de division par 2. Dans le cas contraire, nous nous sommes séparésn
en(n%2) + 2*(n/2)
, laissez le dernier chiffre binairen%2
seul, et récursion sur les autres chiffresn/2
.la source
n%2
redondant?|n
donne de mauvais résultats.(n%4>0)|n%2
par(n%4>0)
.(f(n/2)<<(n%4>0)) | n%2
.Bash (sed + bc),
605543 octetsÉditer:
sed -E 's/0+
ensed 's/00*
et changé echo et pipe utilisé pour passer la valeur à bc avec<<<
.exemple:
la source
echo "obase=2;$1"|bc|sed 's/00*/0/g;s/^/ibase=2;/'|bc
est 2 octets plus courtecho $[2#`bc<<<obase=2\;$1|sed s/00\*/0/g`]
. Maisdc
ettr
raccourcissez-le .bc<<<"obase=2;$1"|sed 's/00*/0/g;s/^/ibase=2;/'|bc
tr -s 0
au lieu de sed, vous pouvez descendre à 36 octetsPerl 6 ,
3127 octetsExplication:
Exemple:
la source
MATL,
1198 octetsCette version ne fonctionne que dans MATLAB car
strrep
dans MATLAB peut gérer les entrées logiques. Voici une version qui fonctionnera en octave (9 octets) (et donc l'interpréteur en ligne) qui convertit explicitement les entrées logiques en typedouble
.Essayez-le en ligne
Explication
la source
Python 3,
55, 50 octets.4 octets enregistrés grâce au Sp3000.
Solution assez simple.
la source
0b
et juste à laeval
place?lambda x:eval(re.sub('0+','0',bin(x))) <insert newline here> import re
Javascript (ES6), 40 octets
la source
console.log(+('0b'+parseInt(process.argv[1]).toString(2).replace(/0+/g,0)))
.N=>
ce qui en ferait une soumission de fonction valide.En fait, 14 octets (non concurrents)
Essayez-le en ligne!
Cette soumission n'est pas en compétition car un correctif de bogue a
Æ
été fait après la publication de ce défi.Explication:
la source
Rubis,
3531 octets-2 octets grâce à @Doorknob
Voir sur repl.it: https://repl.it/CnnQ/2
la source
Gelée ,
137 octets6 octets merci à Zgarb pour son algorithme .
Essayez-le en ligne!
la source
PHP,
5351 octetsPrend un argument de la console.
Grâce à:
@manatwork remplacer "0" par 0
la source
"0"
et0
sont traités de la même manière.Perl, 38 + 1 (
-p
) = 39 octetsNécessite un
-p
indicateur pour fonctionner (j'ai ajouté un-l
indicateur pour le rendre plus lisible, mais ce n'est pas nécessaire autrement):Notez beaucoup de choses à dire sur le code: il convertit le nombre en binaire (
sprintf"%b"
), puis remplace les blocs de zéros par un seul zéro, et convertit le résultat en decimal (oct"0b".
).la source
C #,
11291 octets-8 octets grâce à TuukkaX
la source
int f(int x){var a=Regex.Replace(Convert.ToString(x,2),"0+","0");return Convert.ToInt32(a,2);}
- 94 octets en utilisant l'expression régulière. J'ai vu beaucoup de solutions C # ne pas inclure,System.Text.RegularExpressions
alors c'est peut-être autorisé ici aussi ...?int f(int x){return Convert.ToInt32(Regex.Replace(Convert.ToString(x,2),"0+","0"),2);}
86 octets.Java, 75
Programme de test:
la source
PARI / GP ,
5443 octetsla source
PowerShell v2 +, 69 octets
( fonctionnalité-demande Un moyen plus court de convertir vers / à partir de binaire dans PowerShell )
Prend l'entrée
$args[0]
, utilise le .NET intégré[convert]::ToString(int,base)
pour convertir l'entier d'entrée en une chaîne de base binaire. Cela est filtré à travers-replace
pour éliminer toutes les séries d'un ou plusieurs zéros0
. Cette chaîne résultante est renvoyée dans l'autre sens via[convert]::ToInt32(string,base)
pour transformer le binaire en entier. Cet entier est laissé sur le pipeline et la sortie est implicite.Cas de test
la source
Implémentation de référence dans SILOS "seulement" 417 octets
Golfé
Voici l'implémentation de référence totalement non golfée. En bonus, il affiche les étapes nécessaires pour parvenir à une réponse.
Sur demande, la transpilation a été supprimée. N'hésitez pas à consulter l'historique des modifications pour le récupérer, sinon rendez-vous sur ce dépôt pour un interprète.
Exemple de sortie pour 65000
la source
Pyth, 12
En ligne.
la source
Rétine , 30 octets
Essayez-le en ligne!
Et là, je pensais que Retina serait parmi les premières réponses ...
la source
Java,
152143138 octetsla source
Integer i;
partie est simple et fantastique!Dyalog APL , 19 octets
TryAPL en ligne!
Cette fonction est vraiment un "sommet" de deux fonctions, la première fonction est:
2∘⊥⍣¯1
l' inverse de la conversion binaire en décimal, c'est-à-dire que la conversion binaire de -décimaldeux
2
est lié∘
à -à-décimal⊥
répéter l'opération
⍣
négative une fois¯1
(c'est-à-dire une fois, mais inversée)Dans la deuxième fonction, le résultat binaire ci-dessus est représenté par
⍵
:{2⊥⍵/⍨~0 0⍷⍵}
0 0⍷⍵
Booléen pour où {0, 0} commence dans ⍵ Négation~
booléenne, donc maintenant nous avons ᴛʀᴜᴇ partout, mais aux non-premiers zéros dans les exécutions nulles,⍵/⍨
utilisez-le pour filtrer ⍵, ce qui supprime nos zéros indésirables2⊥
convertissant le binaire en décimalla source
TSQL, 143 octets
Ne pas utiliser de build ins pour convertir depuis et vers binaire.
Golfé:
Non golfé:
Violon
la source
CJam, 16 ans
Essayez-le en ligne
C'est assez long en raison du manque de regex.
Explication:
la source
Java, 64 octets
Programme de test
la source
CJam , 23 octets
Essayez-le en ligne!
Explication
la source
Rubis,
3735 octetsSauvegardé deux octets grâce à la manœuvre.
L'approche naïve. (:
la source
"0"
, voir le 2ème point sepp2k de pointe . Concernant.to_i(2)
, où il n'y a aucune ambiguïté sur la place d'un paramètre, les parenthèses sont facultatives.C, 37 octets
la source