Il s'agit d'un défi de code-golf à source restreinte , à complexité kolmogorov , pour produire une sortie fixe sans entrée.
Le format de sortie, cependant, est flexible - il peut être imprimé en sortie standard, imprimé en erreur standard, renvoyé sous forme de liste de caractères, renvoyé sous forme de liste d'octets ou renvoyé sous forme de liste d'entiers. Si vous pensez que quelque chose d'autre semble raisonnable, demandez-le dans les commentaires!
Voici un CODEGOLF d' art ASCII simple et en grandes lettres :
CCCC OOO DDDD EEEEE GGG OOO L FFFFF
C O O D D E G O O L F
C O O D D EEE G GG O O L FFF
C O O D D E G G O O L F
CCCC OOO DDDD EEEEE GGGG OOO LLLLL F
Sans aucun retour à la ligne (ni espace de fin sur aucune ligne), il contient 256 caractères:
CCCC OOO DDDD EEEEE GGG OOO L FFFFFC O O D D E G O O L FC O O D D EEE G GG O O L FFFC O O D D E G G O O L F CCCC OOO DDDD EEEEE GGGG OOO LLLLL F
Les indices (basés sur 0) des caractères non spatiaux sont:
1, 2, 3, 4, 8, 9, 10, 14, 15, 16, 17, 21, 22, 23, 24, 25, 29, 30, 31, 36, 37, 38, 42, 49, 50, 51, 52, 53, 54, 61, 65, 68, 72, 75, 82, 89, 93, 96, 103, 104, 111, 115, 118, 122, 125, 126, 127, 132, 135, 136, 139, 143, 146, 153, 154, 155, 156, 163, 167, 170, 174, 177, 184, 188, 191, 195, 198, 205, 207, 208, 209, 210, 214, 215, 216, 220, 221, 222, 223, 227, 228, 229, 230, 231, 235, 236, 237, 238, 242, 243, 244, 248, 249, 250, 251, 252, 255
Vous ne pouvez utiliser aucun de ces 97 octets dans votre code, mais vous devez produire une liste (ou une sortie similaire) de ces octets, dans cet ordre, les octets manquants étant remplacés par le 32e octet dans la page de codes que vous utilisez (dans de nombreux, nombreux code-pages un caractère espace).
Vous pouvez inclure les nouvelles lignes jolies à imprimer * (mais pas d'espaces de fin sur les lignes) si cela vous aide.
Par exemple, en utilisant la page de codes Jelly, cette sortie est acceptable:
¢£¤¥ ®µ½ ÇÐÑ× ßæçðı øœþ $%& * 12345
6 = A D H K R Y ] ` g
h o s v z }~¶ ⁴ ⁷⁸ ⁻ Ɓ Ƒ ƲȤɓ
ƈ ɲ ʂ ȥ Ẹ Ḳ Ṭ Ỵ Ḃ Ḟ İ Ṡ
ẆẊẎŻ ẹḥị ṇọṛṣ ẉỵẓȧḃ ḟġḣŀ ṗṙṡ ẏż«»‘ ”
... mais il en est de même:
¢£¤¥ ®µ½ ÇÐÑ× ßæçðı øœþ $%& * 123456 = A D H K R Y ] ` gh o s v z }~¶ ⁴ ⁷⁸ ⁻ Ɓ Ƒ ƲȤɓƈ ɲ ʂ ȥ Ẹ Ḳ Ṭ Ỵ Ḃ Ḟ İ Ṡ ẆẊẎŻ ẹḥị ṇọṛṣ ẉỵẓȧḃ ḟġḣŀ ṗṙṡ ẏż«»‘ ”
...Et il en est de même:
[32, 1, 2, 3, 4, 32, 32, 32, 8, 9, 10, 32, 32, 32, 14, 15, 16, 17, 32, 32, 32, 21, 22, 23, 24, 25, 32, 32, 32, 29, 30, 31, 32, 32, 32, 32, 36, 37, 38, 32, 32, 32, 42, 32, 32, 32, 32, 32, 32, 49, 50, 51, 52, 53, 54, 32, 32, 32, 32, 32, 32, 61, 32, 32, 32, 65, 32, 32, 68, 32, 32, 32, 72, 32, 32, 75, 32, 32, 32, 32, 32, 32, 82, 32, 32, 32, 32, 32, 32, 89, 32, 32, 32, 93, 32, 32, 96, 32, 32, 32, 32, 32, 32, 103, 104, 32, 32, 32, 32, 32, 32, 111, 32, 32, 32, 115, 32, 32, 118, 32, 32, 32, 122, 32, 32, 125, 126, 127, 32, 32, 32, 32, 132, 32, 32, 135, 136, 32, 32, 139, 32, 32, 32, 143, 32, 32, 146, 32, 32, 32, 32, 32, 32, 153, 154, 155, 156, 32, 32, 32, 32, 32, 32, 163, 32, 32, 32, 167, 32, 32, 170, 32, 32, 32, 174, 32, 32, 177, 32, 32, 32, 32, 32, 32, 184, 32, 32, 32, 188, 32, 32, 191, 32, 32, 32, 195, 32, 32, 198, 32, 32, 32, 32, 32, 32, 205, 32, 207, 208, 209, 210, 32, 32, 32, 214, 215, 216, 32, 32, 32, 220, 221, 222, 223, 32, 32, 32, 227, 228, 229, 230, 231, 32, 32, 32, 235, 236, 237, 238, 32, 32, 32, 242, 243, 244, 32, 32, 32, 248, 249, 250, 251, 252, 32, 32, 255]
(Ce dernier est une sortie de liste valide dans n'importe quelle langue avec n'importe quelle page de code, et on peut également utiliser n'importe quel format de liste raisonnable.)
Voici le code Python 3 qui montre les octets ASCII non disponibles.
* Bien que l'impression elle-même ne soit pas si jolie que ça!
la source
$%&*123456=ADHKRY]``ghosvz}~
et pas de nouvelle ligne?array_map(function($n){return sprintf("%6b",$n);},...)
sans$
(je pourrais le faire) ET sans}
(aucune idée). Oui; Je veux emballer les données!Réponses:
Python 2 ,
321203 octetsEssayez-le en ligne!
Explication:
à l'envers:
cfjdbljcibkeajjejiljjlcbjddlafklebajjlceljdeadficijflealkeklkljadfbbckjebclk
est le nombre25731972618407747697792173390589410779249734035626759409848989703511287412985
codé avec des caractères autorisés. (Non123456
autorisé)reduce(lambda x,y:x+repr('abcdefijkl'.find(y)),'cfjdbl..bclkf','')
mappe la chaîne à sa chaîne décimale:reduce(lambda x,y:x+y,'..','')
est le même que''.join('..')
(nono
autorisé)repr('..')
au lieu destr('..')
(nons
autorisé)'abcdefijkl'.find(y)
mappe un caractère à un chiffre.enumerate(bin(int(...)))
convertit la chaîne numérique en une chaîne binaire et énumère. Cela donne aux paires[(0,0), (1,b), (2,1), (3,1), ...]
map(lambda(i,x):(x>'0'and i-8-8-8-8)+8+8+8+8, ... )
convertit la liste énumérée en résultat final.map(lambda(i,x):.. , .. )
au lieu de[... for(i,x)in ...]
(nono]
autorisé)lambda(i,x): ..
convertit chaque paire (index, valeur) en index ou32
.(x>'0'and i-8-8-8-8)+8+8+8+8
est le même que:x>'0'and i or 8+8+8+8
, (Nono
autorisé)[8+8+8+8,i][x>'0']
ou[8<<9-7,i][x>'0']
, (Non]
autorisé)8+8+8+8
=32
(Non23
autorisé)Cela signifie que le programme est essentiellement le même que:
la source
C (gcc) , 318 octets
Essayez-le en ligne!
Celui-ci est un peu un voyage ...
1. Compression de la liste
D'une manière ou d'une autre, nous devrons vérifier si un entier donné est l'un des points de code spéciaux. Toute liste «nue» sera beaucoup trop longue, nous utilisons donc une liste de contrôle. Cette liste a une valeur non nulle aux points de code qui sont «restreints» et une valeur zéro à ceux qui ne le sont pas.
Malheureusement, cela prend encore 512 octets juste pour avoir la liste (ça ressemble
0,0,7,7,0,7,0,...
). Cela peut être raccourci avec un bitmask.Pour utiliser le bitmask, nous diviserons chaque octet en deux. Les 3 premiers bits choisiront un masque dans un tableau tandis que les 5 derniers choisiront un bit dans le tableau. Nous ne pouvons pas réduire davantage le tableau car les entiers 32 bits utilisés par défaut ne prennent pas en charge plus de 2 ^ 5 = 32 bits.
En utilisant une implémentation de référence, j'ai écrit:
J'ai pu générer les valeurs appropriées pour ce nouveau tableau à l'aide de la commande
echo "obase=16;ibase=2;$(./a.out | rev)" | bc
. Cela transmet la sortie du programme ci-dessus (./a.out
) aurev
programme, qui inverse chaque ligne. Il imprime ceci avec un en-tête à bc qui définit la base de sortie à 16 et la base d'entrée à 2. Ainsi bc convertit les chiffres binaires en un masque binaire hexadécimal.Le tableau résultant est visible dans cette solution «bêta»:
2. Faire face aux contraintes
Il y a beaucoup de contraintes qui doivent être placées sur le code ci-dessus. Ici, je passe en revue chacun d'eux 1 par 1.
Cela se ressent également dans d'autres langages, sans affectation en C, il est très difficile d'obtenir des valeurs garanties dans les variables. La façon la plus simple pour nous est d'écrire notre fonction en tant que programme complet. Le premier argument de
main
sera transmis dont la valeurargc
sera 1 s'il est appelé sans argument.Les seules structures de boucles en C sont
for
,while
etgoto
qui tous contiennent des caractères restreints. Cela nous laisse avec l'utilisation de la récursivité. La fonction principale commencera à 1 et répétera jusqu'à ce que l'argument soit> 256, en attendant elle décrémente l'argument en interne pour utiliser une valeur indexée sur 0.Les valeurs dans le tableau ci-dessus sont hexadécimales, même lorsqu'elles sont converties en décimales, elles contiennent certains symboles restreints, notamment 123456 (AD peut être en minuscules). Pour contourner cela, chaque constante est XOR avec une autre de sorte que les caractères restreints sont supprimés. 1 devient 9 ^ B, 2 devient C ^ E, 3 devient B ^ 8, 4 devient 8 ^ C, 5 devient 9 ^ C et 6 devient 9 ^ F (il y a plus de façons de le faire, j'ai choisi cette façon) .
Les restrictions ne nous laissent pas beaucoup de fonctions d'impression.
putchar
etputs
sont tous deux limités, en partantprintf
. Malheureusement, nous devons envoyerprintf
une chaîne de format, idéalement "% c". Toutes ces chaînes ont ce signe de pourcentage embêtant que nous souhaitons supprimer. Heureusement, nous supposons une machine peu endienne (car apparemment c'est ce que TIO utilise, et c'est assez typique). En construisant l'entier dont les octets en mémoire sont 0x25 (%), 0x63 (c), 0x00 (\ 0), n'importe quoi (peu importe, son après le terminateur nul) nous pouvons simplement passer son adresse àprintf
et il l'assumera est une chaîne. Un tel nombre qui fonctionne est -989830363 (0xC5006325). Ceci est facile à créer sous les restrictions comme 77707-989908070.Il y a toujours le problème que nous ne pouvons pas référencer de valeurs (parce que nous ne pouvons pas les affecter et parce que nous ne pouvons pas utiliser &), nous devons donc utiliser un tableau littéral (int []) {...}. Nous l'utilisons également pour le tableau de masques de bits ci-dessus.
Nous ne pouvons pas utiliser ']' ou '}' pour fermer nos tableaux ou fonctions. Heureusement, C a des digraphes et des trigraphes qui fonctionnent.
:>
deviendra]
, tandis que??>
deviendra}
. Cela nécessite que gcc prenne le-trigraphs
commutateur, car il ignore les trigraphes par défaut (en violation de la norme).Nous ne pouvons pas utiliser
&
pour masquer des bits de notre index, ni%
pour y arriver à l'ancienne. Par conséquent, nous comptons sur un comportement spécifique à l'implémentation. En particulier, nous déplaçons nos entiers 32 bits suffisamment loin vers la gauche pour perdre des bits, puis de nouveau vers la droite. Par exemple, pour obtenir les 5 derniers bits de notre nombre, nous le décalons d'abord de 27 bits vers la gauche (en partantabcde00000...
) puis le décalons vers la droite de 27 bits (en partant...00000abcde
).Nous avons besoin de quelques valeurs plus littérales dans tout le code - celles-ci sont tirées de la réponse JS d'Arnauld, plus 27 (pour la raison ci-dessus) est ajouté par moi comme
9+9+9
.3. Assembler
Voici la description de la source avec tous ces changements ensemble.
la source
?:
extension g ++ , abusez du décalage de bits modulo 32, 273 octets-trigraphs
option sur certains compilateurs C, alors que?:
requiert gcc qui nécessite-trigraphs
.brainfuck , 635 octets
Essayez-le en ligne!
En réponse à avoir finalement été battu par Javascript, j'ai joué ce que je pouvais en tirer:
1 octet économisé en ayant 32 dans la cellule 0 et en incrémentant la cellule 1 (la seule raison pour laquelle je l'avais initialement dans l'autre sens était à cause d'une solution rapide quand OrjanJohansen a souligné que je ne pouvais pas l'utiliser
]
)1 octet enregistré en décrémentant une troisième cellule (initialement à 0) pour générer
255
=-1
2 octets économisés en imprimant des espaces entre les caractères 31 et 36 sans utiliser
<>
mais en s'arrêtant simplement à 32 pour imprimer à partir de la cellule 0 lors de l'incrémentation de 31 à 33.brainfuck , 639 octets
Essayez-le en ligne!
D'abord, nous générons le nombre 32. Ensuite, nous allons simplement incrémenter une cellule et basculer l'impression entre cette cellule et celle contenant 32. Les nombres en augmentation constante sont quelque chose que Brainfuck fait bien.
C'est bien de battre Javascript avec Brainfuck, ça n'arrive pas souvent!
la source
]
n'est pas un personnage autorisé. Bien que vous devriez toujours pouvoir résoudre ce problème et battre le Javascript. :)]
n'est pas autorisé, je pense que ma réponse BF est probablement optimale maintenant.JavaScript (SpiderMonkey) ,
1918159814871431 octets56 octets enregistrés grâce à @ user202729
Essayez-le en ligne!
Comment?
Le fait que ce
=
n'est pas autorisé est un tueur de spectacle dans JS. Nous ne pouvons effectuer aucune affectation de variable et nous ne pouvons pas non plus utiliser de fonction de flèche.+
-
/
|
^
<<
>>
8<<98
8<<2
la source
32
as8<<9-7
enregistre un octet pour chacun32
.32 = 8<<98
(car ). Quelques expressions supplémentaires peuvent être raccourcies de cette façon. Travaille toujours dessus.Haskell,
623617614594360342 octetsEdit: -234 octets grâce à @Lynn en trouvant un motif encodé sous forme de chaîne. -18 octets grâce à @ Ørjan Johansen.
Essayez-le en ligne!
Comment ça fonctionne
la source
(id:pure(\_->8+8+8+8))
paruntil((||" XXXX XXX XXXX XXXXX XXX XXX X XXXXXX X X X X X X X X X XX X X X X XXX X XX X X X XXXX X X X X X X X X X X X XXXX XXX XXXX XXXXX XXXX XXX XXXXX X"!!i<'X').(<1))pred 1
et enregistrer un tas d'octets.filter
au lieu deuntil
branche (etcycle
pour éviter un supplément++pure(...)
).Brain-Flak -r,
41904188 octetsEssayez-le en ligne!
Celui-ci est un peu difficile pour Brain-flak car nous ne pouvons pas utiliser
]
ou}
. Ce qui signifie que les seuls caractères utiles sont<>()
.Voici un programme Haskell qui m'a aidé à écrire ceci
Il suffit de sauter là où les espaces doivent être et de les pousser individuellement.
la source
{}
recherche informatique, nous pourrions en fait trouver l'optimal en temps fini.JavaScript (SpiderMonkey) ,
1001919789441 bytesEssayez-le en ligne!
Bat enfin BF !!!
Idée générale
Convertir chaque caractère de la chaîne de chaîne longue en son index ou 32, dépend de la valeur.
Array.prototype.map
? Comment obtenir un tableauForce brute pour voir quels objets sont accessibles en accédant aux propriétés des objets (car ce
]
n'est pas autorisé, donc seules les propriétés dont le nom correspond à un identifiant sont accessibles).RegExp.prototype.exec
renvoie un objet de type tableau lorsqu'il existe une correspondance. Lorsqu'aucun argument n'est fourni, l'argument est défini par défaut surundefined
, donc/u/.exec()
correspond et renvoie un tableau.Obtenez 2 valeurs distinctes arbitraires sur 2 caractères différents
Nous voulons avoir
(x,y)=>x=='0'?32:y
, mais nous ne pouvons pas utiliser=
.Au lieu de cela, nous allons faire
Nous pouvons
map
placer la chaîne sur une fonction, mais ce=>
n'est pas autorisé, donc seules quelques fonctions peuvent être utilisées. Il peut avoirthis
des arguments liés et certains liés (il a donc la forme(x,y,z)=>pre_filled_function.call(pre,filled,args,etc,x,y,z)
)Après avoir considéré une liste de fonctions (
repeat exec bind create map indexOf replace fill find reduce filter findIndex call bind apply
), je décide que les fonctions suivantes seront utilisées (après avoir considéré toutes les autres combinaisons)repeat
: nombre -> différentes chaînes.find
: thisArg -> premier élément dans une correspondance de tableau.L'idée générale serait:
où
somefunction
considère l'this
argument (x
) et le premier argument (elem1
ouelem2
) et retourne s'il correspond.La dernière fonction de flèche est réécrite dans
[].find.bind([elem1,elem2],somefunction)
.Tableau littéral
Nous pouvons utiliser un regex exec pour obtenir un tableau, et
fill
ce avec différentes valeurs. Par exemple,/()/.exec()
retourne un tableau de longueur 2, alors nous pouvons le remplir selon nos besoins.De quoi
somefunction
avons-nous besoin?Nous en avons besoin d'un qui renvoie une valeur de vérité / fausse
this
(qui est 1 des 2 fonctions que nous allons renvoyer) et du premier argument (doit être une chaîne ou un tableau).Pour cela, j'ai utilisé
indexOf
- il renvoie une valeur fausse si le premier argument est un préfixe de l'this
argument.Représenter les littéraux de fonction
la source
TI-Basic (série 83), 578 octets
TI-Basic a sa propre "page de code" très spéciale avec des choix de conception étranges comme déplacer le caractère espace sur 0x29 pour que 0x20 puisse être la
randM(
commande.Il est difficile de comprendre comment obtenir TI-Basic pour sortir le bon type d'objet. Les chaînes ne fonctionneraient pas pour plusieurs raisons: il n'y a aucun moyen de référencer un jeton sans utiliser le jeton, et nous ne sommes pas non plus autorisés à utiliser le
"
caractère. Nous ne pouvons pas simplement écrire une liste, car{
et}
sont interdits. Les matrices[
et sont autorisées]
pour les matrices, mais une matrice de 1 sur 256 ne fonctionne pas, car les matrices sont autorisées au maximum 99 lignes et colonnes. Nous ne pouvons pas utiliser→
pour attribuer à des variables, et nous ne pouvons pas accéder à la liste des variablesʟ
ouL₁
deL₆
toute façon.Donc ici, nous écrivons une formule logique compliquée avec des inégalités qui dit quand un personnage est l'un de ceux que nous voulons sortir. Ensuite, nous utilisons la
seq(
commande pour générer une liste avec1
dans ces positions et0
ailleurs. De là, une autreseq(
commande et un peu d'arithmétique terminent le travail.C'était la partie excitante; le reste joue aux constantes et je n'ai probablement pas fait ça autant que possible. L'une des astuces que j'utilise est que par défaut,
Xmax
10,XFact
4 etΔTbl
1.la source
(
c'est interdit.[A](I,J)
, et d'après ce que je comprends, vous voulez faire quelque chose comme[A](int(I/99),I-99int(I/99))
lire tous les éléments de la matrice[A]
- nous ne pouvons pas non plus le faire. (Soit dit en passant,)
est également interdit. Heureusement, nous n'avons pas à fermer les parenthèses finales, mais cela limite la façon dont nous pouvons utiliser de nombreuses commandes.)Brain-Flak -r, 3894 octets
Essayez-le en ligne!
J'ai écrit un programme pour générer le programme Brain-Flak optimal pour n'importe quelle sortie. Suppose que:
<>
N'est pas utilisé, alors cette solution est optimale.
la source
Python 2 ,
162157 bytesAttention : caractères non imprimables à venir!
Essayez-le en ligne!
Basé sur la réponse existante de TFeld , mais avec quelques modifications:
0xe0/7
au lieu de8+8+8+8
pour représenter 32. ( un programme pour trouver la représentation la plus courte d'un nombre )bytearray
pour représenter l'énorme littéral.A
bytearray
est similaire à astr
qu'il est itérable, cependant, l'itérer donne des entiers, pas des caractères. Nous pouvons l'utiliser pour coder un littéral base-N etreduce(lambda x,y: x*N+y, my_bytearray)
le décoder.Étant donné que les fichiers Python 2 n'ont pas d'encodage par défaut, seuls les caractères en ASCII (0..127) peuvent être utilisés. Les octets nuls, les nouvelles lignes, les barres obliques inverses et les guillemets prennent 1 octet de plus.
De plus, il n'est pas possible d'utiliser toutes les bases.
J'ai écrit un programme pour trouver la représentation la plus courte
n
, compte tenu de ces restrictions.la source