[GO] Politique de base pour la recherche de mahjong

Ajout sournois à écrire une fois

Peut-être que j'aime ça après tout. Koyu. Nostalgique C. "[Mahjong est amusant](https://www.google.co.jp/search?q=%E9%BA%BB%E9%9B%80%E3%81%A3%E3%81%A6% E6% A5% BD% E3% 81% 97% E3% 81% 84% E3% 82% 88% E3% 81% AD & source = lnms & tbm = isch & sa = X) "(Saki) et Yuka, le défi de l'implémentation d'un jeu de mahjong C'est intéressant car il y a tellement de choses à dire dans la recherche d'attente, ce qui équivaut au niveau de difficulté moyen. La précédente Story of Rimu et l'histoire de la machine d'état sont de faible difficulté, et l'IA de NPC est de haute difficulté (enfin, pour que le nombre d'écoutes s'améliorera) C'est difficile à frapper, mais c'est relativement fort, mais ce n'est pas humain, il est donc difficile de calculer quoi pour une IA humaine et forte) Shi. De plus, c'est un trésor de matériel car il n'y a pas de commentaire approfondi sur le mahjong informatique (il semble que ce soit un modèle qui n'est pas sorti parce qu'il ne s'est pas vendu, bien qu'il soit sorti). Si vous le faites avec soin, ce sera un livre à la hauteur du nombre d'écoutes, et ce sera un livre plutôt robuste. (Ce qui suit n'est pas poli, donc je ne sais pas: j'ai l'impression de dire juste la réponse)

formulaire de données

Il existe différentes manières d'exprimer l'artisanat du mahjong.

/*(1)Comment mettre chaque type de tuile dans un tableau*/
   t_pai pai[14];
   int painum;
/*(2)Comment mettre le nombre de biens dans un tableau pour chaque type de tuile*/
   int painum[9+9+9+3+4+1];/*Contient un élément factice*/
   int pairednum[4];/*Stocke uniquement le nombre de tuiles rouges, chevauchant avec painum (1 mannequin est inclus)*/
/*(3)Y a-t-il un moyen de le gérer comme une structure en bois? Je ne suis pas sûr, mais je suis sûr que c'est inefficace*/
   t_pai_node top;
   top.same(), top.more(), top.less(), //Et? Bref, je voulais dire topless.

(1) convient à la manipulation dans le système d'affichage et au flux d'imitation, mais comme vous pouvez le voir si vous lisez cet article jusqu'à la fin, (2) est plus rapide pour une analyse telle que la recherche d'une attente de mahjong. Même si (1) est laissé tel quel, je pense que cela peut être rendu plus rapide tel quel si vous le faites de manière intelligente, mais comme il faut mordre si et scanner pas à pas, le code devient compliqué. Une liste efficace des candidats gagnants est difficile et la décomposition du visage nécessite des échanges et des tri répétés. Cependant, comme le nombre d'éléments est petit, c'est le seul mérite, mais il est inévitable que le TRY soit profond, et l'algorithme sera difficile à mettre en œuvre, donc (2) gagnera. Je vais examiner l'objection. Et j'ai l'impression que beaucoup de logiciels de mahjong le font.

Comme il est facile de générer (1) à (2), il convient de le gérer dans (1) sauf lors de l'analyse de l'apparence, et de générer grossièrement (2) lors de l'analyse de l'apparence. pense. La raison pour laquelle le mannequin est préparé en (2) est d'effectuer (1) → (2) sans saut de branche même lorsque le nombre de sons est petit. En d'autres termes, le dernier élément est le nombre de tuiles nulles.

Cela peut aussi être painum [12 + 12 + 12 + 12 + 1] pour une autre optimisation. Nous en reparlerons plus tard.

Le grincement n'est pas mentionné ici, mais il doit être géré séparément. Réfléchissez uniquement dans le tableau principal (données de gravure / commande) pour la combinaison gagnante à l'avance.

Ci-dessous, j'écrirai sur la prémisse du format de données de (2).

Réimpression des commentaires attachés à un certain endroit

Il existe deux politiques principales pour la recherche de mahjong.

R [Cela a du potentiel, mais il a tendance à être compliqué d'identifier la liste d'attente]
essayez un seul cheval (1 à 3 tuiles possédées)
Retirez la gravure et le junko des deux extrémités avec la priorité sur la gravure, et si vous pouvez le supprimer, vous pouvez attendre un seul cheval
essayez Jakuto confirmé (2-4 tuiles possession)
Retirez la gravure et le junko des deux extrémités avec priorité sur la gravure, et s'il y a un surplus, c'est un formulaire d'attente
Trouvez le formulaire dérivé en accueillant le dernier formulaire d'attente restant avec les hommes qui l'ont supprimé ci-dessus.
Par exemple, si le dernier est 45, interagissez avec le Junko supprimé qui en contient 3 ou 6.
Par exemple, s'il y en a 678, lisez comme (45/678) → (456/78).
Plus loin de 78 la même phrase ci-dessous
Par exemple, s'il y en a 234, lisez (45 ・ 234) → (345 ・ 24)
Par exemple, si 66 est une tête de moineau, il doit être lu comme (45,66) → (456/6) attendant un seul cheval.
Par exemple, s'il y a 666, lisez (45/666) → (456/66) comme attendant un shabo avec la tête de moineau
Comme vous pouvez l'imaginer, recherchez-le pour qu'il ne boucle pas.
Retirez la boîte d'attente de 4 cartes de la boîte d'attente

B [Il faut beaucoup de travail pour identifier le formulaire en attente, mais c'est rapide si vous ne trouvez que le formulaire en attente]
essayez Ajouter les tuiles possédées et les tuiles avant et après elles
essayez Jakuto confirmé (2-4 résultats ajoutés sont détenus)
Retirez la gravure et le Junko des deux extrémités avec la priorité sur la gravure, et c'est OK s'il peut être retiré

B'[Effort spécifique du formulaire d'attente ci-dessus]
La tuile ajoutée est incluse dans la tête de moineau → Cheval unique
Les tuiles ajoutées sont incluses dans Junko → Selon la façon dont elles sont incluses, la tension latérale, le montage et les deux côtés
La tuile ajoutée est incluse dans la gravure → Shabo
S'il s'agit d'un type de gravure triple, un type d'attente lorsqu'il est lu comme Junko est également ajouté
Ce qui précède peut être interprété plusieurs fois → L'interprétation avec le score le plus élevé doit être faite en calculant la note et en jugeant la combinaison.
→ La marque Tsumo change en fonction du formulaire d'attente, donc au moins le drapeau Tsumo doit être visible.
→ Si vous décidez du score, vous pouvez voir le vent propre, le vent de champ, l'état de portée, le dora, etc.
→ C'est la même chose pour A. Il est difficile de le modulariser proprement
La plupart des données du jeu doivent être visibles ici

B est lisse dans le but d'identifier l'attente et de juger le rôle. Le calcul de la distance comprenant le nombre d'auditeurs et la probabilité de la forme gagnante est une extension de A, donc dans de nombreux cas, les deux seront mis en œuvre. De plus, si vous ne spécifiez pas le formulaire d'attente en B et que vous passez ensuite la distinction entre Tsumo et Izukuri avec un drapeau pour chaque formulaire d'attente, vous ne pourrez pas juger l'empreinte ou le pinf de Tsumori 3 Je me trompe. Comme je l'ai écrit dans les commentaires, ce type de traitement est une chose très ennuyeuse si vous ne pouvez pas compléter toutes les données du jeu (honnêtement, vous devez presque tout passer sauf la rivière).

Et c'est l'optimisation!

Donc, le point est de savoir comment écrire cela avec le saut minimum et en utilisant uniquement la mémoire qui tient dans le cache L1, mais si vous écrivez un serveur de jeu de mahjong, la plupart du traitement se fait sous la forme d'une épée. Vous faites une analyse, donc plus ce gars est rapide, plus vous pouvez accueillir de personnes. La machine à états n'est gênante que pour gérer des règles aussi petites qu'une combinaison de cris et de cris, de doublons, de boîtes sombres et de chankans (bien qu'il soit très difficile de rendre les règles variables). Ce n'est pas comme prendre du temps de traitement (certainement). Maintenant, je pense que le lobby et le flux de jeu peuvent être gérés avec Node.js + react.js + socket.io. Cependant, seule l'analyse d'apparence ne peut pas prendre en charge C10K sans codage de bas niveau à l'aide de la liaison C ++.

