Gestion de la file d'attente du Black Friday

10

introduction

Vous êtes le responsable du département électronique dans un grand magasin de détail et le plus grand jour de vente de l'année est ce vendredi . Pour aider à gérer la foule, votre magasin met en place un système de ticket pour les plus grosses offres, où les clients doivent présenter un ticket avant d'acheter un article. Votre travail consiste à écrire un programme pour valider les billets.

Étant donné que le seul ordinateur disponible dans le magasin (en raison de réductions budgétaires) est un dinosaure avec un clavier cassé, (et tout ce que vous avez est des claviers USB, qui ne sont pas compatibles), vous devrez entrer votre programme avec une souris. Par conséquent, votre programme doit être aussi court que possible.

Des produits

Votre magasin exécute des ventes sur les cinq produits différents répertoriés ci-dessous. Chaque produit a un nom tout en minuscules et des règles différentes sur le nombre de produits pouvant être achetés et à quelle heure de la journée.

  • television: Des 5téléviseurs à écran plat en stock peuvent être achetés de 00:00:00(minuit) à 00:59:59.
  • smartphone: Il y a des 10smartphones en stock, mais tout client en ligne à partir de 00:00:00(minuit) 00:59:59reçoit un bon pour un une fois épuisé.
  • tablet: Il existe des 10tablettes qui peuvent être achetées à tout moment.
  • laptop: Il existe un nombre illimité d'ordinateurs portables qui peuvent être achetés de 00:00:00(minuit) à 07:59:59.
  • lightbulb: Il existe un nombre illimité d'ampoules qui peuvent être achetées à tout moment.

Contribution

Une chaîne de plusieurs lignes avec chaque ligne au format suivant. Les lignes sont triées par horodatage.

<time stamp> <product name> <ticket number>
  • Le numéro du ticket comporte 8 chiffres. Le dernier chiffre est un chiffre de contrôle égal à la somme des sept premiers chiffres modulo 10. Pour être valide, un numéro de ticket doit avoir le chiffre de contrôle correct et doit être strictement supérieur à tous les numéros de ticket précédents.
  • Le nom du produit est l'une des chaînes répertoriées ci-dessus.
  • L'horodatage est l'heure du jour dans le format HH:MM:SSHHsont les heures à deux chiffres de 00 à 23, MMet SSsont respectivement les minutes et les secondes à deux chiffres.

Production

