Analyser les mélanges aléatoires

13

Rod anime un jeu de cartes entre deux joueurs: George et Tim. Actuellement, Tim mélange les cartes. Rod soupçonne que Tim essaie de tricher, il a donc besoin de votre aide pour vérifier que le mélange est juste.

Tim fait le mélange inversé: il coupe une pile de cartes du bas du jeu, puis coupe diverses parties du haut de la pile sur le dessus du jeu, et répète le processus plusieurs fois.

Rod est aux yeux d'aigle et peut voir exactement combien de cartes Tim coupe à chaque fois, mais il ne peut pas calculer et suivre les cartes aussi rapidement que Tim mélange. C'est là que vous intervenez: Rod aimerait que vous écriviez un programme ou une fonction qui obtient les informations de mélange détaillées et détermine si le mélange est juste, faible ou une astuce.

  • Si après le mélange, moins de 25 paires de cartes adjacentes restent adjacentes (dans le même ordre), alors le mélange est juste et le jeu peut continuer.
  • Si au moins 25 paires (mais pas toutes) de cartes adjacentes restent adjacentes, alors le mélange est faible et Rod attrapera Tim au-dessus de la tête et lui demandera de mélanger un peu plus.
  • Si toutes les cartes restent dans la même position à la fin, alors Tim triche évidemment et Rod le frappera avec une grosse truite.

C'est le golf de code, donc le code le plus court gagne.

Contribution:

Vous obtiendrez une série de nombres entre 0 et 52 (tous deux exclusifs) séparés par un espace, sur plusieurs lignes, où chaque ligne représente une ronde de mélange qui commence et se termine avec toutes les cartes empilées ensemble.

Sur chaque ligne, le premier nombre est le nombre de cartes que Tim coupe du bas du jeu, et chaque numéro suivant est un nombre de cartes qu'il laisse tomber de sa main sur le dessus du jeu. S'il reste des cartes après le dernier numéro d'une ligne, vous devez supposer que Tim les place sur le pont.

L'entrée est garantie pour être valide. Il y a au moins une ligne de chiffres et chaque ligne contient au moins 2 chiffres. Le premier nombre sur chaque ligne n'est pas inférieur à la somme de tous les autres nombres sur la même ligne. Une nouvelle ligne de fin est facultative, vous pouvez supposer que l'entrée en a une ou qu'elle n'en a pas.

Production:

Votre programme devrait imprimer / retourner "juste" si le mélange est juste, "faible" si le mélange est faible et "astuce" si Tim garde toutes les cartes dans le même ordre. Une nouvelle ligne de fin est facultative.

Exemple:

Le jeu est supposé avoir 52 cartes, mais à des fins de démonstration, je vais utiliser un jeu plus petit de 10 cartes.

Contribution:

5 3 1
4 2 2

Pont initial, vu du haut: 0 1 2 3 4 5 6 7 8 9
50 1 2 3 4( 5 6 7 8 9en main)
35 6 7 0 1 2 3 4( 8 9en main)
18 5 6 7 0 1 2 3 4( 9en main)
fin de ligne ➜ 9 8 5 6 7 0 1 2 3 4
49 8 5 6 7 0( 1 2 3 4en main)
21 2 9 8 5 6 7 0( 3 4en main)
23 4 1 2 9 8 5 6 7 0
4 paires restent adjacentes:(3 4) (1 2) (5 6) (6 7)

Cas de test:

43 5 5 5 5 5 5 5 5
43 5 5 5 5 5 5 5 5
43 5 5 5 5 5 5 5 5

Production: fair


43 5 5 5 5 5 5 5 5
43 5 5 5 5 5 5 5 5
43 5 5 5 5 5 5 5

Production: weak


29 24
19 18
38 2 1 8 13 6 4
47 15 16 5 2 1 7
34 22 9 3
44 9 10 11 3 1 7
33 18 4 2 3 3

Production: fair


24 6 12 4
25 3 19
36 4 25 2
19 11 1 3
15 9 3
37 5 27

Production: weak


26 13
26 13
26 13
26 13

Production: trick


50 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

Production: weak


50 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
50 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

Production: trick


50 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
49 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

Production: fair

Exigences:

  • Si vous écrivez une fonction, elle peut soit lire à partir de l'entrée standard, soit recevoir l'entrée en tant que paramètre de chaîne unique. En outre, la fonction peut imprimer la sortie ou la renvoyer.
  • Le programme doit être exécutable sous Linux en utilisant un logiciel disponible gratuitement.
  • Le code source doit utiliser uniquement des caractères ASCII.
  • Pas de failles standard.
aditsu quitte parce que SE est MAL
la source
2
Pourquoi la restriction à ASCII? De nombreux langages (APL, code machine, TI-BASIC) n'utilisent pas du tout ASCII, vous les interdisez donc implicitement.
2015
@ThomasKwa Parce que je n'aime pas les problèmes associés à l'affichage et au comptage des caractères non ASCII. Certaines de ces langues ont des représentations ASCII ou des alternatives. Je pense que ce n'est pas une restriction très sévère, et cela nivelle légèrement le terrain de jeu.
aditsu quitte car SE est EVIL
Je pense qu'un système de notation comme "Les entrées qui n'utilisent que des caractères ASCII imprimables verront leur nombre d'octets multiplié par log (95) / log (256)" serait une meilleure option si vous souhaitez encourager de manière équitable les soumissions ASCII imprimables. Le raisonnement est que le contenu informatif des entrées avec le même score serait égal. Personnellement, je préférerais quand même un score simple en octets.
lirtosiast
@ThomasKwa Ok, qu'en est-il? Seuls les caractères Unicode imprimables, en comptant les octets dans le codage UTF-8
aditsu se ferme parce que SE est EVIL

Réponses:

4

CJam, 76 75 octets

52,qN/{[~](52\-@/(\e_@{/(@+\e_}/\+}/2ew::m2f/0-,_!\26>-"weak trick fair"S/=

Essayez-le en ligne dans l' interpréteur CJam .

Dennis
la source
5
LOL, "trout" :)
aditsu quitte car SE est EVIL
2

JavaScript, 292 289 octets

Cela pourrait probablement obtenir quelques octets supplémentaires, mais c'est un premier passage rapide pour l'instant:

d=[];for(i=0;i<52;i+=1)d[i]=i
s=prompt().split('\n')
s.forEach(function(e,i){s[i]=e.split(' ')
h=d.splice(-s[i][0],99)
for(j=1;j<s[i].length;j+=1)d.unshift.apply(d,h.splice(0,s[i][j]))
d.unshift.apply(d,h)})
for(c=0;i>1;i-=1)if(d[i-2]==d[i-1]-1)c+=1
alert(c<25?"fair":c<51?"weak":"trick")

EDIT: économisé 3 octets en réutilisant la valeur de ide la boucle de construction de deck lors du comptage du nombre de cartes adjacentes.

Sean Latham
la source