Le nombre d'écoutes est réduit d'au plus 1 par Tsumo, donc si vous pouvez calculer correctement le nombre d'écoutes, vous pouvez analyser l'apparence sur le serveur une fois tous les quelques tours. (Listen-1) Vous pouvez ignorer l'analyse d'apparence pour la visite. Et c'est la taille la plus racinaire et la plus efficace. Sur cette base, nous optimiserons encore le jugement d'achèvement, le jugement d'écoute, le jugement d'accessibilité, etc., y compris le calcul du nombre d'écoutes. De plus, le nombre d'audiences doit être calculé de trois manières: sept paires, Kokushi et face à face, mais le nombre d'audiences en face à face nécessite un élagage qui va au-delà de ce qui est expliqué ici. En effet, le nombre d'écoutes peut être calculé à partir de la combinaison de Toko, paire et visage, mais la division est étonnamment ambiguë, et si vous le faites mal, vous pouvez tomber dans une recherche approfondie. C'est ennuyeux d'avoir la mauvaise valeur. Si j'en ai envie, je l'écrirai bientôt, mais je commencerai par les bases.

  a[0]>=Si 3
 [ a[0], a[1], a[2] ] = [ a[0]-3, a[1], a[2] ] /*Essayez de prendre la gravure du bord*/
