C'est Calvin . J'essaie juste d'obtenir 20 répétitions pour que cet utilisateur puisse clavarder dans la salle de discussion PPCG Minecraft Server .
Ecrivez un programme ou une fonction qui prend un entier positif.
Si l'entier est pair (2, 4, 6, ...), imprimez ou renvoyez cette chaîne d'art ASCII exacte:
__ __ __ __ ___
/\ /\ | |\ | | / | | /\ | |
/ \/ \ | | \ | |-- | |--\ /__\ |-- |
/ \ | | \| |__ \__ | \ / \ | |
Si l'entier est impair (1, 3, 5, ...), imprimez ou renvoyez cette chaîne d'art ASCII exacte:
__ __
\ / | | /| | / | / \ __ / | |
\ /\ / | | / | |-- | |--/ \ / |-- |
\/ \/ | |/ | |__ \__ |__| \/ |__ _|_
Vous pouvez supposer que l'entrée est toujours un entier positif.
Dans les deux cas de sortie, il peut éventuellement exister un nombre quelconque d'espaces de fin jusqu'au bord droit du "T" de chaque ligne et / ou un seul retour à la ligne de fin. Notez qu'il y a deux colonnes d'espaces entre chaque lettre.
Le code le plus court en octets gagne.
code-golf
ascii-art
kolmogorov-complexity
Ancien relais de chat
la source
la source
Réponses:
JavaScript (ES6),
343336289267265260 octetsJuste pour le plaisir ... :) (Merci à Xufox d'avoir coupé 46 octets et de m'avoir encouragé à en supprimer 37 autres.)
Appelé comme
a(4)
ou similaire. Essayez-le ici:Afficher l'extrait de code
J'ai condensé les espaces blancs en chaînes de chiffres allant de
2
à8
(par exemple887
= 23 espaces). Chaque chiffre est ensuite remplacé par le nombre d'espaces correspondant.0
représente| |
et1
représente__
. En tout, ce programme a 170 octets de moins que les deux chaînes combinées (203 + 227 = 430), alors je suis heureux. :)Edit: En quelque sorte, il a exactement la même longueur que la seule autre entrée à ce stade .... o_o
Edit 2: sauvé un peu d' espace en changeant
n%2<1?
pourn%2?
et échanger les cordes. Nous avons également profité du fait que les débuts des deux chaînes sont les mêmes pour réduire encore 5 octets.Edit 3:
|2|
semblait apparaître énormément, donc simplifié chaque occurrence enx
économisant 7 octets. Les suggestions de Xufox coupent encore 40 octets.Edit 4: La suggestion de Xufox de remplacer
\n
les sauts de ligne réels a été payante, supprimant 6 octets du total. Passerx
à0
et__
à1
(insérer un rire diabolique ici), puis combiner tous les éléments (insérer le pluriel de Regex ici), comme il l’a fait dans son entrée, économise 16 octets supplémentaires.Edit 5: Depuis que j'ai choisi d’utiliser les standards ES6, j’ai utilisé une interpolation de chaîne de modèle personnalisée pour supprimer 2 octets finaux.
la source
.replace(/\d/g,d=>' '.repeat(d))
vous\n
, en enregistrant un octet par saut de ligne?Matlab,
343341Le numéro d'entrée est fourni par stdin.
Échantillon échantillon:
la source
CJam,
158149145138 octetsCe qui précède utilise la notation caret, car le code contient des caractères non imprimables.
Essayez-le en ligne dans l' interprète CJam .
Si le permalien ne fonctionne pas dans votre navigateur, vous pouvez copier le code de cette pâte .
Exemple d'exécution
Idée
Au lieu d’encoder directement la chaîne MINECRAFT (complétée pour obtenir une longueur de ligne constante), nous encoderons une version "zippée" de celle-ci, dans laquelle les lignes et les colonnes ont été transposées.
Après avoir compressé et éliminé les sauts de ligne, cette chaîne (appelons-la R ) doit être codée:
Il y a beaucoup de lignes d'espaces, nous allons donc remplacer chaque occurrence d'un triplet d'espace par un saut de ligne.
Cette feuille nous avec sept personnages différents (
\n -/\_|
), donc nous assignent chacun d'eux un nombre compris entre 0 à 6 et examiner les chiffres du tableau résultant d'un indice de base 7, que nous avons ensuite encoder comme une chaîne d'octets.Le décodage fonctionne en inversant les étapes précédentes.
La chaîne en miroir peut être construite à partir de celle d'origine.
Si nous inversons l'ordre des quatre lignes et échangeons les solidus, nous obtenons ce qui suit:
D'une certaine manière similaire, mais nous devrons clairement faire pivoter les lignes pour amener la ligne du bas vers le haut:
Ce serait le cas s'il n'y avait pas ces soulignements embêtants.
Si nous lisons la chaîne d'origine de haut en bas et ignorons les sauts de ligne (obtenant ainsi R ) et remplaçons chaque trait de soulignement suivi d'un espace par un espace suivi d'un trait de soulignement avant de décaler les lignes, le résultat est le suivant:
Beaucoup mieux! Tout ce qui reste à faire est de supprimer le premier espace de la première rangée (décalage de tous les traits de soulignement dans la première rangée d' un caractère à gauche), le déplacement des traits de soulignement déplacé dans E et C une ligne vers le haut et à rejeter le soulignement sur T .
Code
la source
Pyth - 182 octets
Utilise l'approche de codage de base. Comme l'indexation est modulaire en Pyth, je n'ai même pas à faire quoi que ce soit, il suffit de le mettre dans le bon ordre et de l'utiliser
@Q
. En prime, cela fonctionne également avec des nombres négatifs.Je n'avais essayé que d'encoder le premier, puis de basculer et de changer les barres obliques, mais la première et la dernière ligne étaient trop difficiles.
Je pourrais économiser 6 octets en plaçant de vrais octets nuls dans le code, mais c'est trop compliqué.
Essayez-le en ligne ici .
Cela semble vraiment mauvais en ligne car la boîte de sortie est trop petite et enveloppante. Je recommande de jouer avec la console de développement et de changer le
col-md-5
en acol-md-7
.la source
JavaScript (ES6),
312,285,281,272,270,263,262, 260Pour les éditions précédentes, voir l' historique d'édition .
Edit 5: Lors de la conversion, j'ai changé le numéro associé à
-
(maintenant 0) et à l’espace (maintenant 1). Dans le bloc résultant, les nombres 1, 2 et 3 n'étaient plus autant utilisés. Cela m'a permis d'utiliser un tableau avec les nombres manquants.Edit 6: Amélioré le littéral de tableau. J'avais déjà essayé cela auparavant, mais je l'utilisais comme chaîne
777
et non77
comme un nombre et je ne remarquais que maintenant que j'avais raté ça.Éditer 7: Le «code de golf» est une fonction, telle que spécifiée par la question et il n’est pas nécessaire
f=
de respecter cette spécification. Ainsi, le supprimer, économisant deux octets.Runnable dans Firefox 39:
Il est basé sur le système de numération de base 6 et chaque caractère ASCII représente un nombre:
Ensuite, j'ai combiné la représentation numérique de chaque chaîne ASCII. Par exemple: lorsque la première chaîne ASCII contient un
/
à une position et que l’ autre contient une\
à la même position , cette position devient la32
base 6 (20
en décimal). Si vous convertissez cela en base 36 (pour obtenir un numéro en base 36 pour deux nombres en base 6), vous obtenezk
.Tout cela a été fait à l’avance et la fonction annule fondamentalement ce processus.
Maintenant, les deux réponses JavaScript ont une autre réponse chacune, qui a le même nombre d'octets…PS: Comme note personnelle et comme référence aux autres, voici le code que j'ai utilisé:
la source
~NaN == -1
?![…][x]+77
,77
n'a pas besoin d'être une chaîne plus), mais le recul supplémentaire dans le code golfed n'en valait pas la peine…isNaN
par1+
, et~~(i/6)
aveci/6|0
.f=
au début, mais moi si. J'ai aussi lu qu'il est accepté de l'enlever, donc je vais le faire moi-même, et maintenant j'ai 260 octets. ;)CJam, 136 octets
Ce qui précède utilise la notation caret, car le code contient des caractères non imprimables.
Le saut de ligne est uniquement destiné à la "lisibilité". Essayez-le en ligne dans l' interprète CJam .
Si le permalien ne fonctionne pas dans votre navigateur, vous pouvez copier le code de cette pâte .
Exemple d'exécution
Idée
Cette approche présente certaines similitudes avec celle de mon autre réponse , mais elle est beaucoup plus simple et (plutôt décevante) un peu plus courte.
Nous cherchons un moyen d'encoder la chaîne suivante:
Après avoir rempli chaque ligne (pour obtenir une longueur de ligne constante), zippé (transposition de lignes et de colonnes) et supprimé les sauts de ligne, cette chaîne doit être codée:
Nous allons remplacer chaque sous - chaîne
" |||"
avec un 0 , chaque sous - chaîne" "
avec un 1 et les caractères de"/-_\| "
avec deux à sept , en formant une matrice de base de 8 chiffres, qui peuvent être codés comme une chaîne d'octets.Le décodage fonctionne en inversant les étapes précédentes.
Code
la source
Raquette,
443434386 octetsJuste pour le plaisir.
NB: il se peut que vous ayez besoin de la
#lang racket
ligne DrRacket.la source
05AB1E ,
179177176 octetsEssayez-le en ligne.
Explication:
est le nombre compressé :
Essayez-le en ligne.
7в
la convertit en Base-7 sous forme de liste, nous obtenons donc la liste des chiffres:Essayez-le en ligne.
è
indexe chaque chiffre de la chaîne"\n-/\_|"
,J
puis joint la liste complète, ce qui nous donne ce qui suit:Essayez-le en ligne.
2ä
divise la chaîne en deux parties.Iè
prend l’entrée et l’indexe (avec bouclage automatique) pour obtenir l’une des deux parties, qui est alors sortie de manière implicite.Un gros merci au compresseur ASCII de @MagicOctopusUrn qui a été utilisé pour générer le nombre compressé et la translittération en Base-7. Essayez-le en ligne. (Après quoi la translittération a été jouée en inversant la chaîne et le numéro sur la pile, en utilisant
в
au lieu deB
pour en faire une liste de chiffres et en indexant la chaîne avecè
.la source
C, 251 octets
C'est une fonction
k
qui reçoit un paramètre et imprime le messagestdout
.Une version plus lisible:
Tout d'abord, il prépare un message vide (rempli d'espaces). Pour chaque personnage (par exemple
|
ou-
), il a une liste de positions dans lesquelles placer ce caractère.Pour chaque position, si la version à l'envers doit être imprimée, la position est inversée. C'est-à-dire que sa coordonnée verticale
y
est remplacée par4-y
ou3-y
(selon que le caractère est un trait de soulignement). En outre, les directions des barres obliques sont inversées - ceci est effectué par unXOR
avec115
.Cette structure de contrôle est également utilisée pour placer les caractères de nouvelle ligne - il semble plus efficace d'ajouter 4 coordonnées de plus à la liste que d'écrire une boucle explicite.
Il y a quelques problèmes mineurs avec ce système. Tout d’abord, la dernière lettre T est un peu différente dans la version retournée:
Pour le sortir correctement, le code doit placer les
|
caractères après les_
caractères.De plus, afin de m'assurer que la chaîne de contrôle ne contient que des caractères ASCII, je l'ai codée:
37
ajoutés pour les déplacer dans la plage ASCII 32 ... 127. Je pourrais ajouter un nombre plus petit, mais37
évite les caractères comme"
et\
, qui doivent être échappés dans les littéraux de chaîne.-
caractère apparaît à la position 137. Pour expliquer cela, j'ai ajouté un-
caractère artificiel à une autre position (79), qui est ensuite écrasée - le caractère|
apparaît également à la position 79.Une autre chose amusante était que je ne pouvais pas utiliser la
puts
sortie de la chaîne - cela produirait un retour à la ligne supplémentaire. Alors j'ai utiliséprintf
place.De plus, le nombre
57
apparaît 4 fois dans le code golfé - l'expression apparemment longue(w%2?4-i/6-p/57:p/57)*57+p%57
permet d'éliminer la variabley
, ce qui raccourcit le code.la source
Perl,
292259246 octetsIl tire parti du fait que les deux chaînes sont généralement similaires (par exemple, l'intégralité d'IE et de C) et fait en sorte que la chaîne ne comporte pas de caractères affichés différemment selon la version affichée. Par exemple, m signifie "une barre oblique pour la chaîne de droite, une barre oblique dans la chaîne à l'envers". Il effectue une substitution de translittération pour afficher le caractère correct. Les espaces sont également codés en longueur d'exécution en utilisant des substitutions de chaînes.
multiligne:
Idée:
Étant donné que la sortie ne contient que 22 colonnes uniques, il devrait être possible de la stocker sous la forme 22 * 4 = 88 caractères avec une plage de 0 à 17 (tous les caractères "à double sens" possibles), ainsi qu'une recherche de 56 caractères. table avec une entrée dans la plage 0-21 par colonne. En théorie, cela pourrait être codé avec moins de 100 octets, mais il est difficile d'en faire un gain net à cause du code plus compliqué pour le décoder.
la source
CJAM, 206
Les deux images ASCII sont codées en base 216, un octet = 3 caractères.
Testez le ici
la source
Powershell,
275253248 octetsScript de test:
Sortie:
Les idées principales
La méthode de compression est la méthode étendue de CJam par Dennis ♦:
Le script de compression:
La chaîne de compression avant est:
la source
SAS, 442 octets
Non-golfé:
Tests:
Pourrait peut-être économiser un peu de code en les plaçant dans des blocs d'entrée, mais cela ajoute la restriction que la macro ne peut être qu'une fois par date, ce qui, à mon avis, enfreint l'esprit de l'écrire en tant que macro. (Et je soupçonne que l'ajout d'une invite pour obtenir une entrée dans le datastep ajoute plus de caractères).
la source
bash, 247 octets
Les chaînes sont concaténées et gzipées.
la source
PHP, 225 octets
Laide, solution de force brute.
J'ai compressé puis base64 encodé les chaînes concaténées à afficher. Le code décode, décompresse et scinde en 224 caractères. La première chaîne contient 224 caractères sans nouvelle ligne, la seconde 201 (pas de nouvelle ligne après celle-ci). La parité de l'argument de ligne de commande (
$argv[1]%2
) est utilisée comme index dans le tableau généré parstr_split()
.la source
Haskell, 138 octets
C'est un peu un bidouillage. J'applique bruyamment le hash SHA256 de la concatination des deux textes minecraft, puis je les sépare et je choisis le texte approprié en fonction du paramètre x. Ceci est bien sûr très peu pratique et ne peut pas être calculé en temps réel, et il peut même y avoir des collisions en cours de route pour tout ce que je sais.
Étant donné que Haskell ne peut pas avoir la représentation ASCII de ce hachage dans une chaîne, je la lis à partir d'un fichier appelé "a", et a donc ajouté 32 octets à ma partition.
Explication:
Crée une liste de chaque combinaison des lettres "/ \ | _-" sur 425 lettres (la longueur des deux textes minecraft combinés)
Choisissez le premier qui correspond au hachage
Le premier texte compte 225 lettres, l’autre 200.
la source
Javascript (ES6),
403296 octets(Déplacé de ma réponse précédente ) Essayer une nouvelle méthode:
Notez qu'il y a quelques caractères non imprimables; ceux-ci ont été remplacés par par exemple
\x83
.Le codage lui-même est environ 40 octets plus court que l’autre, mais le processus de décodage est plus élaboré. J'ai utilisé le système base 216 que d'autres ont utilisé pour coder le texte. Pour référence, voici le code que j'ai utilisé:
Cela prend essentiellement le texte ASCII (pré-converti en base 6) et le triple sur lui-même, en le changeant en base 216. 53 est ensuite ajouté pour supprimer la plupart des caractères non imprimables.
Suggestions bienvenues!
Voici le code original de 403 octets:
En utilisant une
for
boucle, unwhile
boucle, quatre variables qui ont été utilisées une seule fois et une tonne d'algorithmes longs pour des choses simples. Boy, ai-je amélioré ...la source
y=[' ','/','|','\\','_','-'],
et au lieu d'y[x]
écrire' /|\\_-'[x]
. =)Python, 312 octets
La fonction imprime la sortie avec un int
la source
C, 321 octets
Encodé la répétition et l'index de caractères dans une chaîne.
la source
Python 3, 486
533612la source
PHP , 263 octets
Essayez-le en ligne!
la source
Ruby, 290 octets
Probablement une entrée faible et améliorable. Fondamentalement, une compression très simple (faite à la main) dans laquelle les lettres minuscules signifient que de nombreux espaces (en fait, ord (ch) - espaces «A») et des lettres majuscules ne sont que quelques termes courants permettant d’économiser quelques octets.
la source
SOGL V0.12 ,
7271 octetsEssayez-le ici!
La mise en miroir verticale des LFOS fonctionnait parfaitement pour cela.
la source
Toile , 70 octets
Essayez-le ici!
la source