Manajemen Antrian Jumat Hitam

10

pengantar

Anda adalah manajer departemen elektronik di sebuah toko ritel besar dan hari penjualan terbesar tahun ini adalah hari Jumat ini . Untuk membantu mengelola keramaian, toko Anda menerapkan sistem tiket untuk transaksi terbesar, di mana pelanggan harus menunjukkan tiket sebelum membeli barang. Tugas Anda adalah menulis program untuk memvalidasi tiket.

Karena satu-satunya komputer yang tersedia di toko (karena pemotongan anggaran) adalah dinosaurus dengan keyboard yang rusak, (dan semua yang Anda miliki adalah keyboard USB, yang tidak kompatibel) Anda harus memasukkan program Anda dengan mouse. Karena itu, program Anda harus sesingkat mungkin.

Produk

Anda toko menjalankan penjualan pada lima produk berbeda yang tercantum di bawah ini. Setiap produk memiliki nama semua huruf kecil dan aturan yang berbeda tentang berapa banyak yang dapat dibeli dan pada jam berapa.

  • television: Ada 5televisi layar datar dalam stok yang dapat dibeli dari 00:00:00(tengah malam) hingga 00:59:59.
  • smartphone: Ada 10stok smartphone, tetapi setiap pelanggan yang mengantri dari 00:00:00(tengah malam) 00:59:59menerima voucher untuk satu kali mereka kehabisan.
  • tablet: Ada 10tablet yang dapat dibeli kapan saja.
  • laptop: Ada laptop dalam jumlah tidak terbatas yang dapat dibeli dari 00:00:00(tengah malam) hingga 07:59:59.
  • lightbulb: Ada jumlah lampu yang tidak terbatas yang dapat dibeli kapan saja.

Memasukkan

String multi-baris dengan setiap baris dalam format berikut. Garis diurutkan berdasarkan cap waktu.

<time stamp> <product name> <ticket number>
  • Nomor tiket adalah 8 digit. Digit terakhir adalah digit-periksa yang sama dengan jumlah dari tujuh digit modulo 10. Untuk valid, nomor tiket harus memiliki digit-periksa yang benar dan harus benar-benar lebih besar daripada semua nomor tiket sebelumnya.
  • Nama produk adalah salah satu string yang tercantum di atas.
  • Cap waktu adalah waktu dalam format di HH:MM:SSmana HHjam dua digit dari 00-23, MMdan SSmerupakan menit dua digit dan kedua masing-masing.

Keluaran

Outputnya adalah salah satu dari string berikut, dengan satu baris per tiket. Ketentuan harus diterapkan secara berurutan .

  1. Expired offer (Berlaku untuk televisi, telepon pintar, dan laptop.) Batas waktu tiket adalah setelah batas waktu untuk membeli produk.
  2. Invalid ticket Entah nomor tiket kurang dari atau sama dengan jumlah tiket sebelumnya, atau digit-cek tidak valid.
  3. Give voucher (Berlaku untuk smartphone.) Produk kehabisan stok, tetapi semua pelanggan yang antri sebelum penawaran berakhir mendapatkan cek hujan.
  4. Out of stock(Berlaku untuk televisi dan tablet.) Semua produk telah terjual. Maaf, jumlahnya terbatas.
  5. AcceptedSemua persyaratan terpenuhi, jadi berikan mereka produknya. Perhatikan bahwa hanya tiket yang diterima yang mengurangi jumlah item dalam persediaan.

Contoh

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

Saya telah mencoba membuat contoh mencakup setiap skenario keluaran yang mungkin, tetapi silakan tinggalkan komentar jika ada yang tidak jelas.

Ini adalah , Anda dapat menulis sebuah program atau fungsi, dan lubang loop standar tidak diizinkan.

intrepidcoder
sumber

Jawaban:

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

Sunting: Ukuran dikurangi dengan menggunakan fungsi panah besar ES6

Lebih mudah dibaca:

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

Menariknya, kode yang lebih panjang lebih cepat: http://jsperf.com/compare-read

GUI dengan logika yang sama:

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
sumber
Selamat datang di PPCG. Sementara GUI Anda adalah sesuatu, objek kode golf adalah menulis program sesingkat mungkin. Karena Anda menggunakan JavaScript, Anda bisa menggunakan string input sebagai parameter fungsi dan mengembalikan hasilnya. Anda juga harus menghapus spasi kosong yang tidak perlu dan mempersingkat nama variabel. Mengapa Anda tidak melihat beberapa pertanyaan lain untuk mendapatkan ide tentang bagaimana situs ini bekerja?
intrepidcoder
@intrepidcoder Tentu saja Anda akan mengecilkan kode setelahnya! Tetapi berdasarkan skenario sepertinya bagi saya konsol tidak akan efektif tanpa keyboard!
csga5000
1
Sesuai aturan yang diuraikan di pusat bantuan kami , pos ini berada di luar topik dalam kondisi saat ini. Semua solusi untuk tantangan harus: [...] Menjadi pesaing serius untuk kriteria kemenangan yang digunakan. Misalnya, entri ke kontes kode golf harus di-golf [.]
Dennis
Itu rasional tidak masuk akal untuk panjang kode pendek dan tidak ada hubungannya dengan masalah yang sebenarnya. Ukuran gabungan dari tiga program Anda adalah 4,51 KB. Jika Anda tidak mencoba membuatnya lebih kecil, postingan Anda mungkin akan dihapus.
intrepidcoder
@intrepidcoder Oh ya! Saya lupa tentang itu, ada banyak kendala xD. Ketika Anda mengatakan angka terakhir, apakah maksud Anda MSB atau LSB? Saya menduga LSB tetapi saya ingin memastikan.
csga5000