Autrement
 st = min(a[0],a[1],a[2])Quand
 [ a[0], a[1], a[2] ] = [ a[0]-st, a[1]-st, a[2]-st ] /*Essayez de prendre Junko du bord*/

/*Bien sûr après ça
a[1], a[2], a[3]
a[2], a[3], a[4]
a[3], a[4], a[5]
a[4], a[5], a[6]
a[5], a[6], a[7]
a[6], a[7], a[8]
Le même processus est appliqué à chacun d'eux.
La gravure est
a[7]
a[8]
Le même processus est appliqué.
Si vous souhaitez effectuer un traitement de caractères avec l'allocation de mémoire décrite plus loin
a[9]
Nécessite également une gravure.
*/

Il est seulement nécessaire d'effectuer le calcul en combinant des opérations sur les bits et des références de table sans branchement, et de conserver un enregistrement de ce qui a été fermé. Eh bien, la réponse dans la plupart des cas est «soustrayez 0 pour ce que vous voulez sans aucun impact». Ensuite, écrivez l'enregistrement du résultat pour le moment et définissez l'incrément de l'adresse du pointeur sur 1 uniquement lorsque vous souhaitez conserver l'enregistrement et ajoutez 0 à l'adresse du pointeur dans les autres cas, et il sera éventuellement remplacé. Finalement, il sera ignoré.

Ce qui suit est une simple correction du début ci-dessus sans sauter.

sample


if(a[0] >= 3)
{
    a[0] -= 3;
    *result++ = pai_1pin_ko;
}
//  ↓
int kotsu[] = {0,0,0,3,3};
*result = pai_1pin_ko;
result += kotsu[a[0]]>>1;
a[0] -= kotsu[a[0]];

C'est comme ressentir. Quand je l'ai écrit pour la première fois en opération logique, j'ai fait une erreur, alors je me suis mis en colère et je l'ai réécrit en référence à une table. C'est assez rapide car un tableau de cette taille ne peut jamais sortir du cache. Peut-être plus rapide qu'une opération logique.

Incidemment ajouté

