Merci à @KritixiLithos de m'aider à relever ce défi!
V est un langage de programmation que j'ai écrit pour pouvoir utiliser et étendre vim aux défis du code-golf. Le tout premier engagement a eu lieu le 3 mars 2016, ce qui signifie qu'aujourd'hui V a un an! Woo-hoo
Au cours de la première année d'existence de V, 176 commits ont été envoyés par quatre contributeurs différents, 140 réponses de 12 utilisateurs différents et trop d'opérateurs en double dupliqués pour être pris en compte . Il dispose d'un interprète en ligne , hébergé généreusement par @Dennis, qui a été exécuté près de 8 000 fois depuis décembre .
Ayons un défi pour célébrer l'anniversaire de V! Étant donné que la plupart des fonctionnalités de V sont conçues dans l’esprit de la manipulation des cordes et de l’art ascii , il semble naturel que tout défi qui célèbre V soit lié à l’art ascii. Votre défi pour aujourd'hui est donc de prendre un mot en entrée et de le remodeler sous la forme d'un V. Par exemple, l'entrée "Hello" devrait donner le V suivant:
Hello olleH
Hello olleH
Hello olleH
Hello olleH
Hello olleH
HellolleH
HellleH
HeleH
HeH
H
Voici quelques détails sur ce à quoi votre V devrait ressembler. Si la chaîne en entrée est longue de n caractères, le V doit avoir une n*2
hauteur de ligne. La toute première ligne devrait comprendre:
<input string><(n*2) - 1 spaces><input string reversed>
À chaque nouvelle ligne, un espace est ajouté au début et les deux côtés de la chaîne se rapprochent, éliminant ainsi les caractères qui se chevauchent. Jusqu'à la toute dernière ligne, qui n'est que le premier caractère de l'entrée. Les espaces de fin sur chaque ligne sont acceptables, et les sauts de fin sont également autorisés.
Vous pouvez supposer que l'entrée sera toujours un fichier ASCII imprimable sans espace, et vous pouvez utiliser des entrées et des sorties de n'importe quelle méthode raisonnable. Voici d'autres exemples d'entrées:
Happy:
Happy yppaH
Happy yppaH
Happy yppaH
Happy yppaH
Happy yppaH
HappyppaH
HapppaH
HapaH
HaH
H
Birthday:
Birthday yadhtriB
Birthday yadhtriB
Birthday yadhtriB
Birthday yadhtriB
Birthday yadhtriB
Birthday yadhtriB
Birthday yadhtriB
Birthday yadhtriB
BirthdayadhtriB
BirthdadhtriB
BirthdhtriB
BirthtriB
BirtriB
BiriB
BiB
B
V!:
V! !V
V! !V
V!V
V
~:
~ ~
~
Bien entendu, puisqu'il s'agit de code-golf , les échappatoires standard sont interdites et votre objectif est d'écrire le programme le plus court possible pour mener à bien cette tâche. Bon golf!
Pour ce que cela vaut, j’ai un faible pour les réponses vim, donc des points bonus imaginaires pour utiliser vim ou V, bien que toutes les langues soient acceptables. :)
Réponses:
MATL ,
2114 octetsMATL souhaite à V un joyeux anniversaire!
Essayez-le en ligne!
Explication
Considérez l'entrée
de longueur
n=5
. Le code calcule la convolution 2D de cette chaîne avec la matrice d’identité de taille2*n
,Le résultat de la convolution, converti en caractère et avec caractère 0 affiché comme espace, est
Ensuite, les colonnes
[1, 2, ..., 2*n-1, 2*n, 2*n-1, ..., 2, 1]
sont sélectionnées dans cette matrice de caractères, produisant le résultat souhaité:Code commenté
la source
V ,
24, 23, 20 octetsEssayez-le en ligne!
Beaucoup plus court maintenant que V a un opérateur «inversé» .
Pas si impressionnant par rapport aux autres langues de golf qui ont répondu, mais cela devait être fait. Hexdump:
Explication:
À ce stade, le tampon ressemble à ceci:
Non, nous construirons le triangle de manière récursive.
Voici où je peux montrer l'une de mes fonctionnalités préférées de V. De nombreuses commandes nécessitent un argument. Par exemple, la
>
commande indentera un nombre variable de lignes en fonction de l'argument:mais la plupart des commandes seront forcées de se terminer par un argument par défaut (généralement la ligne courante) s'il est à la fin du programme et non spécifié. Par exemple, ce que V exécute réellement pour notre boucle récursive est:
La seconde
ò
est implicitement complétée. La chose intéressante est que les commandes terminées implicitement appliquent plusieurs couches de profondeur. Ainsi, même si nous n’avons écrit qu’auparavant>
, V donnera implicitement_
son argument et indente la ligne courante.la source
Brainfuck , 152 octets
C’est une occasion si mémorable que j’ai décidé de démêler l’ancien interprète de BF et de lui donner un nouveau souffle.
Avec des commentaires
Essayez-le en ligne!
la source
> <> , 221 octets
J'ai passé beaucoup trop de temps là-dessus. Joyeux anniversaire, V!
Vous pouvez l’ essayer en ligne , mais c’est beaucoup plus amusant d’avoir cet interprète et de le lancer avec le
--play
drapeauce qui résulte dans l'animation ci-dessous.
Exemple
(cela prend un peu moins de deux minutes)
Explication
Parce que la partie intéressante de cette réponse l’emballe dans la
V
forme, voici une explication qui s’y conforme. Nous utilisons la version suivante numérotée par ligne pour référence.Parfois, les flèches (→ ←) sont utilisées pour indiquer la direction dans laquelle un extrait de code est atteint.
Initialisation
La première ligne va pousser 2n à [0,1], laisser n sur la pile et ajouter un espace. Ensuite, nous montons et nous retournons à la deuxième ligne à droite, où nous allons commencer à gauche. Il y a une boucle pour ajouter n + 1 espaces. Cela fonctionne comme suit.
Une fois cette opération terminée, elle rebondit sur la ligne 3. Les deux éléments de pile les plus élevés (0 et un espace) sont supprimés (
~~
) et nous passons à laX
position at [10,1] (a1.
), en continuant vers la droite. Nous arrivons à la/
ligne 7 et commençons la boucle du programme principal.Boucle principale ( 2n fois)
C'est la condition de boucle. Au début, la pile est inversée pour l'impression. Ensuite, nous obtenons le compteur de [1,0] (
01g
) et stockons une version décrémentée (:1-01p
). En se retournant et en se soulevant à droite, nous rencontrons la condition pour terminer le programme. Si nous ne terminons pas, nous passons à la première boucle d'impression.Première boucle d'impression (moitié gauche)
Nous commençons avec la longueur en haut de la pile et exécutons le code suivant tant que l'élément top n'est pas 0.
Ceci imprimera la pile sans la jeter. Si la boucle se termine, nous sautons à droite sur la ligne 5 pour nous préparer à la prochaine boucle d'impression.
Préparation de la moitié droite
C'était l'une des parties les plus difficiles à installer. Vous trouverez ci-dessous une version dépourvue de toutes directions pour indiquer ce qui se passe.
Nous repoussons ensuite la longueur de ce qui doit être imprimé et lançons la deuxième boucle d'impression (avec un duplicata initial ne faisant pas partie de la boucle).
Deuxième boucle d'impression (moitié droite)
Le code en cours d’exécution est complètement identique à celui de la première boucle d’impression, mais il
o}
est placé un peu plus loin car il y avait des emplacements disponibles. Une fois l’opération terminée, nous avons quelques tâches à accomplir avant de pouvoir vérifier à nouveau l’invariant de la boucle principale. Une fois que la~
ligne 9 est exécutée, nous nous enroulons verticalement pour aboutir au code suivant.D'abord
ao
imprimera une nouvelle ligne. Ensuite, nous rebondissons et arrivons exactement au même endroit après l’initialisation, à savoir sauter vers leX
.la source
Brain-Flak , 486 + 1 = 489 octets
Joyeux anniversaire V de Brain-Flak!
Merci également à 0 ' qui a fourni une partie du code utilisé dans cette réponse
+1 en raison du
-c
drapeau requis pour les entrées et sorties ASCIIEssayez-le en ligne!
C'est sans aucun doute la chose la plus difficile que j'ai jamais faite dans Brain-Flak.
Brain-Flak est notoirement redoutable en matière de duplication et d'inversion de chaînes, et ce défi consiste uniquement en une duplication et une inversion de chaînes.
J'ai réussi à obtenir cet extrait presque opérationnel en un peu moins d'une heure de travail acharné, mais l'ajout des derniers espaces s'est avéré être l'une des choses les plus difficiles que j'ai jamais réalisées dans Brain-Flak.
Explication
L'idée de base est que nous allons créer le haut du V en premier et chaque itération supprime deux caractères du milieu et ajoute un espace au début.
En pratique, cela devient assez difficile.
Des algorithmes existants existent pour la copie et l’inverse, j’ai donc utilisé l’un de ceux-ci pour créer une copie inversée du code hors pile. Une fois que cela est fait, je mets des
2n-1
espaces au-dessus de la pile d'origine et je replace le désempilé sur l'empilage pour créer un sandwich.Nous avons maintenant notre première ligne. Maintenant, nous voulons supprimer deux caractères du début et ajouter un espace au début. Cela s'avère être la partie la plus difficile. La raison en est que nous devons essentiellement stocker deux valeurs, une pour la profondeur de l’extrait de code actuel et une pour la profondeur au centre du V où la suppression doit avoir lieu.
C'est dur.
En raison de la duplication et du renversement qui se produisent sur les deux piles, elles sont pleinement utilisées tout le temps. Il n'y a vraiment nulle part sur ces piles pour mettre quoi que ce soit. Même avec toute la troisième pile magique du monde, vous ne pouvez pas obtenir le type d'accès dont vous avez besoin pour résoudre ce problème.
Alors, comment pouvons-nous résoudre ce problème? En bref, nous ne faisons pas vraiment; nous ignorons les espaces pour le moment et les corrigeons plus tard, nous ajouterons des zéros au code pour marquer l'endroit où les espaces sont censés aller, mais à part cela, nous ne ferons rien.
Donc, à chaque itération, nous faisons une copie de la dernière itération et la plaçons sur la pile distante. Nous utilisons la profondeur que nous avons stockée pour diviser cela en deux, nous avons donc la moitié gauche du V sur la pile de droite et la moitié droite du V sur la pile de gauche. Nous retirons deux éléments et les corrigeons ensemble. Nous ajoutons une nouvelle ligne pour faire bonne mesure et commençons la prochaine itération. Chaque fois que la profondeur au centre du V diminue de un et quand elle atteint zéro, nous arrêtons la boucle.
Nous avons maintenant construit le gros du V Cependant, nous manquons d’espaces appropriés et notre V est actuellement un peu (lire: complètement) à l’envers.
Alors on le retourne. Pour le retourner sur l'autre pile, nous devons déplacer chaque élément un par un. Comme nous déplaçons des éléments, nous vérifions les zéros. Si nous en rencontrons un, nous devons replacer les espaces là où ils appartiennent. Nous jetons le zéro et ajoutons un tas d'espaces. Comment savons-nous combien? Nous suivons renverser une pile contrairement à la duplication ou l'inversion est une tâche très peu intensive, nous avons donc la mémoire pour stocker et accéder à un compteur supplémentaire pour garder une trace du nombre d'espaces à ajouter. Chaque fois que nous ajoutons des espaces, nous décrémentons le compteur de un. Le compteur devrait atteindre zéro à la dernière nouvelle ligne (le haut du V) et nous sommes donc prêts à imprimer.
Enfin, nous nettoyons quelques éléments et terminons le programme pour obtenir une sortie implicite.
la source
-r
drapeau?-r
drapeau, j’aurais besoin de l’inverser une autre fois. Il commence à être tard où je suis mais je pense que je vais essayer d’essayer de jouer au golf substantiellement demain. Si je peux résoudre le problème des espaces, je vais certainement utiliser le-r
drapeau.Gelée ,
15 à12 octetsEssayez-le en ligne!
Comment ça fonctionne
la source
Python 3 , 65 octets
Essayez-le en ligne!
Python 2 , 65 octets
Essayez-le en ligne!
la source
JavaScript (ES6),
1081069894 octetsla source
n*2
parn*4
(y compris les nouvelles lignes à la fin de chaque ligne). Je calcule ensuite le caractère qui doit apparaître dans chaque cellule.f=
ets=>
.f=
n'est qu'une partie de l'extrait de code, pas la réponse. En tant que tel, il n'est pas inclus dans le nombre d'octets.Retina ,
51 à47 octetsJoyeux anniversaire d'un autre langage de traitement des cordes!
Le nombre d'octets suppose un codage ISO 8859-1.
Essayez-le en ligne!
Explication
Cela ajoute des
n
espaces (oùn
est la longueur de la chaîne), en faisant correspondre la fin de la chaîne, en récupérant la longueur de la chaîne$.`
et en répétant un espace plusieurs fois avec$*
.Nous dupliquons la chaîne entière (séparée par un saut de ligne), en faisant correspondre à nouveau la fin de la chaîne et en insérant la chaîne elle-même avec
$`
.Cela inverse la deuxième ligne en faisant correspondre la droite à la gauche (
r
), puis en faisant correspondre un caractère à la fois (.
), mais en s'assurant qu'ils sont tous adjacents (\G
). De cette façon, les matchs ne peuvent pas dépasser le saut de ligne. Ceci est ensuite utilisé dans une étape de tri. En utilisant le mode de tri ($
) mais en remplaçant chaque correspondance par une chaîne vide, aucun tri n'est effectué. Mais en raison de cette^
option, les matchs sont inversés à la fin, ce qui annule toute la deuxième ligne.Cette étape est pour la sortie et affecte également le reste du programme.
{
encapsule les étapes restantes dans une boucle qui est répétée jusqu'à ce que ces étapes ne puissent pas changer la chaîne (ce qui se produira car la dernière étape ne correspondra plus). Le;
désactive la sortie à la fin du programme. Les*
tours de cette étape dans un fonctionnement à sec ce qui signifie que l'étape est traitée et le résultat est imprimé, mais après la chaîne précédente est rétablie.La scène elle-même supprime simplement un saut de ligne et le caractère précédent. Ce qui nous donne une ligne de la sortie souhaitée (en commençant par la première ligne).
Enfin, cette étape transforme chaque ligne dans la suivante. Cela se fait en insérant un espace devant le premier caractère non espace, en supprimant le dernier caractère de la première ligne, ainsi que le premier caractère de la deuxième ligne. Ce processus s'arrête une fois qu'il ne reste plus qu'un seul caractère non-espace sur la première ligne, ce qui correspond à la dernière ligne de la sortie.
la source
s///
caractères supplémentaires qui s'ajoutent, de l'inversion de chaîne plus longue et d'autres opérations dépourvues des subtilités de Retina. Bonne lecture. +105AB1E , 12 octets
Essayez-le en ligne!
Explication
Ou pour le même nombre d'octets de l'autre sens.
Explication
la source
Japt,
22201614 + 2 octetsJapt souhaite à V encore beaucoup d'années de golf réussies!
Nécessite le
-R
drapeau. Testez-le en ligne!Explication
Cela utilise les fonctions
ç
et queî
j’ai ajoutées il ya quelques jours:La technique de Dennis est un octet plus long:
la source
GNU sed ,
110100 + 1 (drapeau r) = 101 octetsEdit: 9 octets plus court grâce à Riley
Comme autre langage de manipulation de chaîne, sed souhaits V le meilleur!
Essayez-le en ligne!
Explication: en supposant que l'entrée est le dernier cas de test ('V!'). Je vais montrer l'espace du motif à chaque étape pour plus de clarté, en remplaçant les espaces par des 'S'.
la source
Python, 110 octets
Essayez-le en ligne!
Je suis sûr que ce n'est pas optimal, mais au moins c'est joli Pythonic:
la source
Jolf, 31 octets
Jolf souhaite à contrecœur à V un joyeux anniversaire!
Essayez-le ici!
␅
devrait être 0x05.Explication
la source
Charbon de bois , 29 octets
Joyeux anniversaire V, de la part de votre collègue, le langage d'art ASCII, qui est décevant depuis si longtemps pour ce défi!
Essayez-le en ligne!
Explication
Notre stratégie: imprimer la moitié gauche du V, en partant du bas vers le haut à gauche; alors réfléchissez-le.
(Si seulement Charcoal avait découpé les cordes ... hélas, il semblerait que cela n'ait pas encore été mis en œuvre.)
la source
CycleChop
existait un , qui peut être utilisé pour extraire la tête de la chaîne, économisant ainsi 4 octets. Cependant, il existe une meilleure approche qui économise 9 octets. Certaines économies supplémentaires qui, à mon avis, fonctionnaient également à l'époque: la valeur parReflect
défaut, le droit, sont reflétées, un octet supplémentaire est sauvegardé, et l'une des variables est prédéfinie à la première entrée, ce qui permet d'économiser deux octets.Pip ,
3225 octetsPrend la chaîne d'entrée en tant qu'argument de ligne de commande. Essayez-le en ligne!
Explication
la source
R avec package stringi, 225 octets
Si vous exécutez R en code interactif, après avoir collé ma réponse, saisissez n'importe quoi. Vous aurez besoin du paquet stringi R pour être installé (j'espère que ce n'est pas contre les règles).
Explication:
L'idée de base est d'ajouter des espaces sur le côté gauche, puis de le couper à la bonne longueur. Après cela, collez-le avec sa version inversée comme partie droite. Voici une version plus longue, lisible par l'homme, de la fonction:
la source
Ruby,
928985 octetsMon processus consistait à supprimer le premier caractère de la moitié droite de chaque ligne après avoir inversé la première moitié. Comme ça:
Je ne suis pas habitué à essayer de jouer au golf, alors laissez-moi savoir si je peux faire quelque chose pour le raccourcir.
la source
Lot,
186185 octetsLes lignes 1 et 6 ont un espace de fuite. Edit: 1 octet enregistré grâce à @ ConorO'Brien.
la source
@set
et supprimez-le@echo off
, insérez-le@
si nécessaire.set
s m'auraient épargné suffisamment d'octets pour que cela en vaille la peine.Haskell , 76 octets
v
est la fonction principale, prenant unString
argument et donnant unString
résultat.Essayez-le en ligne!
Remarques:
i
est l'argument / entrée initial.s
est initialementi
avec deslength i
espaces ajoutés.v i
appeller s
, puis rejoint les lignes de résultat.r
renvoie une liste deString
lignes.t
ests
avec le dernier caractère coupé.r t
produit les lignes sauf la première, moins l'espace initial sur chaque ligne.la source
v
. : Dunlines.r.((++)<*>(' '<$))
.Gelée , 13 octets
Essayez-le en ligne!
Comment?
la source
Ruby,
8583 octetsedit: suppression des espaces blancs en excès
En fait, j'ai trouvé assez difficile de jouer au golf celui-ci en Ruby. Après avoir ajouté des espaces, il se développe en un extrait de code lisible:
la source
s=ARGV[0];(s+=' '*s.size).size.times{|i|puts s+s[i..-2].reverse;s=' '+s[0..-2]}
MATLAB (R2016b),
223183 octetsPremière fois le golf de code. Les pourboires sont les bienvenus!
Sortie du programme:
Modifier:
Sauvegardé 40 octets grâce à Luis Mendo.
la source
's'
deinput
. De plus, je ne vois pas pourquoi vous utilisezevalc(disp(...))
, mais je pense que vous pouvez simplement utilisercell2mat
cette méthodeflip
est plus court queend:-1:1
, voir iciPHP,
959285807877 octetsRemarque: utilise l'encodage IBM-850
Courez comme ça:
Explication
Tweaks
str_pad
défaut, espace, ce dont nous avons besoin)substr
~"0"
cas (ASCII 207), toutes les entrées pouvant être supposées être imprimables en ascii (Thx @Titus)la source
echo$s,strrev($s=" $s"^$s^$s),~§;
enregistre 5 octets.~$s[$i++]
est suffisant (l'entrée est imprimable en ASCII, et ainsi de suite$s
)JavaScript (ES6),
169157 octets(-10 octets grâce à Conor O'Brien)
Une solution récursive. Je suis nouveau sur JavaScript, alors soyez gentil! Tous les conseils de golf sont grandement appréciés. :)
Et bien sûr, un très bon anniversaire à vous
V
!Test Snippet
Afficher l'extrait de code
la source
s.split("")
peut être changé en[...s]
, eta.join("")
peut devenira.join
suivi d'une paire de backticks. Vous pouvez économiser 3 octets supplémentaires en remplaçant[r='repeat']
et[r]
par plain ol 'repeat, comme avecslice
.CJam , 26 octets
Joyeux anniversaire de ton vieux copain CJam!
Essayez-le en ligne!
Explication
la source
PowerShell,
126 octets124 octetsAppelez-le avec un seul paramètre, tel que
.\V.ps1 Hello
.Edit: 2 octets enregistrés avec astuce de AdmBorkBork
la source
$l=($s="$args")|% Le*;
Pyke , 14 octets
Essayez-le en ligne!
la source
JavaScript (ES6), 94 octets
Cas de test
Afficher l'extrait de code
la source
J, 44 octets
la source
|."0 1
à|."{
(sauvegardé 2 octets)