CSI: Vật phẩm Minecraft


22

Minecraft 1.12 sẽ được phát hành vào ngày mai, vì vậy hãy ăn mừng!

Viết mã nhận số nguyên N không âm biểu thị số lượng vật phẩm trong Minecraft . Xuất nó theo cách hữu ích hơn cho người chơi, đưa ra số lượng rương, ngăn xếp và vật phẩm N tương đương. Sử dụng định dạng

XcYsZi

Ở đâu

  • X là số rương bạn hoàn toàn có thể điền vào N vật phẩm,
  • Y là số lượng ngăn xếp bạn có thể điền vào các vật phẩm còn lại sau khi điền vào rương,
  • Z nếu số lượng vật phẩm còn lại sau khi điền rương và ngăn xếp.

Lưu ý rằng:

  • 64 mặt hàng phù hợp trong một ngăn xếp. (Chúng tôi sẽ bỏ qua các mục xếp thành 16 hoặc không xếp chồng.)
  • 27 ngăn xếp vừa vặn trong một cái rương. (Đây là những rương đơn, không phải rương đôi.)

Vì vậy, nó sẽ không bao giờ có ý nghĩa nếu Ynhiều hơn 26 hoặc nếu Zhơn 63.

Một cảnh báo với định dạng là nếu không có gì đó, thuật ngữ đó không được in.

  • Vì vậy, ví dụ, nếu Ylà 0 XZkhác 0, định dạng sẽ như thế nào XcZi.

  • Tương tự như vậy nếu YZbằng không và Xkhác không, định dạng sẽ là Xc.

  • Ngoại lệ ở đây là khi N bằng không. Sau đó 0ilà đầu ra chứ không phải là một chuỗi rỗng.

Bạn có thể giả sử tất cả N mục cùng loại, do đó tất cả có thể xếp chồng lên nhau.

Bạn không thể xuất ra một danh sách hoặc bộ ba số. Bạn phải đưa ra một chuỗi với ký hiệu "csi" chính xác, theo thứ tự đó, không có dấu cách hoặc dấu phẩy.

Để tham khảo, đây là một cái rương chứa đầy các vật phẩm:

Rương đơn Minecraft chứa 27 ngăn kim cương

Tủ thử

in -> out
0 -> 0i
1 -> 1i
2 -> 2i
62 -> 62i
63 -> 63i
64 -> 1s
65 -> 1s1i
66 -> 1s2i
127 -> 1s63i
128 -> 2s
129 -> 2s1i
200 -> 3s8i
512 -> 8s
1337 -> 20s57i
1664 -> 26s
1727 -> 26s63i
1728 -> 1c
1729 -> 1c1i
1791 -> 1c63i
1792 -> 1c1s
1793 -> 1c1s1i
4096 -> 2c10s
5183 -> 2c26s63i
5184 -> 3c
5200 -> 3c16i
9999 -> 5c21s15i
385026 -> 222c22s2i
1000000000 -> 578703c19s

Mã ngắn nhất tính bằng byte thắng.



33
ok rõ ràng đây là một cuộc điều tra hiện trường vụ án
Okx


@Okx Tôi đã đọc tiêu đề và nghĩ rằng nó sẽ là một dạng Clue / Cluedo nhưng dành cho minecraft.
caird coinheringaahing

@Okx với tất cả các spinoffs sẽ không gây ngạc nhiên. Bây giờ chúng ta cần một thử thách với việc vẽ phác thảo phấn - có lẽ là một cây leo
Chris H

Câu trả lời:


11

Thạch ,  26  24 byte

d64d1¦27Fża¥“csi”Fḟ0ȯ⁾0i

Một chương trình đầy đủ lấy số và in kết quả.
Nó dường như quá dài đối với tôi ...

Hãy thử trực tuyến! hoặc xem bộ thử nghiệm .

Làm sao?

đang cập nhật ...

d64d1¦27Fża¥“csi”Fḟ0ȯ⁾0i - Main link: number n
 64                      - literal 64