La sortie est l'une des chaînes suivantes, avec une ligne par ticket. Les conditions doivent être appliquées dans l'ordre .

  1. Expired offer (S'applique aux téléviseurs, smartphones et ordinateurs portables.) L'horodatage du ticket est après la date limite d'achat du produit.
  2. Invalid ticket Soit le numéro du ticket est inférieur ou égal au numéro du ticket précédent, soit le chiffre de contrôle n'est pas valide.
  3. Give voucher (S'applique aux smartphones.) Le produit est en rupture de stock, mais tous les clients en ligne avant l'expiration de l'offre reçoivent un chèque de pluie.
  4. Out of stock(S'applique aux téléviseurs et tablettes.) Tout le produit a été vendu. Désolé, la quantité était limitée.
  5. AcceptedToutes les conditions sont remplies, alors donnez-leur le produit. Notez que seuls les billets acceptés réduisent le nombre d'articles en stock.

Exemple

Input                           Output
----------------------------    --------------
00:00:00 television 00010001    Accepted
00:00:25 smartphone 00011697    Accepted
00:01:25 laptop 00030238        Accepted
00:02:11 smartphone 00037291    Accepted
00:02:37 lightbulb 00073469     Invalid ticket
00:03:54 smartphone 00096319    Accepted
00:05:26 tablet 00152514        Accepted
00:06:21 tablet 00169893        Accepted
00:07:10 television 00190268    Accepted
00:07:47 smartphone 00194486    Accepted
00:07:55 tablet 00220071        Accepted
00:08:20 lightbulb 00321332     Accepted
00:10:01 smartphone 00409867    Accepted
00:11:10 tablet 00394210        Invalid ticket
00:11:46 television 00581060    Accepted
00:12:44 lightbulb 00606327     Accepted
00:13:16 tablet 00709253        Accepted
00:13:53 television 00801874    Accepted
00:14:47 laptop 00832058        Accepted
00:15:34 smartphone 00963682    Accepted
00:16:24 smartphone 01050275    Accepted
00:17:45 tablet 01117167        Accepted
00:18:05 laptop 01107548        Invalid ticket
00:19:00 lightbulb 01107605     Invalid ticket
00:19:47 lightbulb 01492983     Accepted
00:19:50 smartphone 01561609    Accepted
00:21:09 television 01567098    Accepted
00:21:42 laptop 01597046        Accepted
00:22:17 smartphone 01666313    Accepted
00:24:12 tablet 01924859        Accepted
00:24:12 smartphone 02151571    Accepted
00:25:38 smartphone 02428286    Give voucher
00:31:58 television 02435284    Out of stock
00:35:25 television 02435295    Out of stock
00:52:43 laptop 02657911        Invalid ticket
00:53:55 smartphone 02695990    Give voucher
01:08:19 tablet 02767103        Accepted
01:34:03 television 02834850    Expired offer
01:56:46 laptop 02896263        Accepted
02:02:41 smartphone 03028788    Expired offer
02:30:59 television 03142550    Expired offer
02:51:23 tablet 03428805        Accepted
03:14:57 smartphone 03602315    Expired offer
03:27:12 television 03739585    Expired offer
03:56:52 smartphone 03997615    Expired offer
04:07:52 tablet 04149301        Accepted
04:12:05 lightbulb 04300460     Invalid ticket
04:24:21 laptop 04389172        Accepted
04:40:23 lightbulb 04814175     Accepted
04:40:55 tablet 04817853        Accepted
04:42:18 smartphone 04927332    Expired offer
05:06:43 tablet 05079393        Out of stock
05:16:48 tablet 05513150        Out of stock
05:33:02 television 05760312    Expired offer
05:43:32 tablet 06037905        Out of stock
06:12:48 smartphone 06440172    Expired offer
06:35:25 laptop 06507277        Accepted
06:42:29 lightbulb 06586255     Invalid ticket
06:55:31 lightbulb 06905583     Accepted
06:55:33 lightbulb 06905583     Invalid ticket
07:40:05 smartphone 07428006    Expired offer
07:49:12 television 07588086    Expired offer
08:14:56 laptop 08111865        Expired offer

J'ai essayé de faire en sorte que l'exemple couvre tous les scénarios de sortie possibles, mais veuillez laisser un commentaire si quelque chose n'est pas clair.

Il s'agit de , vous pouvez écrire un programme ou une fonction, et les trous de boucle standard ne sont pas autorisés.

intrépide
la source

Réponses:

5

Javascript (ES6), 396 433 419 octets

h=0;f=1/0;i={television:{c:5,s:0,e:1},smartphone:{c:10,s:0,e:1,v:1},tablet:{c:10,s:0,e:24},laptop:{c:f,s:0,e:8},lightbulb:{c:f,s:0,e:24}};while(1){t=prompt().split(' ');a=t[0];r=a[0]+a[1]-0;o=i[t[1]];m=0;z='Accepted';u=t[2]-0;u<=h||(u-u%10+'').split('').reduce((p,c)=>-(-p-c))%10!=u%10?m='Invalid ticket':0;r<o.s||r>=o.e?m='Expired offer':0;if(!m)o.c?o.c--:(o.v?z='Give voucher':m='Out of stock');!m?h=u:0;alert(m?m:z)}

Modifier: taille réduite en utilisant la fonction de grande flèche es6

Plus lisible:

h=0
f=1/0
i={television:{c:5,s:0,e:1},smartphone:{c:10,s:0,e:1,v:1},tablet:{c:10,s:0,e:24},laptop:{c:f,s:0,e:8},lightbulb:{c:f,s:0,e:24}}
while(1){t=prompt().split(' ')
a=t[0]
r=a[0]+a[1]-0
o=i[t[1]]
m=0
z='Accepted'
u=t[2]
if(u<=h||(u-u%10+'').split('').reduce(function(p,c){return-(-p-c)})%10!=u%10)m='Invalid ticket'
if(r<o.s||r>=o.e)m='Expired offer'
if(!m){if(o.c)o.c--
else o.v?z='Give voucher':m='Out of stock'}if(!m)h=u
alert(m?m:z)}

Fait intéressant, le code plus long est plus rapide: http://jsperf.com/compare-read

GUI avec la même logique:

var app = angular.module('app', []);

app.controller('MainCtrl', function MainCtrl ($scope) {
  $scope.items = {
    television: {c: 5, s:0, e: 1},
    smartphone: {c: 10, s:0, e: 1},
    tablet: {c:10, s:0, e: 24},
    laptop: {c:Infinity, s: 0, e: 8},
    lightbulb: {c: Infinity, s: 0, e: 24},
  };
  
  var h = -1;//highest
  
  $scope.hours_offset = 0;
  
  $scope.ticket = {};
  for (var i = 0; i < 8; i++) $scope.ticket[i] = 0;
  
  $scope.selected_item = -1;
  
  $scope.nums = new Array(10);
  
  $scope.history = [];
  
  $scope.buy = function() {
    
  }
  $scope.selectItem = function($i) {
    $scope.selected_item = $i;
  }
  
  $scope.purchase = function() {
    if ($scope.selected_item === -1)
      return;

    var ticnum = '';
    var msg = 'Accepted';
    
    for(var key in $scope.ticket)
      ticnum+=$scope.ticket[key];
    
    var d = new Date();
    
    //Variable declarations to setup for code like the code I designed for console
    r = d.getHours()-$scope.hours_offset;//hour
    o = $scope.items[$scope.selected_item];//item
    m = 0//msg
    z = 'Accepted'//default_msg
    u=ticnum
    
    //This is copied from my console code
    if(ticnum<=h||(ticnum-ticnum%10+'').split('').reduce(function(p,c){return-(-p-c)})%10!=ticnum%10)m='Invalid ticket'
	if(r<o.s||r>=o.e)m='Expired offer'
	if(!m){if(o.c)o.c--
	else o.v?z='Give voucher':m='Out of stock'}if(!m)h=ticnum
	
    msg = m?m:z;
    
    $scope.history.unshift({
      time: time(d),
      item: $scope.selected_item,
      ticket_num: ticnum,
      message: msg
    });
    
  }
});

function time(date) {
  return padToTwo(date.getHours()) + ':' + padToTwo(date.getMinutes()) + ':' + padToTwo(date.getSeconds());
}
    
function padToTwo(number) {
  return number = ("00"+number).slice(-2);
}
#parent {
  width: 100vw;
  height: 100vh;
  
  padding-bottom: 25vh;
}
#parent > div {
  padding-top: 25vh;
  
  -webkit-display: flex;
  display: flex;
  
  -webkit-flex-direction: row;
  flex-direction: row;
  
  -webkit-align-items: flex-start;
  align-items: flex-start;
  -webkit-justify-content: center;
  justify-content: center;
}

#items {
  width: 15vw;
  min-width: 110px;
  margin-right: 4vw;
  background-color: #222223;
  color: #eeeeef;
  border-radius: 4px;
  border: 2px solid black;
}

