การจัดการคิวในวัน Black Friday


10

บทนำ

คุณเป็นผู้จัดการแผนกอิเล็กทรอนิกส์ในร้านค้าปลีกรายใหญ่และวันขายที่ยิ่งใหญ่ที่สุดของปีคือวันศุกร์นี้ เพื่อช่วยจัดการฝูงชนร้านค้าของคุณกำลังใช้ระบบตั๋วสำหรับข้อเสนอที่ใหญ่ที่สุดซึ่งลูกค้าจะต้องแสดงตั๋วก่อนซื้อรายการ งานของคุณคือการเขียนโปรแกรมเพื่อตรวจสอบตั๋ว

เนื่องจากคอมพิวเตอร์เพียงเครื่องเดียวที่มีอยู่ในร้าน (เนื่องจากการตัดงบประมาณ) เป็นไดโนเสาร์ที่มีแป้นพิมพ์หัก (และสิ่งที่คุณมีคือคีย์บอร์ด USB ซึ่งไม่สามารถใช้งานได้) คุณจะต้องป้อนโปรแกรมด้วยเมาส์ ดังนั้นโปรแกรมของคุณควรสั้นที่สุด

ผลิตภัณฑ์

ร้านค้าของคุณกำลังเปิดขายในห้าผลิตภัณฑ์ที่แตกต่างกันตามรายการด้านล่าง แต่ละผลิตภัณฑ์มีชื่อที่เป็นตัวพิมพ์เล็กทั้งหมดและกฎที่แตกต่างกันเกี่ยวกับจำนวนที่สามารถซื้อได้

  • television: มี5โทรทัศน์จอแบนในสต็อกที่อาจจะซื้อมาจาก00:00:00(เที่ยงคืน) 00:59:59เพื่อ
  • smartphone: มี10สมาร์ทโฟนอยู่ในสต็อก แต่ลูกค้าที่อยู่ในสายจาก00:00:00(เที่ยงคืน) จะ00:59:59ได้รับบัตรกำนัลหนึ่งใบเมื่อหมด
  • tablet: มี10แท็บเล็ตที่สามารถซื้อได้ตลอดเวลา
  • laptop: มีไม่ จำกัด จำนวนของแล็ปท็อปที่อาจจะซื้อมาจากมี00:00:00(เที่ยงคืน) 07:59:59เพื่อ
  • lightbulb: มีหลอดไฟไม่ จำกัด จำนวนที่สามารถซื้อได้ทุกเวลา

อินพุต

สตริงหลายบรรทัดที่มีแต่ละบรรทัดในรูปแบบต่อไปนี้ เส้นถูกเรียงตามการประทับเวลา

<time stamp> <product name> <ticket number>
  • หมายเลขตั๋วยาว 8 หลัก ตัวเลขสุดท้ายคือตัวเลขเช็คเท่ากับผลรวมของเจ็ดหลักแรกโมดูโล 10 เพื่อให้ถูกต้องหมายเลขตั๋วจะต้องมีหมายเลขเช็คที่ถูกต้องและจะต้องมากกว่าหมายเลขตั๋วก่อนหน้าทั้งหมดอย่างเคร่งครัด
  • ชื่อผลิตภัณฑ์เป็นหนึ่งในสตริงที่ระบุไว้ข้างต้น
  • การประทับเวลาคือเวลาของวันในรูปแบบHH:MM:SSที่HHเป็นชั่วโมงสองหลักจาก 00-23 และMMและSSเป็นนาทีสองหลักและวินาทีตามลำดับ

เอาท์พุต