Celui ci-dessus remporte la référence de table. Les petites références de table sont aussi rapides que stupides. Cependant, min a une méthode arithmétique célèbre, et l'opération logique l'emporte. C'est ça. Ce décalage à droite de 31 bits est une norme pour faire des choses comme un opérateur ternaire en utilisant des opérations divisées en positives et négatives. Il sort très souvent pour éliminer les sauts.

sample


st = min(a[0], a[1], a[2]);
    /*↓*/
/*C'est une opération de bit. Mec célèbre*/
int ab = a[0] + (((a[1]-a[0])>>31) & (a[1]-a[0]));
int st = ab + (((a[2]-ab)>>31) & (a[2]-ab));
assert((0x80000000>>31)==(-1));

Par exemple, lorsque vous effectuez une vérification de nombre positif, faites quelque chose comme ((-a) >> 31). Comme cela dépend de l'environnement, j'ai également publié une affirmation pour juger si cela fonctionne. En termes d'application en mahjong, quand vous dites les tuiles possédées lors de la liste des tuiles candidates gagnantes et des tuiles avant et après cela,

p[0]=a[1]*a[2],p[1]=a[2]*a[3]..., 
q[1]=a[2]*a[0],q[2]=a[3]*a[1]..., 
r[2]=a[0]*a[1],r[3]=a[1]*a[2]..., 
p[0]+=q[0]+r[0]+a[0],p[1]+=q[1]+r[1]+a[1]...
p[0]=((-p[0])>>31),p[1]=((-p[1])>>31)...

Après cela, vous pouvez sélectionner la vignette non nulle comme candidate.

Dans le code ci-dessus, les tampons pour a, p, q et r ne sont écrits que pour plus de clarté et de beauté, et en réalité, seuls deux tampons, les données d'origine a et le résultat contenant p, sont nécessaires.

À propos, même s'il s'agit d'une tuile avant et arrière, s'il n'y a que 3 cylindres et qu'il n'y a pas de 4 cylindres ou 1 cylindre lorsque l'on considère si 2 cylindres peuvent être une tuile candidate gagnante si 2 cylindres ne sont pas dans la tuile de main Vous ne pouvez pas être un candidat gagnant, non? C'est pourquoi je regarde les deux l'un à côté de l'autre.

Ici, la multiplication et l'addition sortent, mais l'ampleur de la valeur n'a pas de sens. 0 × 0 = 0,0 × nombre positif = 0, nombre positif × 0 = 0, nombre positif × nombre positif = nombre positif, puis 0 + 0 = 0,0 + nombre positif = nombre positif, nombre positif +0 = Il est utilisé comme une sorte de produit logique / somme de nombres positifs, nombres positifs + nombres positifs = nombres positifs. Aussi, dans ce cas, 7 paires de la même formule apparaissent dans p et r, alors assemblez-les afin qu'elles puissent être bien utilisées. Vous pouvez le laisser au compilateur.

Au fait, si vous faites une optimisation de type lycée. Il s'agit d'une simple transformation de formule.

p[2] = (a[0]+a[3])*(a[1]+a[4])-a[0]*a[4]+a[2];

Le montant du calcul lui-même est l'original p [2] = a [0] * a [1] + a [1] * a [3] + a [3] * a [4] + a [2]; C'est pareil, mais il y a aussi une mauvaise façon de calculer ici en utilisant la progression du calcul du "muscle mod 3" qui sortira plus tard. Il est plus efficace de conserver l'accès à la mémoire dans le cache L1, de réduire les sauts et d'exécuter le pipeline, plutôt que de le faire aussi loin. C'est tellement délicieux que c'est lisible. Il y a une scène où ce processus est proche de "Muscle mod 3".

Cela peut être une bonne idée de retirer les tuiles qui ont déjà été utilisées avec 4 cartes car l'utilisation de 4 cartes est très rare, il peut donc être judicieux d'identifier les tuiles gagnantes et de les éliminer plus tard. Il y avait une histoire qui m'a fait rire un peu en utilisant 4 cartes, et je me souviens qu'il y avait un rapport de bogue que "1111234444" était traité comme un no-dix après le flux. Non, c'est un succès, ce n'est pas dans le monde. L'histoire tourne mal, mais il y a une histoire similaire sous la forme Novetan, avec 3 Furo, "3456", "3" sortant de la famille supérieure, l'option "Ron", mais "Chi" pas. Ou quelque chose. Vous ne pouvez pas chanter car le remplacement est confirmé.

