검은 금요일 대기열 관리


10

소개

귀하는 주요 소매점의 전자 부서 관리자이며 올해 가장 큰 판매 일은 이번 주 금요일 입니다. 군중을 관리하기 위해 상점은 고객이 품목을 구매하기 전에 티켓을 제시해야하는 가장 큰 거래에 대한 티켓 시스템을 구현하고 있습니다. 당신의 임무는 티켓을 확인하는 프로그램을 작성하는 것입니다.

상점에서 사용할 수있는 유일한 컴퓨터 (예산 삭감으로 인해)는 키보드가 깨진 공룡이며 호환되지 않는 USB 키보드 만 있으면 프로그램을 마우스로 입력해야합니다. 따라서 프로그램은 가능한 짧아야합니다.

제품

아래 나열된 다섯 가지 제품에서 매장을 판매하고 있습니다. 각 제품에는 모두 소문자 이름이 있으며 구매할 수있는 제품 수와 시간에 대한 규칙이 다릅니다.

  • television: (자정)에서까지 5구입할 수있는 평면 TV 재고가 있습니다 .00:00:0000: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 자리입니다. 마지막 숫자는 첫 번째 7 자리 모듈러스 10의 합과 같은 검사 숫자입니다. 유효하려면 티켓 번호가 올바른 검사 숫자를 가져야하며 이전의 모든 티켓 숫자보다 엄격해야합니다.
  • 제품 이름은 위에 나열된 문자열 중 하나입니다.
  • 타임 스탬프의 형식에서 시간 인 HH:MM:SS곳에 HH00-23에서 두 자리 시간이고, MM그리고 SS제 각각 두자리 분이다.

산출

출력은 티켓 당 한 줄로 다음 문자열 중 하나입니다. 조건은 순서대로 적용해야합니다 .

  1. Expired offer (텔레비전, 스마트 폰 및 랩톱에 적용됩니다.) 티켓의 타임 스탬프는 제품 구매 마감 시간 이후입니다.
  2. Invalid ticket 티켓 번호가 이전 티켓의 번호보다 작거나 같거나 확인 번호가 유효하지 않습니다.
  3. Give voucher (스마트 폰에 적용됩니다.) 제품 재고가 없지만 오퍼가 만료되기 전에 모든 고객이 레인 체크를받습니다.
  4. Out of stock(TV 및 태블릿에 적용됩니다.) 모든 제품이 판매되었습니다. 수량이 한정되어 죄송합니다.
  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

자바 스크립트 (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.51KB입니다. 더 작게 만들지 않으면 게시물이 삭제 될 수 있습니다.
intrepidcoder

@intrepidcoder 아 그래! 나는 그것을 잊어 버렸습니다 .xD에는 많은 제약이있었습니다. 마지막 자리를 말할 때 MSB 또는 LSB를 의미합니까? LSB를 추측하고 있지만 확신하고 싶습니다.
csga5000
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.