Contexte
L’été est bien terminé dans l’hémisphère Nord et le soleil, les plages, les vagues de l’océan nous manquent à beaucoup… Ce défi consiste à leur remonter le moral en leur rappelant la mer.
Le défi
Voici la mer:
** ** ** ** **
**** **** **** **** ****
***** ***** ***** ***** *****
** ** ** ** ** ** ** ** ** **
** ** ** ** ** ** ** ** ** **
** ****** ****** ****** ****** ****
La mer est composée de 5 fois ce type de vagues:
**
****
*****
** **
** **
* *****
Notez que le modèle comporte 16 caractères et la mer 5 fois plus que celui-ci = 80 caractères.
Que vous pouvez imprimer dans un terminal en utilisant cette ligne de commande:
perl -e 'print " ** \n **** \n ***** \n ** ** \n ** ** \n* *****\n"'
Ou celui-ci:
perl -e 'print " "x12, "*"x2, " "x2, "\n", " "x8, "*"x4, " "x4, "\n", " "x5, "*"x5, " "x6, "\n", " "x3, "*"x2, " "x3, "*"x2, " "x6, "\n", " "x1, "*"x2, " "x6, "*"x2, " "x5, "\n", "*"x1, " "x10, "*"x5, "\n"'
(Le second devrait vous aider à obtenir le motif exact)
Votre tâche consiste à afficher la mer dans un terminal et à donner l’impression que les vagues se déplacent vers la droite: elle doit se déplacer vers la droite à une vitesse de 1 caractère toutes les 100 ms (= 10 fois par seconde). Aucun caractère ne doit être imprimé après la 80e colonne, mais comme la vague la plus à droite disparaît, une nouvelle apparaît à gauche.
Voici un exemple de sortie:
temps = 0.0s
** ** ** ** **
**** **** **** **** ****
***** ***** ***** ***** *****
** ** ** ** ** ** ** ** ** **
** ** ** ** ** ** ** ** ** **
** ****** ****** ****** ****** ****
temps = 0.1s
** ** ** ** **
**** **** **** **** ****
***** ***** ***** ***** *****
** ** ** ** ** ** ** ** ** **
** ** ** ** ** ** ** ** ** **
*** ****** ****** ****** ****** ***
temps = 0.2s
* ** ** ** ** *
**** **** **** **** ****
***** ***** ***** ***** *****
** ** ** ** ** ** ** ** ** **
** ** ** ** ** ** ** ** ** **
**** ****** ****** ****** ****** **
temps = 0.3s
** ** ** ** **
**** **** **** **** ****
***** ***** ***** ***** *****
** ** ** ** ** ** ** ** ** **
** ** ** ** ** ** ** ** ** **
***** ****** ****** ****** ****** *
temps = 0.4s
** ** ** ** **
* **** **** **** **** ***
***** ***** ***** ***** *****
** ** ** ** ** ** ** ** ** **
** ** ** ** ** ** ** ** ** **
****** ****** ****** ****** ******
Bien entendu, chaque sortie devrait remplacer la précédente.
Vous pouvez exécuter ce code dans un terminal Unix pour voir comment il devrait ressembler à l'animation:
perl -M5.010 -MTime::HiRes=sleep -E '@arr=([($")x12,($n="*")x2,($")x3],[($")x8,($n)x4,($")x4],[($")x5,($n)x5,($")x6],[($")x3,($n)x2,($")x3,($n)x2,($")x6],[($")x1,($n)x2,($")x6,($n)x2,($")x5],[($n)x1,($")x10,($n)x5]);while(++$j){for$i(0..5){for$k(0..15) {$out[$i][16*$_+$k]=$arr[$i][($k-$j)%16]for 0..4}}say"\e[H",$/,join$/,map{join"",@$_}@out;sleep 0.1}'
(Notez que ce code n'est pas très bien joué au golf: je l'ai juste rendu assez compact pour qu'il soit pratique de fonctionner dans un terminal.)
Critère gagnant
C'est codegolf, donc le code le plus court en octets gagne.
Réponses:
MATL ,
41 à40 octetsExemple d'exécution:
Ou essayez-le sur MATL Online! (la vitesse réelle peut dépendre de la charge du serveur).
Comment ça fonctionne
la source
JavaScript (ES6) + HTML,
151143 + 10 =161153 octetsla source
a
?a
contient le motif d'onde codé en binaire et est pivoté sur chaque image. Donc, il ne peut pas être codé en dur: il doit être stocké dans une variable.HTML + CSS, 70 +
181175 = 245 octetsIl emploie
text-shadow
,rtl
textes et animations CSS keyframe.la source
C #
450444425417 octets399 sans
using System.Linq;
mais je suis sûr que ce serait tricher ...Edit: 25 octets sauvés grâce à @Cyoce
Golfé:
Ungolfed:
la source
(a)=>
. Etwhile(true)
peut êtrefor(;;)
s
lambda, je pense que vous pouvez enlever le{}
etreturn
\r
dustring.Join
(du moins sous Windows, cela ne fonctionne pas, mais ne l'avez pas testé avec Mono). Vous pouvez également enregistrer 1 octet en le mettantp++
dans lafor
boucle comme cecifor(;;p++)
if (p==16)...
), vous pouvez également la mettre dans l'en-tête de la boucle for, comme cecifor(;;p=++p%16)
. Économisez 1 octet de plus en déclarantp
dans la boucle (for(int p=0;;p=++p%16)
)V,
989773 octetsMerci à @ nmjcman101 pour avoir économisé 24 octets!
Cela contient beaucoup de choses non imprimables, alors voici un xxd hexdump:
Modifier
Utilisé
y$
au lieu de<C-v>$y
Beaucoup de changements
{
et}
économiser quelques octetsò
place de registres pour créer la boucle infinie (pour une raison quelconque, je dois en inclure unò
à la fin pour que cela fonctionne)*
en basMini-explication
J'utilise
<alt-n>
pour créer des copies de chaînes. Par exemple,<alt-5>*
(cela ressemble àµ5
) fait des5
copies de*
en mode insertion. J'ai trouvé que cela était plus court que de copier la chaîne et d'utiliser un regex pour faire les remplacements nécessaires. Après avoir créé une vague, je la colle pour créer les autres vagues. Enfin, je boucle récursivement en utilisantò
pour créer la boucle infinie (avec un délai de100ms
).Gif
La plupart du code est dédié à la création de la vague, donc j'essaie toujours de jouer au golf. Notez que ce code ne fonctionnera pas sur TIO car ce dernier ne sort la sortie que lorsque le code est terminé. Alors , voici un gif (désolé pour la mauvaise qualité, je devais utiliser un site Web pour convertir un
.mov
à un.gif
, aussi>_
qui ne cesse d' apparaître dans le droit est l'icône du terminal sur le quai de mon mac):la source
5j
(dans le contexte de$<C-V>5j
) pourrait bien être}
, et que l’p
après|
devrait être unP
qui corrigera la statique*
en bas à gauche.qm[CODE]@mq@m
à la fin par justeò[CODE]
. Le code entreò
va boucler jusqu'à la rupture (de la même manière que votre macro) et à la fin d'un programme, ilò
est implicitement fermé.Lot, 424 octets
Certaines lignes ont des espaces de fin. Nécessite un terminal standard à 80 colonnes. Le timing n'est pas très précis, mais c'est le mieux que vous puissiez faire dans Batch.
la source
Raquette
395374373367364351 octetsUtilise une bibliothèque externe pour effacer l'écran
Edit: 21 octets enregistrés en ne définissant pas
w
et en alignant la fonction.Edit2: 1 octet enregistré en supprimant un espace.
Edit3: Saved 6 octets en renommant
loop
àp
, merci @rnso!Edit4: Mettre la sous-chaîne dans le let en sauvegardant 3 octets.
Edit5: Remove
#lang racket
, ce qui n’est pas nécessaire dans l’interprète.Golfé: 351 octets
Défilement (non effacé): 272 octets
Ungolfed:
la source
simplescreenrecorder
avecavconv
pour convertir MP4 en GIF.rotmul
effectivement pris enw
paramètre.PowerShell 3.0,
183182173 octetsRequiert PS 3.0 pour les opérateurs de décalage binaire. Réduit à 173 octets avec l' aide d' AdmBorkBork !
la source
.PadLeft
, déplacez la$o
déclaration dans l'[convert]
appel et éliminez les guillemets autour des nombres dans les-replace
op. Vous fait descendre à 175 -for(){0..5|%{("{0:D16}"-f+[Convert]::ToString(([uint16]$o=$w[$_]),2))*5-replace0,' '-replace1,'*'
+
dans le"{0:D16}"-f+[Convert]
? Ça ne marche pas sans ça, mais je ne peux pas dire ce que ça fait.[convert]::ToString()
retourne une chaîne. Le+
force un transtypage sur une[int]
sorte qui-f
sélectionne le type de paramètre correct pour leD16
travail.+'1'
comme une opération valide sans arithmétique premier terme, moulagesstring
àint
et renvoie le résultat? Super Scott!Bash + coreutils,
172148 octets24 octets enregistrés grâce à @zeppelin , merci beaucoup
La première ligne décompresse le motif suivant en 6 vagues consécutives:
Ensuite, la boucle fait glisser une fenêtre large de 80 octets sur ce modèle.
la source
*> <> ,
251250251 octets (non concurrents)Remarque:
"H;0["
est censé avoir ascii27
après[
.Essayez-le ici! (régler le délai à 0ms)
Je n'arrive pas à croire que j'ai réussi à faire ça. Celui - ci utilise les
I
et desD
instructions, qui incrémente ou décrémente la pile sélectionnée. Ceci démontre qu'il est probablement possible de le faire en pure> <> (moins le sommeil) ou en une réponse compétitive *> <>, bien que ce soit probablement beaucoup plus difficile à faire.La version d'interprète en ligne est différente simplement pour effacer la sortie à l'aide d'un retour chariot.
Ceci est non-concurrence parce que les
I
,D
,C
et lesR
instructions sont plus jeunes que le défi. C'est probablement possible de se passer de ces instructions, mais ce serait très difficile / long.Edit: j’ai réussi à supprimer un octet, mais j’ai aussi remarqué que j’avais mal mesuré la taille et que j’ai donc gagné un octet.
Je ferai de mon mieux pour briser les marches et expliquer ce qui se passe ici ...
Explication
Table des matières
Initialisation
Ici nous construisons les 6 lignes qui construisent les vagues. Nous devons répéter chaque chaîne 5 fois pour avoir la longueur correcte.
Nous commençons par 6 d'entre eux, un pour chaque ligne de la vague:
Et nous entrons dans la boucle principale après l’initialisation
09.
.Copier la pile actuelle 4 fois
C'est une fonction simple qui prend simplement la pile actuelle et la copie 4 fois. Alors "a" deviendrait "aaaaa".
Copier pile
Ceci copie la pile actuelle, en ajoutant la copie à la pile actuelle.
Installer
Aller ignorer l'initiale
<
et inverser la première ligne pour devenirl:&0v
comme c'est l'ordre dans lequel il est exécuté après les<
changements de direction de l'IP.A partir de là, la longueur sera désignée sous
n
le0
nom dei
.Boucle
Nettoyer
Boucle principale
C'est ici que le code fonctionne à l'infini, en redessinant constamment les vagues entre 100 ms.
Installer
Boucle
la source
PHP, 128 octets
Impossible d'animer plus d'une ligne, mais le défilement est activé.
Ajouter
,0
au tableau pour une ligne vide entre les itérations. Courez avec-r
.la source
Mathematica, 213 octets
Je ne vois pas d'autre moyen de reproduire le motif d'onde dans Mathematica que de commencer par une liste de chaînes pour chaque ligne. J'initialise
i
pour être0
et programme une tâche pour l'incrémenter toutes les0.1
secondes.Dynamic
J'affichage allié le résultat de ce qui suit:StringRepeat
chaque ligne 5 fois.Characters
.RotateRight
chaque liste de personnages pari
.Grid
.la source
C (unix),
231191 octetsCela ne fonctionnera que sur les environnements Unix. Aussi, veuillez excuser le fait que le sommeil n'accepte que les entiers ... il retarde donc réellement d'une seconde entre les images.
Version non-golfée:
Version golfée:
la source
Javascript (ES6),
152147145 octetsla source
setInterval(a=>{...},100,6)
et 4 autres avecf+=" *"[[...][a]&1<<(i+x)%16]
.Perl 6,
140138137123120 octetsAnciennes solutions:
la source
Python 3,
240239230 octets-1 octet grâce à @redstarcoder
-9 octets grâce à @PascalvKooten
la source
print("\x1b[0;H")
travaille également pour moi pour -1 octet.' **'
par' '*13+'**'
et vous pouvez avoir 1 retrait de caractère dans le temps, pas besoin de 4 caractères.Raquette 295 octets
Ungolfed:
Essai:
Sortie:
(Cet affichage de fichier gif est plus lent que la sortie réelle).
la source
Python 2,
207202 octetsHabituellement, je suis un développeur C #, donc cela ne sera peut-être pas encore complètement joué au golf ...
la source
C #, 327 octets
Plus ou moins une version portée de ma solution en Python ...
la source
Perl, 110 octets
Requiert
-E
sans frais supplémentaires. Cela contient des caractères non imprimables.Créez les données ci-dessus en utilisant l'hexdump réversible ci-dessous. Exécutez
xxd -d > sea.pl
dans un terminal Linux ou compatible, collez le ci-dessous et appuyez sur Ctrl+ d, puis exécutezperl -E "$(cat sea.pl)"
.Usage
Pour un copier / coller facile, veuillez utiliser ce qui suit:
Explication
Une solution assez simple qui stocke l'onde sous forme de chaîne au début, qui est
unpack
éditée en binaire, chaque section est quintupliquée, les0
s sont convertis en espaces et les1
s sont convertis en*
s. Maintenant que nous avons toute la chaîne, nous entrons dans uneredo
boucle qui affiche toute la chaîne, puis nous attendons pendant 0,1 seconde et, pour chaque ligne de la chaîne, nous déplaçons le dernier caractère au début de la chaîne.la source
Mathematica 171 octets
La vague elle-même est constituée de données, je stocke donc une version compressée de la totalité de la vague dans mon code. Je peux stocker une onde beaucoup plus compacte que si j'utilisais
\fð߀ᣀ恠耟
sa représentation binaire, mais le décompte de caractères nécessaire à la décompression est trop élevé *.Voici le code:
Voici le code que j'ai utilisé pour créer la version compressée des données wave:
Voici le code que j'aurais préféré utiliser pour stocker des données binaires répétées compressées comme cette onde:
Comme vous pouvez le constater, le temps système nécessaire pour reconvertir les données compressées en chaîne est trop onéreux pour ce problème particulier, bien qu’une seule vague puisse être stockée de cette manière avec 7 caractères UTF et 15 octets.
Voici le code permettant de déterminer la séquence de caractères UTF pour stocker une seule onde (comme ci-dessus).
la source
Ruby
269217189185 octets-28 octets grâce à @manatwork
-5 octets grâce à @ropata
Ordinaire
Golfé
la source
do … end
→{ … }
et supprimez les nouvelles lignes après{
et avant}
; supprime l'espace entresystem
et son paramètre; supprime le,
dernier élément du tableau après le tableau;.each
→.map
et supprimez l'espace entre celui-ci et son bloc de code; enlever l'espace devantputs
;0..80
→0,80
(il s'agit également d'un bogue, car votre expression génère une chaîne de 81 caractères);p=p+1==16?0: p+1
→p=-~p%16
.do … end
→{ … }
, leloop
mot - clé est toujours nécessaire . C'est le plus court que je reçoive: pastebin.com/cg3gxnm4b=' '
(5 espaces vides) en haut, puis en modifiant l'expression de sortie en' '*12+'** ', ' '*8+'**** ',b+'***** '+b,' ** ** '+b,' ** **'+b,'*'+b+b+'*****'
... (mais SEHTML + JS + jQuery, 10 + 233 = 243 octets
JavaScript décale juste chaque ligne de 1 et change le texte toutes les 100 ms.
la source