Et revenons à l'histoire, si vous voulez juger si vous pouvez en faire un fer de lance, c'est ((2-a) >> 31). Ce n'est pas toujours le cas que vous puissiez juger si honnêtement ... prochain!

Grande compétence "mod à code couleur 3"

À propos, il existe au plus 34 types de pré-vérification des tuiles candidates gagnantes mentionnées ci-dessus, y compris les tuiles de personnage. Il y a au plus 25 types qui devraient être essayés dans la vérification préliminaire car il y a une limite sur le nombre d'objets artisanaux. Si vous décidez de ne pas scanner lorsque vous n'écoutez pas, si vous trouvez plus de 20 candidats, vous pouvez élaguer car il n'y a absolument aucune écoute. Cependant, le rétrécissement qui rend un tel rétrécissement ridicule est le rétrécissement par le "mod 3 à code couleur" suivant.

Vous pouvez en fait réduire le nombre de tuiles candidates gagnantes par couleur, comme la couleur dans laquelle elles se trouvent. En regardant le mod 3 du nombre de tuiles détenues pour chaque couleur, tout d'abord, dans la forme gagnante, il y a une tête de moineau quelque part, et toutes les autres sont des facettes de 3 chacune, donc (2, 0 pour les autres) C'est une combinaison. C'est certainement le cas des mains face à face.

Ensuite, quand il s'agit d'écouter, il y a deux modèles selon que vous en tirez un de 2 ou de 0 parce que vous en avez tiré un de votre visage. En d'autres termes, vous ne pouvez écouter que les deux temps (1, 0 pour les autres) et (2, 2, 0 pour les autres). Et puisque l'endroit où la tuile de hit est tirée est différent de zéro, cela signifie qu'il y a une possibilité qu'il y ait une tuile de hit à l'endroit différent de zéro. Lorsqu'il est arrangé par motif, lorsque (1, autre vaut 0), la tête de moineau est de la même couleur que la tuile gagnante, et lorsque (2, 2, autre vaut 0), la tête de moineau et la tuile gagnante sont de couleurs différentes. À ce stade, les candidats à la victoire et la tête du moineau seront réduits.

Cela n'a pas beaucoup de sens de supprimer les sauts dans le processus de réduction (bien qu'il soit préférable de bien utiliser le tableau), alors utilisez-le correctement pour diviser le motif. Au temps de 1, il est nécessaire d'effectuer "essayer par épée" x "essayer le candidat fer de lance", mais au moment de 2, 2, l'un effectuera "essayez le candidat de fer de lance" + l'autre effectuera "essayez par lance". Par conséquent, si vous écrivez un code de jugement spécialisé, vous pouvez l'optimiser davantage. (Personnellement, la première est appelée recherche de produits et la seconde est appelée recherche de somme.)