d                        - divmod (whole divisions and remainder)
      27                 - literal 27
    1¦                   - apply to index 1 (the whole division from above)
   d                     - divmod
        F                - flatten into a single list (of three items i.e. [(n/64)/27, (n/64)%27, n%64]
            “csi”        - literal ['c','s','i']
           ¥             - last two links as a dyad:
         ż               -   zip
          a              -   logical and (any 0s in the divmod result become [0,0], others become [integer, character]
                 F       - flatten (from list of three lists to one list)
                  ḟ0     - filter discard zeros
                     ⁾0i - literal ['0','i']
                    ȯ    - logical or (non-vectorising)
                         - implicit print (smashed together representation, so [578703,'c',19,'i'] prints as 578703c19i)

7

Võng mạc , 49 48 41 byte

.+
$*i
i{64}
s
s{27}
c
(.)\1*
$.&$1
^$
0i

Hãy thử trực tuyến! Bao gồm tất cả các trường hợp thử nghiệm ngoại trừ trường hợp cuối cùng, trong trường hợp nó quá tải TIO. Chỉnh sửa: Đã lưu 7 byte nhờ @MartinEnder. Giải trình:

.+
$*i

Chuyển đổi số đầu vào thành unary bằng is.

i{64}
s

64 mục điền vào một ngăn xếp.

s{27}
c

27 ngăn xếp lấp đầy một rương.

(.)\1*
$.&$1

Chuyển đổi bất kỳ rương, ngăn xếp hoặc các mục còn lại thành số thập phân, nhưng để lại loại dưới dạng hậu tố.

^$
0i

Nếu đầu vào bằng không, tạo kết quả 0i.


Oh của tôi là điều này thực sự chuyển đổi sang unary sau đó thay thế?
Jonathan Allan

@Jonathan ALLan Tôi đã thêm một lời giải thích (tôi không có thời gian sớm hơn xin lỗi). (Viết lời giải thích cũng cho tôi cơ hội để tiết kiệm một byte!)
Neil

2
Bạn có thể tránh một số $.&trùng lặp như thế này: tio.run/##FYs9DsIwDIX3d46ASpGq2Ens5ARcAiEQYsjCQNmqnj21Lb9veD@/ tựa
Martin Ender

@MartinEnder Ah, tôi đã tự hỏi liệu nó có đáng để chuyển đổi trực tiếp sang ithay vì không 1, nhưng tôi không thể thấy sự đơn giản hóa đó, cảm ơn!
Neil

4

C #, 84 86 byte

_=>(_/1728>0?_/1728+"c":"")+((_-=_/1728*1728)/64>0?_/64+"s":"")+(_%64>0?_%64+"i":"")

Lưu ý phép trừ nội tuyến, không nhận ra điều đó là có thể nhưng i--có ý nghĩa vậy tại sao khôngi-=10

Chỉnh sửa:

_=>_>0?(_/1728>0?_/1728+"c":"")+((_%=1728)/64>0?_/64+"s":"")+(_%64>0?_%64+"i":""):"0i"

cho trường hợp 0 ​​cạnh và đề nghị.


1
+1. Và bạn có thể thay đổi _-=_/1728*1728để _%=1728đến sân một vài byte.
Kevin Cruijssen

Ngoài ra, bạn đã quên trường hợp cạnh 0, điều này sẽ dẫn đến 0ivà hiện không xuất ra gì. Thêm một cách đơn giản _>0?...:"0i"sẽ khắc phục điều này.
Kevin Cruijssen

@KevinCruijssen Ahh, cảm ơn bạn.
LiefdeWen

3
+1 cho >_>trong một chỉnh sửa
caird coinheringaahing


3

05AB1E , 24 byte

1728‰`64‰)˜…csiøvyJ¬0Êi?

Hãy thử trực tuyến!

Giải trình

1728‰                      # input divmod 1728 (64*27)
     `                     # split as separate with mod result on top of stack
      64‰                  # divmod 64
         )˜                # wrap stack in flattened list
           …csiø           # zip with the string "csi"
                vy         # for each
                  J        # join amount with storage-type
                   ¬0Êi    # if head != 0
                       ?   # print

Làm thế nào nó hoạt động trong 0trường hợp đầu vào, và tại sao điều đó cũng in một dòng mới trong khi các đầu vào khác không?
Jonathan Allan

@Jonathan ALLan: Nếu không có gì được in, 05AB1E ngầm in phần trên cùng của ngăn xếp khi kết thúc thực hiện (với dòng mới). Các vòng lặp For phá vỡ các danh sách và đẩy các phần tử vào ngăn xếp, do đó, bất kỳ mục nào không được in sẽ được thêm vào ngăn xếp. Ở cuối vòng lặp trong 0trường hợp 0isẽ ở trên cùng của ngăn xếp ( 0s0csẽ ở dưới nó) và sẽ được in.
Emigna

3

C, 85 87 105 110 111 112 byte

#define a(x,y)x?printf("%d%c",x,y+99):0;
f(z){a(z/1728,0)a(z%1728/64,16)!z+a(z%64,6)}

Hãy thử nó ở đây .

Mã thậm chí hoạt động đúng trên các số âm. Bây giờ bạn có thể nợ các khối máy chủ OP!


Các chức năng được chấp nhận theo tiêu chuẩn trên PPCG
Beta Decay

3

JavaScript (ES6), 77 76 byte

n=>[n+1,1728,64,1].map((v,i,a)=>(v=n%a[--i]/v|0)?v+'csi'[i]:'').join``||'0i'

Các trường hợp thử nghiệm



2

CJam , 31 byte

ri64md\27md@]"csi"]z{0=},"0i"e|