เอาต์พุตเป็นหนึ่งในสตริงต่อไปนี้โดยมีหนึ่งบรรทัดต่อตั๋ว เงื่อนไขต้องนำไปใช้ในการสั่งซื้อ

  1. Expired offer (นำไปใช้กับโทรทัศน์สมาร์ทโฟนและแล็ปท็อป) การประทับเวลาของตั๋วอยู่หลังจากตัดการซื้อผลิตภัณฑ์
  2. Invalid ticket หมายเลขตั๋วมีจำนวนน้อยกว่าหรือเท่ากับจำนวนตั๋วก่อนหน้าหรือเช็คหลักไม่ถูกต้อง
  3. Give voucher (ใช้กับสมาร์ทโฟน) ผลิตภัณฑ์หมด แต่ลูกค้าทุกรายในสายก่อนที่ข้อเสนอหมดอายุจะได้รับเช็คฝน
  4. Out of stock(นำไปใช้กับโทรทัศน์และแท็บเล็ต) ผลิตภัณฑ์ทั้งหมดมีจำหน่ายแล้ว ขออภัยปริมาณมี จำกัด
  5. Acceptedเป็นไปตามเงื่อนไขทั้งหมดดังนั้นให้ผลิตภัณฑ์แก่พวกเขา โปรดทราบว่าเฉพาะตั๋วที่ยอมรับเท่านั้นลดจำนวนสินค้าในสต็อก

ตัวอย่าง

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

ฉันได้ลองทำตัวอย่างครอบคลุมทุกสถานการณ์ผลลัพธ์ที่เป็นไปได้ แต่โปรดแสดงความคิดเห็นหากมีสิ่งใดไม่ชัดเจน

นี่คือคุณอาจเขียนโปรแกรมหรือฟังก์ชั่นและไม่อนุญาตให้ใช้วงลูปมาตรฐาน

คำตอบ:


5

Javascript (ES6), 396 433 419 ไบต์

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

แก้ไข:ลดขนาดโดยใช้ฟังก์ชั่นลูกศรขนาดใหญ่ es6

อ่านเพิ่มเติมได้:

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

รหัสที่ยาวกว่านั้นน่าสนใจเร็วกว่า: http://jsperf.com/compare-read

GUI พร้อมตรรกะเดียวกัน:

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>


ยินดีต้อนรับสู่ PPCG ในขณะที่ GUI ของคุณเป็นสิ่งที่วัตถุประสงค์ของการเขียนโค้ดคือการเขียนโปรแกรมที่สั้นที่สุด เนื่องจากคุณใช้ JavaScript คุณสามารถใช้สตริงป้อนเข้าเป็นพารามิเตอร์ฟังก์ชันและส่งคืนเอาต์พุต คุณควรลบช่องว่างที่ไม่จำเป็นออกและทำให้ชื่อตัวแปรสั้นลง ทำไมคุณไม่ลองดูคำถามอื่น ๆ เพื่อหาแนวคิดในการทำงานของเว็บไซต์?
intrepidcoder

@intrepidcoder แน่นอนคุณจะย่อขนาดโค้ดในภายหลัง! แต่ตามสถานการณ์มันดูเหมือนว่าคอนโซลฉันจะไม่มีประสิทธิภาพหากไม่มีแป้นพิมพ์!
csga5000

1
ตามกฎที่ระบุไว้ในศูนย์ช่วยเหลือของเราโพสต์นี้จะปิดหัวข้อในสถานะปัจจุบัน โซลูชั่นสำหรับความท้าทายทั้งหมดควร: [... ] เป็นคู่แข่งที่ร้ายแรงสำหรับเกณฑ์การชนะที่ใช้งาน ตัวอย่างเช่นรายการการแข่งขันกอล์ฟรหัสจะต้องมีการตีกอล์ฟ [.]
Dennis

นั่นเป็นเหตุผลที่ไร้สาระสำหรับความยาวรหัสสั้น ๆและไม่มีอะไรเกี่ยวข้องกับปัญหาจริง ขนาดรวมของโปรแกรมสามโปรแกรมของคุณคือ 4.51 KB หากคุณไม่พยายามทำให้มันเล็กลงโพสต์ของคุณอาจถูกลบ
intrepidcoder

@intrepidcoder โอ้ใช่แล้ว! ฉันลืมไปเลยว่ามีข้อ จำกัด มากมาย xD เมื่อคุณพูดตัวเลขสุดท้ายคุณหมายถึง MSB หรือ LSB หรือไม่ ฉันคาดเดา LSB แต่ฉันหวังว่าจะแน่ใจ
csga5000
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.