Sur la base du résultat de ce jugement, vous pouvez remplacer le pointeur de départ et le faire fonctionner, mais faisons le meilleur usage du pipeline en entrelaçant le processus de vérification pour différentes couleurs. Ensuite, ** le compilateur ne sait pas que la plage de pointeurs pointant vers chaque couleur ne se chevauche pas **. Donc ** vous devez entrelacer manuellement **. Cependant, c'est dans un état comme un jugement gagnant de couleurs mélangées avec des conditions bien conditionnées, donc si vous avez le courage, vous pouvez écrire très vite. Cette méthode mod 3 est l'une des idées de base qui apparaît souvent dans l'élagage dans d'autres analyses de tuiles (comme le calcul du nombre d'écoutes).

Soit dit en passant, en passant, il est correct de juger de l'accessibilité en rejetant un par un (surtout si la politique consiste à calculer du côté client), mais pour des raisons de sécurité, il est jugé du côté serveur jusqu'à présent. Si vous souhaitez avertir le client, la boucle «essayez de supprimer, essayez de gagner la vignette du candidat» est étonnamment profonde, vous souhaitez donc l'optimiser. De plus, si vous exécutez des PNJ sur un nombre raisonnable de serveurs, c'est essentiel.

Jugement d'accessibilité, c'est-à-dire jugement d'écoute avec 14 feuilles, "mod 3 par couleur" est (2, autres 0), (1,1, autres 0), (1,2,2, autres Il n'y a que 3 façons de 0). Et vous avez déjà identifié les couleurs des candidats à éliminer pour chaque motif, n'est-ce pas? S'il y a 1, la couleur de 1 est un candidat pour le rejet, sinon la couleur de 0,2 est un candidat pour le rejet. Si vous y réfléchissez davantage, la couleur des tuiles jetées peut être encore limitée. Si nous appelons "décomposition complète du visage" "Tris", Si 1,1, La condition est que "un 1 réussit la recherche de produit, un autre 1 est Tris en coupant un, et les autres couleurs sont également Tris". De même Si 1,2,2 "2, 2 ont réussi la recherche de somme, 1 seul est Tris en coupant un morceau, les autres couleurs sont aussi Tris", Si 2, a "2 coupe une feuille et réussit la recherche de produit, 0 est tout Tris" b "2 est Tris avec attente, 0 est Tris avec tête de moineau, les autres couleurs sont Tris" c "2 est Tris avec tête de moineau, un 0 est Tris avec attente, et les autres couleurs sont Tris" Ce sera. Cela semble difficile, mais quand j'écris le code, ça fait du bien de le réduire de plus en plus. Puisqu'il s'agit de "Jakuto Tris" ⊃ "Machi-Mai Tris", vous pouvez vérifier à quelle catégorie il appartient dans le jugement Machi-Mai Tris à la fois. (Autrement dit, il existe trois types de sortie: Tris en attente et Tris tête de moineau, Tris sans attente et Tris tête de moineau, tous deux échouant: voir aussi "Muscle mod 3" ci-dessous) Et Friten de la fin Si la possibilité de portée est jugée en premier et traitée différemment, le cas de 2 est réduit un peu plus, et si tous les 0 sont des Tris, il appartient toujours à a quand ce n'est pas une forme gagnante. Donc, dans d'autres cas, il y a toujours un 0 dont le jugement Tris est NG (s'il y en a deux ou plus, ce n'est pas dix), et b et c peuvent être jugés à la fois en fixant la couleur. est. Par conséquent, les cas dans lesquels le «jugement Tris en attente» équivalent au «candidat gagnant» doit être exécuté ont été extrêmement réduits. Au plus deux fois.

Ensuite, si vous effectuez une recherche en mélangeant «décomposition de face complète de la couleur A et recherche de somme des couleurs B et C» pour chaque combinaison de motifs, vous pouvez écrire un code facile à obtenir sur le pipeline. Ici, il faut concevoir pour ne pas juger de l'ordre du caractère 牌, mais faire 12 éléments pour chaque caractère de ligne Mantsutsu. 1 2 3 4 5 6 7 8 9 ◆◆◆  ①②③④⑤⑥⑦⑧⑨◆◆◆  123456789◆◆◆ Sud-est ◇ Nord-ouest ◇ Du blanc ◇ Milieu ◆◆ C'est aussi une bonne idée de le placer sur la mémoire de cette manière. C'est OK si vous effectuez la recherche de gravure jusqu'à un [9] et écrasez ◇ avec 0 après avoir calculé le candidat gagnant. Le mérite de pouvoir utiliser des algorithmes à grande vitesse tels que le jugement Tris et la recherche de produits sans exception devrait l'emporter sur la perte qui entraîne un certain gaspillage. Jusqu'à présent, 10 éléments conviennent, mais si vous voulez utiliser "Muscle mod 3" dans la section suivante avec suppression de branche, vous devez utiliser 12 éléments. Eh bien, cela n'augmente pas la quantité de calcul de toute façon, et je pense qu'il est normal de le sécuriser simplement en le touchant lors du calcul de la somme de "muscle mod 3".

