Gestión de la cola del viernes negro

10

Introducción

Usted es el gerente del departamento de electrónica en una importante tienda minorista y el día de ventas más importante del año es este viernes . Para ayudar a administrar las multitudes, su tienda está implementando un sistema de boletos para las mayores ofertas, donde los clientes deben presentar un boleto antes de comprar un artículo. Su trabajo es escribir un programa para validar los boletos.

Dado que la única computadora disponible en la tienda (debido a recortes presupuestarios) es un dinosaurio con un teclado roto, (y todo lo que tiene son teclados USB, que no son compatibles) tendrá que ingresar su programa con un mouse. Por lo tanto, su programa debe ser lo más breve posible.

Productos

Su tienda está ejecutando ventas en los cinco productos diferentes enumerados a continuación. Cada producto tiene un nombre en minúsculas y reglas diferentes sobre cuántos se pueden comprar y a qué hora del día.

  • television: Hay 5televisores de pantalla plana en stock que se pueden comprar desde 00:00:00(medianoche) hasta 00:59:59.
  • smartphone: Hay 10teléfonos inteligentes en stock, pero cualquier cliente en línea desde 00:00:00(medianoche) para 00:59:59recibir un cupón por uno una vez que se agota.
  • tablet: Hay 10tabletas que se pueden comprar en cualquier momento.
  • laptop: Hay un número ilimitado de computadoras portátiles que se pueden comprar desde 00:00:00(medianoche) hasta 07:59:59.
  • lightbulb: Hay un número ilimitado de bombillas que se pueden comprar en cualquier momento.

Entrada

Una cadena de varias líneas con cada línea en el siguiente formato. Las líneas se ordenan por la marca de tiempo.

<time stamp> <product name> <ticket number>
  • El número de boleto tiene 8 dígitos. El último dígito es un dígito de verificación igual a la suma de los primeros siete dígitos del módulo 10. Para ser válido, un número de boleto debe tener el dígito de verificación correcto y debe ser estrictamente mayor que todos los números de boleto anteriores.
  • El nombre del producto es una de las cadenas enumeradas anteriormente.
  • La marca de tiempo es la hora del día en el formato HH:MM:SSdonde HHestá la hora de dos dígitos de 00-23, MMy SSson los minutos y segundos de dos dígitos respectivamente.

Salida

La salida es una de las siguientes cadenas, con una línea por boleto. Las condiciones deben aplicarse en orden .

  1. Expired offer (Se aplica a televisores, teléfonos inteligentes y computadoras portátiles). La marca de tiempo del boleto es posterior al corte para comprar el producto.
  2. Invalid ticket O el número de boleto es menor o igual que el número del boleto anterior, o el dígito de verificación no es válido.
  3. Give voucher (Se aplica a los teléfonos inteligentes). El producto está agotado, pero todos los clientes en línea antes de que expire la oferta reciben un cheque de lluvia.
  4. Out of stock(Se aplica a televisores y tabletas). Se ha vendido todo el producto. Lo sentimos, la cantidad fue limitada.
  5. AcceptedSe cumplen todas las condiciones, así que entrégueles el producto. Tenga en cuenta que solo los boletos aceptados reducen la cantidad de artículos en stock.

Ejemplo

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

Intenté hacer que el ejemplo abarque todos los escenarios de salida posibles, pero deje un comentario si algo no está claro.

Este es el , puede escribir un programa o función, y los agujeros de bucle estándar no están permitidos.

codificador intrépido
fuente

Respuestas:

5

Javascript (ES6), 396 433 419 bytes

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)}

Editar: tamaño reducido usando la función de flecha grande es6

Más legible:

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)}

Curiosamente, el código más largo es más rápido: http://jsperf.com/compare-read

GUI con la misma lógica:

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
fuente
Bienvenido a PPCG. Si bien su GUI es algo, el objetivo del código golf es escribir el programa más corto posible. Como está utilizando JavaScript, puede tomar la cadena de entrada como parámetro de función y devolver la salida. También debe eliminar espacios en blanco innecesarios y acortar nombres de variables. ¿Por qué no mira otras preguntas para tener una idea de cómo funciona el sitio?
intrepidcoder
@intrepidcoder ¡Por supuesto que luego minificarías el código! ¡Pero según el escenario, me parecería que la consola sería ineficaz sin un teclado!
csga5000
1
Según las reglas descritas en nuestro centro de ayuda , esta publicación está fuera de tema en su estado actual. Todas las soluciones a los desafíos deben: [...] Ser un contendiente serio para los criterios ganadores en uso. Por ejemplo, una entrada a un concurso de golf de código debe ser golfizada [.]
Dennis
Eso era un absurdo racional para la longitud del código corto y no tenía nada que ver con el problema real. El tamaño combinado de sus tres programas es de 4.51 KB. Si no intenta hacerlo más pequeño, su publicación probablemente se eliminará.
intrepidcoder
@intrepidcoder ¡Oh, sí! Me olvidé de eso, había muchas restricciones xD. Cuando dices último dígito, ¿te refieres al MSB o al LSB? Estoy adivinando el LSB pero deseo estar seguro.
csga5000