Les bulles sont un divertissement de niveau maximum. Tout le monde peut en convenir.
Désormais, vous pourrez même profiter d'ordinateurs à bulles.
Spécifications
Vous recevrez deux nombres entiers, w et h (chacun étant respectivement largeur et hauteur)
Votre programme devrait sortir toutes les phases w * h en attendant 1 seconde entre chacune et se terminer.
Chaque emballage à bulles commence avec toutes les cellules pleines.
Par exemple, un emballage à bulles 4 * 6 commence comme:
O_O_
_O_O
O_O_
_O_O
O_O_
_O_O
Et à chaque phase, une cellule aléatoire non éclatée est éclatée. Par exemple,
O_O_
_O_O
O_X_
_O_O
O_O_
_O_O
Le programme doit se terminer lorsque toutes les cellules sont sautées. alias.
X_X_
_X_X
X_X_
_X_X
X_X_
_X_X
Exemples
(4,6)
(5,5)
(6,2)
(10,10)
(7,9)
1
et0
au lieu deO
etX
?(1,1)
de ne pas avoir de bulles (par exemple, la "cellule" en haut à gauche est toujours un trait de soulignement)?Réponses:
C (Windows),
260248 octetsla source
system("cls")
c'est aussi spécifique à Windows, donc le code ne serait pas plus portable avec la bibliothèque de threads non plus. Et avec C ++, je devrais également inclureiostream
oucstdio
.Python 3 ,
222220 octetsC'est la première fois que je réponds, alors soyez gentil (et signalez les erreurs que j'ai commises).
Essayez-le en ligne!
Comment ça marche:
r*c+r%2*c%2
: il y a desr*c
bulles dans le motif, sauf si r et c sont tous les deux impairs, auquel cas il y en ar*c+1
.la source
f(c,r)
et tout ira bien).MATL , 37 octets
Le coin supérieur gauche est toujours un trait de soulignement (autorisé par le défi).
L'écran est effacé entre les phases. Je pourrais économiser un octet en n'effaçant pas l'écran, mais cela semble mieux de cette façon.
Le programme se termine avec une erreur ( autorisée par défaut ) après avoir affiché toutes les phases.
Essayez-le sur MATL Online! (Si cela ne fonctionne pas après quelques secondes, veuillez actualiser la page et réessayer).
la source
Mathematica (145 octets)
Fonction anonyme, prend la hauteur et la largeur en entrée (dans cet ordre - si c'est un problème, remplacez
{##}
par{#2,#}
au milieu du code pour 2 octets supplémentaires).Code:
Explication:
""<>Riffle[Array["_"["O"][[Mod[#+#2,2]]]&,{##}],"\n"]
crée l'habillage à bulles initial et non nettoyé, en créant un tableau de «_» et de «O», puis en les joignant par chaîne entre les sauts de ligne.NestList[RandomChoice@StringReplaceList[#,"O"->"X"]&,..., Floor[##/2]]
choisit à plusieurs reprises l'un des "O" à remplacer par un "X", autant de fois qu'il y a de "O" (qui est Floor [largeur * hauteur / 2] - merci à @JonathanAllan pour l'idée de mettre "_ "au lieu de" O "dans le coin supérieur gauche, sinon ce serait à laCeiling
place et donc 2 octets de plus).Monitor[Do[Pause@1,{i,...}],i]
faiti
prendre les valeurs de la liste que nous venons de calculer, pendant 1 seconde chacune, et imprime dynamiquementi
.Exemple de sortie:
la source
Gelée ,
3029 octetsAppelle le lien en tant que dyade avec les arguments du programme, puis quitte avec un message (dont le code est
çṛ“\'=ṙMḋḌẓ(ėo»
)Nuance: la "cellule" en bas à droite sera toujours une bulle (plutôt qu'en haut à gauche comme dans l'exemple de la question), c'est pour s'assurer que lorsque toutes les bulles sont sautées, le choix aléatoire renvoie 0 qui sera le
"X"
au fin de la liste - le remplacer ne modifie alors pas la valeur et rompt la boucle.Remarque: n'efface pas l'écran (n'a pas été spécifié et je ne sais pas comment le faire).
Comment?
la source
Scala , 764 octets
Comment ça marche
L'algorithme remplit d'abord une séquence 2D avec de fausses valeurs. Il détermine combien d'itérations (boîtes ouvertes) existent en fonction des arguments de ligne de commande insérés. Il crée un pli avec cette valeur comme limite supérieure. La valeur entière du repli n'est utilisée qu'implicitement comme moyen de compter le nombre d'itérations pour lesquelles l'algorithme doit s'exécuter. La séquence remplie que nous avons créée précédemment est la séquence de départ du pli. Ceci est utilisé pour générer une nouvelle séquence 2D de fausses valeurs avec leurs indécies co-répondantes.
Par exemple,
Sera transformé en
Notez que toutes les listes qui sont complètement vraies (ont une longueur de 0) sont omises de la liste des résultats. L'algorithme prend ensuite cette liste et sélectionne une liste aléatoire dans la liste la plus externe. La liste aléatoire est choisie pour être la ligne aléatoire que nous choisissons. À partir de cette ligne aléatoire, nous trouvons à nouveau un nombre aléatoire, un index de colonne. Une fois que nous avons trouvé ces deux indices aléatoires, nous dormons le thread sur lequel nous sommes pendant 1000 millisecondes.
Après avoir dormi, nous effaçons l'écran et créons un nouveau tableau avec une
true
valeur mise à jour dans les indices aléatoires que nous avons créés.Pour l'imprimer correctement, nous l'utilisons
map
et le compressons avec l'index de la carte, nous l'avons donc dans notre contexte. Nous utilisons la valeur de vérité de la séquence pour savoir si nous devons imprimer unX
ou unO
ou ou_
. Pour choisir ce dernier, nous utilisons la valeur de l'indice comme guide.Choses intéressantes à noter
Pour déterminer s'il doit imprimer un
O
ou un_
, le conditionnel((r._2 % 2) + c._2) % 2 == 0
est utilisé.r._2
fait référence à l'index de ligne actuel tandis quec._2
fait référence à la colonne actuelle. Si l'un est sur une ligne impaire,r._2 % 2
sera 1, donc compenséc._2
par un au conditionnel. Cela garantit que sur les lignes impaires, les colonnes sont déplacées de 1 comme prévu.L'impression de la chaîne
"\033[H\033[2J\n"
, selon une réponse de Stackoverflow que j'ai lue, efface l'écran. Il écrit des octets sur le terminal et fait des trucs géniaux que je ne comprends pas vraiment. Mais j'ai trouvé que c'était la manière la plus simple de s'y prendre. Cependant, cela ne fonctionne pas sur l'émulateur de console d'Intellij IDEA. Vous devrez l'exécuter à l'aide d'un terminal standard.Une autre équation que l'on pourrait trouver étrange lors de la première lecture de ce code est
(l * k) / 2 - (l * k + 1) % 2
. Tout d'abord, démystifions les noms de variables.l
fait référence aux premiers arguments passés dans le programme tandis quek
fait référence au second. Pour le traduire,(first * second) / 2 - (first * second + 1) % 2
. Le but de cette équation est de trouver le nombre exact d'itérations nécessaires pour obtenir une séquence de tous les X. La première fois que j'ai fait ça, j'ai fait(first * second) / 2
comme ça avait du sens. Pour chaquen
élément de chaque sous-liste, il y a desn / 2
bulles que nous pouvons faire éclater. Cependant, cela casse lorsqu'il s'agit d'entrées telles que(11 13)
. Nous devons calculer le produit des deux nombres, le rendre impair s'il est pair et même s'il est impair, puis prendre le mod de cela par 2. Cela fonctionne parce que les lignes et les colonnes qui sont impaires nécessiteront une itération de moins pour arriver au résultat final.map
est utilisé à la place d'unforEach
car il contient moins de caractères.Des choses qui peuvent probablement être améliorées
Une chose qui me dérange vraiment dans cette solution est l'utilisation fréquente de
zipWithIndex
. Cela prend tellement de personnages. J'ai essayé de faire en sorte que je puisse définir ma propre fonction à un caractère qui fonctionnerait simplementzipWithIndex
avec la valeur transmise. Mais il s'avère que Scala ne permet pas à une fonction anonyme d'avoir des paramètres de type. Il y a probablement une autre façon de faire ce que je fais sans utiliser,zipWithIndex
mais je n'ai pas trop réfléchi à une façon intelligente de le faire.Actuellement, le code s'exécute en deux passes. La première génère une nouvelle carte tandis que la deuxième passe l'imprime. Je pense que si l'on devait combiner ces deux passes en une seule, cela économiserait quelques octets.
C'est le premier golf de code que j'ai fait, donc je suis sûr qu'il y a beaucoup de place pour l'amélioration. Si vous souhaitez voir le code avant d'optimiser autant que possible les octets, le voici.
la source
JavaScript (ES6),
246229 octetsla source
`${`_O`.repeat(w).slice(w)} ${`O_`.repeat(w).slice(w)}
être combinée d'une manière ou d'une autre? Peut-être un drapeau booléen pour déterminer d'abord_O
ouO_
, puis faire le.repeat(w).slice(w)
?Python - 290 octets
Je n'en ai jamais fait auparavant - donc toute critique constructive serait appréciée :)
L'astuce principale ici est juste des compréhensions de listes emboîtées. Je pourrais sauver quelques personnages en n'ayant pas de nouvelle ligne entre les pops mais ça a l'air moche.
la source
w
eth
comme entrée (via STDIN, comme entrée de fonction, ou quelque chose de similaire), au lieu d'avoir un code durH=4 W=6
. De plus, même si je n'ai jamais programmé en Python, je pense que vous pouvez jouer au golf dans certains espaces de votre code actuel. Des conseils pour jouer au golf en Python peuvent également être intéressants à lire pour vous donner des idées sur la façon de le jouer plus loin. Profitez de votre séjour! :)Charbon de bois ,
494639 octets (sans concurrence)Verbeux
la source
APL (Dyalog) ,
6159 octets⎕←
sortiem←
m , où m est'O_'[
...]
ces caractères indexés par ...2|
la division-reste-quand-divisée par deux de-/¨
la différence entre chacune de⍳
toutes les coordonnées (indices) dans un tableau de forme⎕
entrée numérique (le nombre de lignes et de colonnes )(
...)[
...]←'X'
classer le caractère X à l' un des ... parb/
cas filtré b (à définir),m
éléments effiloché de m, en particulier ...?
un élément aléatoire (numéro de lit.) dans une plage de+/
la somme deb←
b , où b est'O'=
booléenne car où la lettre est égale à,m
m défilée⎕DL 1
D e l ay une seconde→2
Passez à la ligne 2/⍨
si (lit. filtré par)'O'∊
si la lettre est membre de⎕←m
la valeur sortie, où la valeur sortie est mEssayez-le en ligne!
À partir de la version 16.0, il sera plus court:
{0::→⋄'X'@(⊂(?∘≢⊃⊢)⍸'O'=⍵⊣⎕DL 1)⊢⎕←⍵}⍣≡'O_'[2|-/¨⍳⎕]
la source
Python 3,
195188 octetsUtiliser
bytearray
etdecode
semble être plus court que trancher et réassembler une chaîne à laa[:i]+'X'+a[i+1:]
.la source
Java 7, 317 octets
Explication:
Gif de test (4,6)
la source
Perl, 148 octets
146 octets de code +
-pl
drapeaux.Pour l'exécuter:
la source
MATLAB (R2016b), 172 octets
Code:
Les recommandations sont toujours les bienvenues! Essayez-le en ligne!
Sortie du programme:
Explication:
la source