#items > span {
  box-sizing: border-box;
  display: block;
  padding: 5px;
  
  -webkit-transition: .2s background-color ease-in-out;
  transition: .2s background-color ease-in-out;
  
  text-align: center;
  
  width: 100%;
  
  border-radius: 4px;
}
#items > span:hover, #ticket p:hover {
  background-color: gray;
}
#items > span.selected, #ticket p.selected {
  background-color: #999999;
}
#ticket {
  -webkit-display: flex;
  display: flex;
  
  -webkit-flex-direction: row;
  flex-direction: row;
  
  margin-right: 4vw;
  
  color: #eeeeef;
}

#ticket p {
  margin: 1px;
  padding: 3px;
  width: 20px;
  text-align: center;
  background-color: #22222f;
  border: 2px solid black;
  border-radius: 3px;
}

#purchase {
  padding: 15px;
  padding-top: 6px;
  padding-bottom: 6px;
  
  background-color: #22222f;
  border: 2px solid black;
  border-radius: 3px;
  color: #eeeeef;
}
#purchase:active {
  background-color: gray;
}

#error {
  margin-top: 15px;
  color: red;
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.js"></script>
<div id="parent" ng-app="app" ng-controller="MainCtrl">
  For testing hours-offset (If it's 6:00 setting this to 18 would simulate it being midnight): <input ng-model="hours_offset" type="number"></input>
  <div>
    <div id="items">
      <span ng-attr-class="{{selected_item===name ? 'selected' : ''}}" ng-repeat="(name, obj) in ::items track by $index" ng-click="selectItem(name)">{{::name}}<br></span>
    </div>
    <div id="ticket">
      <span ng-repeat="(ticket_index, val) in ::ticket">
        <p ng-attr-class="{{ticket[ticket_index]===$index ? 'selected' : ''}}" ng-repeat="nothing in ::nums track by $index" ng-click="ticket[ticket_index] = $index">{{::$index}}</p>
      </span>
    </div>
    <span id="purchase" ng-click="purchase()">Purchase</span>
  </div>
  <div id="error">{{error_msg}}</div>
  <table id="output">
    <tr ng-repeat="item in history track by $index">
      <td ng-repeat="(key, value) in item track by $index">{{value}}</td>
    </tr>
  </span>
</div>

csga5000
la source
Bienvenue chez PPCG. Bien que votre interface graphique soit quelque chose, le but du code golf est d'écrire le programme le plus court possible. Puisque vous utilisez JavaScript, vous pouvez prendre la chaîne d'entrée comme paramètre de fonction et renvoyer la sortie. Vous devez également supprimer les espaces inutiles et raccourcir les noms de variables. Pourquoi ne regardez-vous pas d'autres questions pour avoir une idée du fonctionnement du site?
intrepidcoder
@intrepidcoder Bien sûr, vous réduirez le code par la suite! Mais d'après le scénario, il me semble que la console serait inefficace sans clavier!
csga5000
1
Selon les règles décrites dans notre centre d'aide , ce message est hors sujet dans son état actuel. Toutes les solutions aux défis doivent: [...] être un concurrent sérieux pour les critères gagnants utilisés. Par exemple, une entrée à un concours de golf de code doit être jouée [.]
Dennis
C'était une justification absurde pour la longueur de code courte et n'avait rien à voir avec le problème réel. La taille combinée de vos trois programmes est de 4,51 Ko. Si vous n'essayez pas de le réduire, votre message sera probablement supprimé.
intrepidcoder
@intrepidcoder Oh oui! J'ai oublié ça, il y avait beaucoup de contraintes xD. Quand vous dites le dernier chiffre, vous voulez dire le MSB ou le LSB? Je devine le LSB mais je veux en être sûr.
csga5000