NewbieContest

Général => Defouloir => Discussion démarrée par: Zmx le 14 Mars 2017 à 15:36:21



Titre: Le smiley challenge !!
Posté par: Zmx le 14 Mars 2017 à 15:36:21
Coucou,

Il y a quelque temps sur irc on avait un challenge, dont je vais vous énoncer les règles.

Il faut "imprimer" 50 smileys générés de façon aléatoire avec les caractéristiques suivantes:
- Yeux: [;:] un de ces deux yeux, au hasard
- Nez ['o- ] un de ces 4 nez, au hasard. Attention le dernier nez est un espace.
- Bouche [()/pO] une de ces 5 bouches.

Chaque smiley doit être imprimé et séparé des autres (espace, retour à la ligne, ...)
Le code est dans le langage de votre choix, le code le plus court gagne.

Exemple de sortie:
:-) ;o( :-O ;-( : O ;-/ ;-O ; / : p :-/ ;'p ;-/ : / ;-O ;oO :'/ ;o/ :-p ; ) :oO :o) ;-/ :-) ;'/ :'O ;op ; O :-( :-( : ) ;-O :'O ; ) ; ( ;-( ;-/ :o/ :'( ;'p : ) ;'( ;'O :') : ( ; ) ;-( : / ; ) ;'/ ; )

Ce qui compte comme étant du "code":
- le code lui même
- les espaces/tabulation/retour à ligne. (pour ce dernier il comptera pour 1 char, on est gentil)
- les éventuels imports
- les déclarations

Ce qui ne compte pas:
- <?php
- <script>
- ce genre de choses pas forcément obligatoires.

Et si vous aimez le concept vous en trouverez d'autres sur http://codegolf.stackexchange.com/ (merci laxa)



Titre: Re : Le smiley challenge !!
Posté par: pixis le 14 Mars 2017 à 17:16:50
Code:
from random import choice as b;' '.join(b(";:")+b("o- ")+b("()/po") for i in range(50))

Mais c'est loin d'être optimum.


Titre: Re : Re : Le smiley challenge !!
Posté par: Zmx le 14 Mars 2017 à 17:24:17
Code:
from random import choice as b;' '.join(b(";:")+b("o- ")+b("()/po") for i in range(50))

Mais c'est loin d'être optimum.

88, c'est pas mal. Autant que je sache le minimum qu'on ai en stock c'est 74 en php.


Titre: Re : Le smiley challenge !!
Posté par: pixis le 14 Mars 2017 à 17:26:31
le "from random import choice as b" nique quand même vachement de truc. Faut trouver un langage qui a une bonne lib random built-in


Titre: Re : Le smiley challenge !!
Posté par: Zmx le 14 Mars 2017 à 17:36:24
Je viens de faire 69 en PHP en étant extrement borderline avec les "regles" :)


Titre: Re : Le smiley challenge !!
Posté par: the lsd le 14 Mars 2017 à 18:10:14
J'améliore la réponse de pixis de UN caractère :

Code:
import random;b=random.choice;' '.join(b(";:")+b("o- ")+b("()/po") for i in range(50))

Enjoy

The lsd


Titre: Re : Le smiley challenge !!
Posté par: Zmx le 14 Mars 2017 à 18:14:51
Et un exemple de pourquoi on compte les espaces, ceci fonctionne
Citation
$a="test";echo$a


Titre: Re : Le smiley challenge !!
Posté par: the lsd le 14 Mars 2017 à 19:21:01
Une autre solution, qui utilise la récursivité (pourquoi ? je ne sais pas trop en fait). C'est pas la meilleure du coup, mais je m'en rapproche : 94 caractères :
Code: (python)
import random
b=random.choice
def a(c):
 if c<50:a(c+1);print b(";:")+b("o- ")+b("()/po")
a(0)

Sinon, même question qu'Harvey, on peut éventuellement trouver d'autres fonctions "random" qui pourrait faire gagner un ou deux chars :D

Enjoy

The lsd


Titre: Re : Le smiley challenge !!
Posté par: harvey le 14 Mars 2017 à 19:22:20
Que signifie "générés de façon aléatoire" ?
Suffit-il que les smileys soient différents à chaque exécution, même si le générateur utilisé est faible ?


Titre: Re : Le smiley challenge !!
Posté par: pixis le 14 Mars 2017 à 19:35:15
Je pense qu'on peut dire que oui, ça suffit


Titre: Re : Le smiley challenge !!
Posté par: harvey le 14 Mars 2017 à 22:41:07
68 en php:
Code:
for(;$i++<50;)echo";:"[1&$a=rand()]."'o- "[$a/2%4]."()/pO"[$a%5]." "


76 en python3:
Code:
import os
for a in os.urandom(50):print(";:"[a%2]+"'o- "[a>>6]+"()/pO"[a%5])

54 (ruby)
Code:
50.times{p";:"[rand 2]+"'o- "[rand 4]+"()/pO"[rand 5]}


Titre: Re : Re : Le smiley challenge !!
Posté par: Zmx le 15 Mars 2017 à 09:19:10
68 en php:
Code:
for(;$i++<50;)echo";:"[1&$a=rand()]."'o- "[$a/2%4]."()/pO"[$a%5]." "

Jolie j'avais 68 en etant border line.
A quoi sert le /2 de [$a/2%4] ? (j'ai l'impression que tu gagne encore 2 char)

Et comme je suis battu, voici mes solutions:
74 char - propre
Code:
for($a=[';:',"'o- ",'()/pO',' '];@$i<200;)echo str_shuffle($a[@$i++&3])[0]

72 char - some warning
Code:
for($a=[';:',"'o- ",'()/pO',' '];$i<200;)echo str_shuffle($a[$i++&3])[0]

68 char - borderline: using the warning as a separator :)
Code:
for($a=[';:',"'o- ",'()/pO'];$i<200;)echo str_shuffle($a[$i++&3])[0]

En espérant que ça aide a trouver encore plus court :)



Titre: Re : Re : Re : Le smiley challenge !!
Posté par: harvey le 15 Mars 2017 à 16:11:49
A quoi sert le /2 de [$a/2%4] ? (j'ai l'impression que tu gagne encore 2 char)
J'ai dû le rajouter parce que 2 est un diviseur de 4. Comme on a déjà $a modulo deux qui sert à choisir les yeux, on a plus que deux possibilités pour le nez avec un modulo 4 (donc seulement 20 smiley possibles sur 40, par exemple on n'aura jamais :' ou :- ). On pourrait aussi faire un right-shift pour ne garder que les 2 bits de poids fort, mais ça fait le même nombre de caractères.

C'est marrant (et presque décevant) que la solution la plus courte en ruby soit aussi la plus propre et la plus lisible.



(Dans la solution php, on peut remplacer le " " final par un underscore pour avoir une solution "borderline" à 66 caractères)