Black Friday Queue Management

10

Einführung

Sie sind der Leiter der Elektronikabteilung in einem großen Einzelhandelsgeschäft und der größte Verkaufstag des Jahres ist dieser Freitag . Um die Menschenmenge besser verwalten zu können, implementiert Ihr Geschäft ein Ticketsystem für die größten Angebote, bei dem Kunden vor dem Kauf eines Artikels ein Ticket vorlegen müssen. Ihre Aufgabe ist es, ein Programm zur Validierung der Tickets zu schreiben.

Da der einzige verfügbare Computer im Geschäft (aufgrund von Budgetkürzungen) ein Dinosaurier mit einer kaputten Tastatur ist (und Sie nur USB-Tastaturen haben, die nicht kompatibel sind), müssen Sie Ihr Programm mit einer Maus eingeben. Daher sollte Ihr Programm so kurz wie möglich sein.

Produkte

In Ihrem Geschäft werden die fünf unten aufgeführten Produkte verkauft. Jedes Produkt hat einen Namen in Kleinbuchstaben und unterschiedliche Regeln, wie viele zu welcher Tageszeit gekauft werden können.

  • television: Es sind 5Flachbildfernseher auf Lager, die von 00:00:00(Mitternacht) bis (Mitternacht) gekauft werden können 00:59:59.
  • smartphone: Es sind 10Smartphones auf Lager, aber jeder Kunde, der ab 00:00:00(Mitternacht) in der Schlange steht , 00:59:59erhält einen Gutschein für einen, sobald er aufgebraucht ist.
  • tablet: Es gibt 10Tablets, die jederzeit gekauft werden können.
  • laptop: Es gibt eine unbegrenzte Anzahl von Laptops, die von 00:00:00(Mitternacht) bis gekauft werden können 07:59:59.
  • lightbulb: Es gibt eine unbegrenzte Anzahl von Glühbirnen, die jederzeit gekauft werden können.

Eingang

Eine mehrzeilige Zeichenfolge mit jeder Zeile im folgenden Format. Zeilen werden nach dem Zeitstempel sortiert.

<time stamp> <product name> <ticket number>
  • Die Ticketnummer ist 8-stellig. Die letzte Ziffer ist eine Prüfziffer, die der Summe der ersten sieben Ziffern Modulo 10 entspricht. Um gültig zu sein, muss eine Ticketnummer die richtige Prüfziffer haben und streng größer sein als alle vorherigen Ticketnummern.
  • Der Produktname ist eine der oben aufgeführten Zeichenfolgen.
  • Der Zeitstempel ist die Tageszeit in dem Format, HH:MM:SSin dem HHdie zweistellige Stunde von 00 bis 23 MMund SSdie zweistellige Minute bzw. Sekunde angegeben sind.

Ausgabe

Die Ausgabe ist eine der folgenden Zeichenfolgen mit einer Zeile pro Ticket. Die Bedingungen müssen in der richtigen Reihenfolge angewendet werden .

  1. Expired offer (Gilt für Fernseher, Smartphones und Laptops.) Der Zeitstempel des Tickets ist nach dem Stichtag für den Kauf des Produkts.
  2. Invalid ticket Entweder ist die Ticketnummer kleiner oder gleich der Nummer des vorherigen Tickets oder die Prüfziffer ist ungültig.
  3. Give voucher (Gilt für Smartphones.) Das Produkt ist nicht vorrätig, aber alle Kunden, die vor Ablauf des Angebots in der Schlange stehen, erhalten einen Regenscheck.
  4. Out of stock(Gilt für Fernseher und Tablets.) Das gesamte Produkt wurde verkauft. Entschuldigung, die Menge war begrenzt.
  5. AcceptedAlle Bedingungen sind erfüllt, geben Sie ihnen das Produkt. Beachten Sie, dass nur akzeptierte Tickets die Anzahl der Artikel auf Lager reduzieren.

Beispiel

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

Ich habe versucht, das Beispiel für jedes mögliche Ausgabeszenario zu erstellen, aber bitte hinterlassen Sie einen Kommentar, wenn etwas unklar ist.

Dies ist , Sie können ein Programm oder eine Funktion schreiben, und Standard-Lücken sind nicht zulässig.

unerschrockener Codierer
quelle

Antworten:

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

Bearbeiten: Reduzierte Größe durch Verwendung der Funktion Es6 Big Arrow

Besser lesbar:

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

Interessanterweise ist der längere Code schneller: http://jsperf.com/compare-read

GUI mit der gleichen Logik:

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
quelle
Willkommen bei PPCG. Während Ihre GUI etwas ist, besteht das Ziel von Code Golf darin, das kürzestmögliche Programm zu schreiben. Da Sie JavaScript verwenden, können Sie die Eingabezeichenfolge als Funktionsparameter verwenden und die Ausgabe zurückgeben. Sie sollten auch unnötige Leerzeichen entfernen und Variablennamen kürzen. Warum schauen Sie sich nicht einige andere Fragen an, um eine Vorstellung davon zu bekommen, wie die Website funktioniert?
intrepidcoder
@intrepidcoder Natürlich würden Sie den Code danach minimieren! Aber basierend auf dem Szenario scheint mir die Konsole ohne Tastatur unwirksam zu sein!
csga5000
1
Gemäß den in unserer Hilfe aufgeführten Regeln ist dieser Beitrag in seinem aktuellen Status nicht zum Thema. Alle Lösungen für Herausforderungen sollten: [...] ein ernstzunehmender Anwärter auf die verwendeten Gewinnkriterien sein. Zum Beispiel muss ein Eintrag zu einem Code-Golf-Wettbewerb [.]
Dennis
Das war eine absurde Begründung für die kurze Codelänge und hatte nichts mit dem eigentlichen Problem zu tun. Die kombinierte Größe Ihrer drei Programme beträgt 4,51 KB. Wenn Sie nicht versuchen, es zu verkleinern, wird Ihr Beitrag wahrscheinlich gelöscht.
intrepidcoder
@intrepidcoder Oh ja! Ich habe das vergessen, es gab viele Einschränkungen xD. Wenn Sie die letzte Ziffer sagen, meinen Sie damit das MSB oder das LSB? Ich vermute das LSB, aber ich möchte sicher sein.
csga5000