Vous pouvez même utiliser "Muscle mod 3"

Je l'ai réécrit ici. Ne regardez pas l'historique des modifications. J'ai peur (après ça). La situation est légèrement différente de celle du "code couleur", donc c'est compliqué. Alors jetons un second regard et allons-y poliment.

Qu'est-ce que "Muscle mod 3"?

int suji[3];
suji[0] = (a[0]+a[3]+a[6]) mod 3;
suji[1] = (a[1]+a[4]+a[7]) mod 3;
suji[2] = (a[2]+a[5]+a[6]) mod 3;

Et si vous l'abréviez en s (suji [0], suji [1], suji [2]) etc., où que se trouve la gravure, s (0,0,0), où est Junko? Est aussi s (1,1,1), donc si Tris réussit, ce sera toujours s (a, a, a). Est-ce que ça va jusqu'à présent?

Donc, s'il s'agit d'un système de 13 feuilles (n * 3 + 1), il devrait s'additionner à paisum mod 3 == 1, donc il sera toujours sous la forme de s (a, a, a + 1) sans ordre particulier. Retirer la tête de moineau signifie enlever les deux mêmes tuiles, donc s (-2,0,0) = s (+ 1,0,0), et en supposant qu'une tuile Tsumo est également s (1,0) , 0). (Quelle source est encore indécise)

Puisque s (a, a, a + 1) peut être dupliqué, afin d'ajouter 1 à deux places pour faire s (a ', a', a '),

Soit s (a ** + 1 **, a ** + 1 **, a + 1) ou s (a, a, a + 1 ** + 1 + 1 **).

D'ACCORD. Vous pouvez maintenant l'utiliser pour la recherche de produits. En supposant une tête de moineau à a + 1 de s (a, a, a + 1), la tuile d'attente est également dans la même ligne (donc, même s'il n'y en a qu'une seule dans la tuile main, la tête de moineau TRY est requise) .. Et si vous supposez une tête de moineau dans l'un ou l'autre, les tuiles d'attente sont dans des lignes différentes (vous ne pouvez donc essayer la tête de moineau TRY dans ce cas que lorsque vous en avez déjà deux ou plus dans votre main).

Donc, si vous gardez une trace des muscles que vous devriez essayer d'attendre lorsque vous prenez une tête de moineau, vous vous améliorerez toujours avec 3 Tris par tête de moineau. Je dois faire un faux jugement de Tris avec une tête de moineau cassée de -1, mais au plus 9 fois * Tris 3 fois, en moyenne 3-4 fois x 3 fois en boucle, alors inscrivez-vous Ensuite, vous pouvez juger le produit en sautant la table. La prédiction de branche par saut de table sera également correcte dans une certaine mesure. Est-ce environ 30%?

Ah, c'était rafraîchissant. Je ne l'ai pas dit comme d'habitude, mais je suis vraiment désolé d'écrire la première chose.

Bien que l'histoire tourne mal

Quand j'étais jeune, je rêvais que si je donnais une zone de définition d'entrée comme indice au compilateur, je pourrais faire une optimisation folle, mais j'ai fait diverses optimisations folles en utilisant moi-même la zone de définition. Quand je l'ai vu, j'en suis venu à penser que ce n'était pas très prometteur de laisser la machine le faire. Cependant, il semble qu'il y ait encore plus de traitement déterminant la vitesse du processeur, et étant donné que la vitesse d'horloge est proche de la limite théorique, cela peut être un mode de vie. Comme l'usage sera limité, il s'agira d'une extension des langages procéduraux et fonctionnels de base tels que C et Haskell, respectivement, mais pour les implémenteurs de langage, le thème de "l'optimisation en utilisant la zone de définition", Comment c'est?

Recommended Posts

Politique de base pour la recherche de mahjong
FX_tool pour Hython Basic02
FX_tool pour Hython Basic01
Grammaire de base Python pour les débutants
Commandes de base pour les opérations sur les fichiers