Hãy thử trực tuyến!

Giải trình

ri                               e# Read an int from input.
  64md                           e# Divmod by 64, gives total #stacks, #items.
      \27md                      e# Divmod total #stacks by 27, gives #chests, #stacks.
           @                     e# Bring #items back to top.
            ]                    e# Wrap in an array: [#chests, #stacks, #items]
             "csi"               e# Push "csi".
                  ]z             e# Zip with the other array.
                    {0=},        e# Filter out subarrays where the first element is 0.
                         "0i"e|  e# Logical or with "0i". An input of 0 gives an empty array
                                 e# from the rest of the program, in that case yield "0i"
                                 e# instead.

1

JavaScript (ES6) 71 byte

n=>[n/1728|0,(n/64|0)%27,n%64].map((a,i)=>a?a+'csi'[i]:'').join``||'0i'

Đoạn trích:



1

Mẻ, 347 335 283 246 234 202 199 191 189 byte

@set/al=%1,c=%1/1728,l-=c*1728,s=l/64,l-=s*64
@set c=%c%c
@set s=%s%s
@set i=%l%i
@if %c%==0c set c=
@if %s%==0s set s=
@if %i%==0i set i=
@if %c%%s%%i%.==. set i=0i
@echo(%c%%s%%i%

Bạn có biết bạn có thể sử dụng phép chia và mô đun trong một set/abiểu thức không?
Neil

@ Tôi biết, hiện tại tôi đang làm việc như vậy
stevefestl

@Neil Tôi vừa gặp phải một vấn đề: if %c%==0 (set c=)else remmã này mang lại cho tôi " (setkhông mong đợi"
stevefestl

Huh, điều đó chỉ xảy ra nếu c trống ...
Neil

1
JFTR giải pháp của tôi (hai biến thể hơi khác nhau có cùng độ dài) giảm xuống còn 122 byte.
Neil


0

Toán học, 155 byte

A=AppendTo;G={};P=Print;(z=Mod[t=Mod[#,1728],64];If[(x=⌊#/1728⌋)>0,A[G,{x,c}]];If[(y=⌊t/64⌋)>0,A[G,{y,s}]];If[z>0||#==0,A[G,{z,i}]];Row@Flatten@G)&


0

T-SQL, 139 134 139 byte

Đầu vào được lưu trữ trong cột a của bảng t có sẵn .

SELECT IIF(a=0,'0i',REPLACE(IIF(a<1728,'',STR(a/1728)+'c')
                           +IIF(a%1728<64,'',STR(a%1728/64)+'s')
                           +IIF(a%64=0,'',STR(a%64)+'i'),' ',''))FROM t

Ngắt dòng cho dễ đọc, không được tính bằng tổng byte. Đã thử nghiệm trên MS SQL Server 2012.

EDIT 1: Thay đổi nhiều REPLACEđể IIFtiết kiệm 5 byte. Cuối cùng REPLACEvẫn cần thiết bởi vì STRmiếng đệm khó chịu với không gian đến 10 ký tự.

EDIT 2: Đã sửa lỗi tuân theo các quy tắc bằng cách sử dụng loại đầu vào được phê duyệt cho SQL, các giá trị được lưu trữ trong một bảng được đặt tên . Điều này chi phí byte cho FROM, cũng yêu cầu SELECTthay vì PRINT. Đã phục hồi 2 byte bằng cách bỏ một parens không cần thiết.


0

PowerShell, 113 byte

param($i)("$(($c=[math]::floor($i/1728)))c","")[!$c]+("$(($s=[math]::floor(($i%1728)/64)))s","")[!$s]+"$($i%64)i"

Điều này đánh trúng một loạt các điểm đau của powershell rất chính xác.

[math]::Floor được yêu cầu cho điều này vì PS làm Bankers Rounding theo mặc định.

PS Ternary cũng chiếm một lượng byte so với các ngôn ngữ khác, để thực hiện một phép cộng hợp null đơn giản ( $a="This";$a?$a:"That"hoặc "This"?:"That") mà chúng ta cần phải làm(($a="This"),"That")[$a-ne$null]

sau đó chúng ta cần sử dụng tất cả hai lần này và cũng thêm vào một bộ dấu ngoặc khác ở một số nơi do thứ tự hoạt động mặc định của powershell.



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.