Ceci est tangentiellement lié à ma quête pour inventer un langage de programmation ésotérique .
Un tableau des nombres binaires 0 à 15 peut être utilisé pour implémenter une fonction binaire universelle à l'aide d'opérations d'indexation. Étant donné deux entrées X et Y 1 bit, les 16 fonctions possibles peuvent être encodées dans un opcode 4 bits.
X Y F|0 1 2 3 4 5 6 7 8 9 A B C D E F
- - - - - - - - - - - - - - - - - -
0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
0 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1
1 0 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
- - - - - - - - -
0 ~X ~Y ^ & Y X | 1
ZERO NOT-Y AND OR
NOT-X XOR ONE
Donc, cet ensemble de 16 fonctions peut être appliqué aux entrées binaires comme fonction
U (f, x, y): (f >> ((x << 1) | y)) & 1 ,
ou
U (f, x, y): (f / 2 ^ (x × 2 + y))% 2 ,
ou avec indexation ou partitionnement matriciel.
Il sera utile de connaître la manière la plus compacte de représenter ou de générer une telle table de valeurs pour tout langage possible à construire sur ce type d'opération binaire.
Le but:
Générez cette sortie de texte exacte:
0101010101010101
0011001100110011
0000111100001111
0000000011111111
C'est ça! Le code le plus court gagne.
la source
Réponses:
J, 10 (13?) Caractères
Liste des numéros:
en binaire:
Transposer:
Sens inverse:
Faut-il supprimer les espaces? En regardant l'autre réponse J il semble que nous le faisons , nous aurons besoin d'ajouter 3 caractères et emprunter la
1":
de la réponse de Jan .la source
Python 2, 40
la source
APL (14)
En supposant
⎕IO=0
(c'est un paramètre):Explication:
⍳16
: nombres [0,16)(4⍴2)⊤
: encoder chaque numéro de la base 2 en utilisant 4 chiffres⊖
: marche arrière horizontale (donc le MSB se retrouve en haut)⎕D[
...]
: sélectionnez ces valeurs à partir⎕D
desquelles se trouve la chaîne0123456789
. (Une matrice numérique est affichée avec des espaces entre les valeurs, une matrice de caractères ne l'est pas. Donc, cela convertit chaque bit numérique en l'un des caractères'0' '1'
).la source
(4⍴2)⊤
→2⊥⍣¯1
Gelée ,
427 octets (non concurrent)Essayez-le en ligne!
Merci à Dennis pour son aide. Voici le premier message, voici le dernier (d'autres discussions ont également eu lieu). Avec son aide, j'ai apparemment (presque) enraciné la partition.
la source
/// , 51 octets
Essayez-le en ligne
la source
GolfScript (
18 1715 caractères)(Avec merci à Howard)
Je ne comprends pas pourquoi le 10 caractères
ne fonctionne pas; Je soupçonne qu'un bogue dans l'interpréteur standard entraîne des types non pris en charge sur la pile.
Une alternative à 18 caractères que je comprends bien est:
Une approche plus mathématique est un peu plus longue, à 28 caractères:
Une grande partie de cela concerne la conversion de base et le remplissage nul. Sans ceux-ci, il tombe à 19 caractères,
avec sortie
la source
16,zip{n}/
fonctionner alors?16,zip{','-~n}%
zip
devrait renvoyer un tableau de tableaux, mais il semble en fait renvoyer un tableau de tableaux Ruby (c'est ma meilleure estimation). Quels que soient les éléments, leur appliquer `` `` n'affecte pas la façon dont ils impriment, ce qui ne ressemble à aucun des 4 types de données GolfScript. Vous avez raison qui','-
semble les transformer en tableaux normaux: belle astuce.CJam - 16
Code java équivalent (comme explication):
la source
Javascript (ECMA6), 67
Pour l'utiliser, appelez
Bitshift!
Et aussi XOR et un peu de récursivité.
La première chose à noter est que si nous prenons une ligne et que vous la décalez (# de 0 continus) / 2 à gauche, nous obtenons un joli XOR pour obtenir la ligne suivante.
Par exemple,
XOR ces bits nous donnent
qui est la ligne suivante (ligne 3).
En appliquant le même processus pour la ligne 3, décalez 2 à gauche et nous obtenons ...
XOR'ed donne
qui est la ligne 2.
Notez que le montant que nous décalons diminue de moitié à chaque fois.
Maintenant, nous appelons simplement cette fonction récursivement, avec 2 arguments. La valeur entière de cette ligne, et N, qui est la quantité que nous devons déplacer. Quand nous faisons récursif juste passer la valeur XOR décalée et n / 2.
consiste à ajouter des 0 au début de chaque ligne, car toString supprime les 0 au début.
la source
s=(k,n)=>n?s((k<<n/2)^k,n>>1)+"0".repeat(n)+k.toString(2)+` `:""
J, 21 caractères
i.16
est une liste de 0..152^i.4
est une liste (1,2,4,8)%~/
produit le tableau des divisions où l'argument de gauche forme des lignes mais est l'argument de droite pour la division2|
calcule le reste après avoir divisé [chaque cellule] par deux<.
étages dont la valeur est 0 ou 11":
formate le tableau avec un caractère par cellulela source
floor
ne devrait pas être nécessaire. Le domaine de2|
est déjà 0 ou 1, non?|
fonctionne sur des flottants .2|3.25
est1.25
. Nous n'en voulons pas.GolfScript, 19 caractères
Une autre approche GolfScript
la source
Rubis (44)
Ennuyeux et long: Il suffit d'imprimer les représentations binaires 0-rembourrées des nombres.
la source
Postscript
108177126777470Inversée les valeurs d'une simple mo- de méthode.
151131119Appliquer une approche plus APL -ish. edit: remplacement du hachage de chaîne et du zippage du tableau par l'indexation et les boucles for.
Dentelé:
Réimplémenter les fonctions utilisées dans la réponse J gagnante conduit à cela (avec beaucoup de code de support ).
i
voici un vecteur basé sur 1 décrit dans les fonctions élémentaires d'Iverson , d'où le-1 ... +
produire0 .. 15
.la source
Perl (36 + 1)
+1 pour
say
, comme d'habitude. le double0
n'est pas une faute de frappe :)la source
say
.perl -e'...'
est standard et cela nécessiteperl -E'...'
, aucune augmentation du nombre d'octets. Quoi qu'il en soit, je pense qu'il a été décidé , le code de golf Meta qui-M5.01
est libre.JavaScript (ECMA6), 108
Essayer une approche différente ici. Même s'il a été encouragé à utiliser des opérateurs binaires, je me suis permis de soumettre cette solution car le défi est également kolmogorov-complexité et je me demandais - comment puis-je réduire la quantité de code représentant ces valeurs ...? Bases .
(Saut de ligne pour plus de commodité).
C'est dommage que j'ai dû jouer avec le remplissage avec des zéros en tête, mais le point de ce code représente simplement le résultat binaire cible en Base 36, qui sont exactement ces
gut, a43, 2z3, 73
valeurs.Remarque: Je me rends compte que ce ne sera pas loin de la réponse gagnante, mais juste pour le plaisir de l'idée ...
la source
alert(['gut','a43','2z3',73].map(n=>(1e8+parseInt(n,36).toString(2)).slice(-16)).join('\n'))
. Cette approche utilise des sauts de ligne au lieu de quatrealert()
s.Sprects , 44 octets
La réponse de Cédric portée à Sprects.
la source
MATL ( non concurrent ), 8 octets
Essayez-le en ligne!
Explication
la source
CJam ( non concurrent ),
109 octetsMerci à @Dennis pour 1 octet de moins!
Essayez-le en ligne!
Explication
la source
JavaScript (ES6),
5852 octetsConstruit la chaîne récursivement.
Comment ça fonctionne
Cette récursivité est basée sur le fait que le motif est fait de la représentation binaire verticale des quartets 0x0 à 0xF:
Par conséquent, chaque position (X, Y) dans ce modèle peut être exprimé comme le Y-ième bit de X:
X & (1 << Y)
. Nous pouvons également isoler ce bit avec:(X >> Y) & 1
. Plutôt que de garder une trace de X et Y, nous itérer sur une seule variablen
allant de 0 à 63. Ainsi, la formule devient:(n >> (n >> 4)) & 1
. Il est en fait plus facile d'itérer de 63 à 0, donc la chaîne est construite dans l'ordre inverse. En d'autres termes, le caractère n-1 est ajouté à gauche du caractère n .En remarque, la récursivité n'apporte rien ici sauf du code plus court.
Sans les sauts de ligne, le code fait 35 octets:
Nous avons besoin de 17 octets supplémentaires pour insérer les sauts de ligne. Cela pourrait être raccourci à 14 octets si un saut de ligne de tête est acceptable.
Démo
la source
(f=(n=64)=>n--?f(n)+(n>>(n>>4)&1):'')().match(/.{16}/g).join`\n`
(63 octets).replace(/.{16}/g,"$0\n")
a la même longueur. Dommage.Bash + coreutils, 65 octets
Pas le plus court, mais pas le plus long non plus:
(Le dernier caractère est un espace)
Essayez-le en ligne .
la source
NARS2000 APL, 22
Dérivé de la réponse APL de marinus, qui ne semble pas fonctionner sur NARS2000.
Générer un vecteur
Passer à la base zéro
Générer une forme pour encoder
Encoder
Ajuster pour une indexation basée sur 1
Inverser l'axe primaire
Indice
la source
C, 73 caractères
Il s'agit simplement d'une solution générale pour la sortie de 64 bits dans quatre blocs de 16 bits; il vous suffit de changer le nombre
0xFF0F0F33335555
pour sortir une autre séquence de bits.simplifié & non golfé:
la source
Haskell, 73
Oui, 73 caractères! Je ne peux pas, pour l'amour de Dieu, réduire cela.
Le plus triste à ce sujet est que si vous deviez faire écho à la sortie en utilisant bash, vous n'auriez besoin que de 74 caractères.
la source
JavaScript (ES5) 69
for(x="";4>x;x++){z="";for(n=0;16>n;)z+=1-!(n++&1<<x);console.log(z)}
la source
inca2 ,
332724Ceci est basé sur la réponse de Jan Dvorak . inca2 est capable d'exécuter cela à partir des corrections de bugs d'hier. Techniquement invalide puisque la langue a été inventée après la question, mais l' invention d'une langue faisait partie de mon objectif en posant la question. Voici donc un retour sur investissement en remerciement pour les autres réponses. :)
Explication:
Certaines des parenthèses ne devraient pas être nécessaires, mais apparemment, il reste quelques problèmes avec mon interprétation de la grammaire. Et "ravel => map => remodeler" est vraiment maladroit: la carte doit être plus intelligente. Edit: les corrections de bugs permettent l'élimination des parens.
La factorisation de la conversion de base dans une fonction distincte
N:x|y%.x^~1+[]/x.y
donne ceci19Version 16 caractères .Et bien que je triche de toute façon ici, j'ai continué et en ai fait une fonction intégrée. Mais, même s'il s'agit d'une fonction niladique (ne nécessitant pas d'argument), les fonctions niladiques ne sont pas prises en charge et doivent être fournies avec un argument factice.
inca2, 2
la source
Pyth 24/26
La méthode la plus courte était la réponse de grc traduite en Pyth que je trouvais bon marché alors j'ai fait ma propre méthode:
Mine: 26 caractères
grc's: 24 caractères
la source
C ++ 130
Convertit hex en binaire
la source
Haskell (Lambdabot), 47 octets
Un peu cheaty car il utilise la transposition de Data.List et replicateM de Control.Monad, cependant les deux sont chargés par défaut depuis Lambdabot.
De plus, je suis sûr qu'il y a place à amélioration, je voulais juste partager l'idée
la source
Julia (39 octets)
Deuxième script que j'ai jamais écrit en Julia, je dois admettre que j'aime Julia, c'est une jolie bête.
Retour
Explication:
bin(x,4)
- Convertissez int en entier binaire avec un remplissage à 4 caractères.collect(_)
- Fractionner la chaîne en tableau de caractères.map(x->_,0:15)
- Procédez ainsi pour les 16 premiers chiffres de la plage.hcat(_...)
- Splat et concaténation horizontale dans une matrice.la source
C
8377767471Assez simple.
la source
?:
, et une autre économie de 1 en déplaçant a++
.main
enf
. lolR,
5341 octetsUne traduction de la réponse python de @ grc. Réduit 12 octets de la traduction originale en utilisant des
rep()
seach
et deslength
arguments (et une correspondance partielle des arguments), et en se souvenant que0:1
c'est équivalent àc(0,1)
.Vous pouvez également essayer une traduction de la réponse J de @ Gareth, quelque chose comme ceci (34 octets):
Cependant, il utilise une fonction qui ne fait pas partie de la base R et génère une matrice qui est difficile à formater en texte imprimé exact comme dans la spécification.
la source