Quản lý xếp hàng Thứ Sáu Đen


10

Giới thiệu

Bạn là quản lý của bộ phận điện tử trong một cửa hàng bán lẻ lớn và ngày bán hàng lớn nhất trong năm là thứ Sáu này . Để giúp quản lý đám đông, cửa hàng của bạn đang triển khai hệ thống vé cho các giao dịch lớn nhất, nơi khách hàng phải xuất trình vé trước khi mua một mặt hàng. Công việc của bạn là viết một chương trình để xác nhận vé.

Vì máy tính duy nhất có sẵn trong cửa hàng (do cắt giảm ngân sách) là một con khủng long với bàn phím bị hỏng, (và tất cả những gì bạn có là bàn phím USB, không tương thích), bạn sẽ phải nhập chương trình của mình bằng chuột. Do đó, chương trình của bạn nên càng ngắn càng tốt.

Các sản phẩm

Cửa hàng của bạn đang chạy doanh số trên năm sản phẩm khác nhau được liệt kê dưới đây. Mỗi sản phẩm có một tên viết thường và các quy tắc khác nhau về số lượng có thể được mua và vào thời gian nào trong ngày.

  • television: Có 5TV màn hình phẳng trong kho có thể được mua từ 00:00:00(nửa đêm) đến 00:59:59.
  • smartphone: Có 10điện thoại thông minh trong kho, nhưng bất kỳ khách hàng nào xếp hàng từ 00:00:00(nửa đêm) để 00:59:59nhận phiếu mua hàng cho một khi họ hết hàng.
  • tablet: Có những 10máy tính bảng có thể được mua bất cứ lúc nào.
  • laptop: Có số lượng máy tính xách tay không giới hạn có thể được mua từ 00:00:00(nửa đêm) đến 07:59:59.
  • lightbulb: Có số lượng bóng đèn không giới hạn có thể được mua bất cứ lúc nào.

Đầu vào

Một chuỗi nhiều dòng với mỗi dòng theo định dạng sau. Các dòng được sắp xếp theo dấu thời gian.

<time stamp> <product name> <ticket number>
  • Số vé dài 8 chữ số. Chữ số cuối cùng là một chữ số kiểm tra bằng tổng của bảy chữ số đầu tiên modulo 10. Để hợp lệ, một số vé phải có chữ số kiểm tra chính xác và phải lớn hơn tất cả các số vé trước đó.
  • Tên sản phẩm là một trong những chuỗi được liệt kê ở trên.
  • Con tem thời gian là thời gian trong ngày ở định dạng HH:MM:SSHHlà giờ hai chữ số 00-23, và MMSSlà những phút có hai chữ số và thứ hai tương ứng.

Đầu ra

Đầu ra là một trong các chuỗi sau, với một dòng trên mỗi vé. Các điều kiện phải được áp dụng theo thứ tự .

  1. Expired offer (Áp dụng cho TV, điện thoại thông minh và máy tính xách tay.) Dấu thời gian của vé là sau khi cắt để mua sản phẩm.
  2. Invalid ticket Số vé nhỏ hơn hoặc bằng số vé trước đó hoặc số kiểm tra không hợp lệ.
  3. Give voucher (Áp dụng cho điện thoại thông minh.) Sản phẩm đã hết hàng, nhưng tất cả các khách hàng xếp hàng trước khi ưu đãi hết hạn đều được kiểm tra mưa.
  4. Out of stock(Áp dụng cho TV và máy tính bảng.) Tất cả sản phẩm đã được bán. Xin lỗi, số lượng có hạn.
  5. AcceptedTất cả các điều kiện được đáp ứng, vì vậy cung cấp cho họ các sản phẩm. Lưu ý rằng chỉ có vé được chấp nhận làm giảm số lượng mặt hàng trong kho.

Thí dụ

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

Tôi đã cố gắng làm cho ví dụ bao gồm mọi kịch bản đầu ra có thể, nhưng vui lòng để lại nhận xét nếu có gì không rõ ràng.

Đây là , bạn có thể viết chương trình hoặc chức năng và các lỗ lặp tiêu chuẩn không được phép.

Câu trả lời:


5

Javascript (ES6), 396 433 419 byte

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

Chỉnh sửa: Giảm kích thước bằng cách sử dụng chức năng mũi tên lớn es6

Dễ đọc hơn:

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

Điều thú vị là mã dài hơn nhanh hơn: http://jsperf.com/compare-read

GUI có cùng logic:

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>


Chào mừng đến với PPCG. Trong khi GUI của bạn là một cái gì đó, đối tượng của mã golf là viết chương trình ngắn nhất có thể. Vì bạn đang sử dụng JavaScript, bạn có thể lấy chuỗi đầu vào làm tham số hàm và trả về đầu ra. Bạn cũng nên loại bỏ khoảng trắng không cần thiết và rút ngắn tên biến. Tại sao bạn không xem xét một số câu hỏi khác để có ý tưởng về cách trang web hoạt động?
intrepidcoder

@intrepidcoder Tất nhiên sau đó bạn sẽ thu nhỏ mã! Nhưng dựa trên kịch bản, có vẻ như giao diện điều khiển đối với tôi sẽ không hiệu quả nếu không có bàn phím!
csga5000

1
Theo các quy tắc được nêu trong trung tâm trợ giúp của chúng tôi , bài đăng này không có chủ đề ở trạng thái hiện tại. Tất cả các giải pháp cho các thách thức nên: [...] Hãy là một ứng cử viên nặng ký cho các tiêu chí chiến thắng được sử dụng. Ví dụ: một mục tham gia một cuộc thi golf mã cần phải được đánh gôn [.]
Dennis

Đó là một lý do vô lý cho độ dài mã ngắn và không liên quan gì đến vấn đề thực tế. Kích thước kết hợp của ba chương trình của bạn là 4,51 KB. Nếu bạn không cố gắng làm cho nó nhỏ hơn, bài viết của bạn có thể sẽ bị xóa.
intrepidcoder

@intrepidcoder ơi! Tôi quên mất điều đó, có rất nhiều ràng buộc xD. Khi bạn nói chữ số cuối cùng, bạn có nghĩa là MSB hay LSB? Tôi đoán LSB nhưng tôi muốn chắc chắn.
csga5000
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.