logo Homepage
+  NewbieContest
|-+  Général» Defouloir» Le smiley challenge !!
Username:
Password:
Pages: [1]
  Imprimer  
Auteur Fil de discussion: Le smiley challenge !!  (Lu 9773 fois)
Zmx

Profil challenge

Classement : 69/54254

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 559


Voir le profil WWW
« 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 ;op ; 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)

« Dernière édition: 14 Mars 2017 à 15:41:33 par Zmx » Journalisée

pixis
Administrateur

Profil challenge

Classement : 16/54254

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 664


Voir le profil WWW
« #1 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.
Journalisée

Newbie Contest Staff :
Pixis
Statut :
Administrateur
Blog :
hackndo
Zmx

Profil challenge

Classement : 69/54254

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 559


Voir le profil WWW
« #2 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.
Journalisée

pixis
Administrateur

Profil challenge

Classement : 16/54254

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 664


Voir le profil WWW
« #3 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
Journalisée

Newbie Contest Staff :
Pixis
Statut :
Administrateur
Blog :
hackndo
Zmx

Profil challenge

Classement : 69/54254

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 559


Voir le profil WWW
« #4 le: 14 Mars 2017 à 17:36:24 »

Je viens de faire 69 en PHP en étant extrement borderline avec les "regles"
Journalisée

the lsd
Administrateur

Profil challenge

Classement : 189/54254

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 3096

poulping for fun & profit


Voir le profil WWW
« #5 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
Journalisée

Newbie Contest Staff :
The lsd - Th3_l5D (IRC)
Statut :
Administrateur
Citation :
Cartésien désabusé : je pense, donc je suis, mais je m'en fous !
Zmx

Profil challenge

Classement : 69/54254

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 559


Voir le profil WWW
« #6 le: 14 Mars 2017 à 18:14:51 »

Et un exemple de pourquoi on compte les espaces, ceci fonctionne
Citation
$a="test";echo$a
Journalisée

the lsd
Administrateur

Profil challenge

Classement : 189/54254

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 3096

poulping for fun & profit


Voir le profil WWW
« #7 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

Enjoy

The lsd
Journalisée

Newbie Contest Staff :
The lsd - Th3_l5D (IRC)
Statut :
Administrateur
Citation :
Cartésien désabusé : je pense, donc je suis, mais je m'en fous !
harvey

Profil challenge

Classement : 12/54254

Membre Senior
****
Hors ligne Hors ligne
Messages: 316


Voir le profil WWW
« #8 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 ?
Journalisée

L'entropie vient en mangeant.
pixis
Administrateur

Profil challenge

Classement : 16/54254

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 664


Voir le profil WWW
« #9 le: 14 Mars 2017 à 19:35:15 »

Je pense qu'on peut dire que oui, ça suffit
Journalisée

Newbie Contest Staff :
Pixis
Statut :
Administrateur
Blog :
hackndo
harvey

Profil challenge

Classement : 12/54254

Membre Senior
****
Hors ligne Hors ligne
Messages: 316


Voir le profil WWW
« #10 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]}
« Dernière édition: 15 Mars 2017 à 07:27:48 par harvey » Journalisée

L'entropie vient en mangeant.
Zmx

Profil challenge

Classement : 69/54254

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 559


Voir le profil WWW
« #11 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

« Dernière édition: 15 Mars 2017 à 09:44:13 par Zmx » Journalisée

harvey

Profil challenge

Classement : 12/54254

Membre Senior
****
Hors ligne Hors ligne
Messages: 316


Voir le profil WWW
« #12 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)
« Dernière édition: 15 Mars 2017 à 19:39:00 par harvey » Journalisée

L'entropie vient en mangeant.
Pages: [1]
  Imprimer  
 
Aller à: