CSI: รายการ Minecraft


22

Minecraft 1.12จะวางจำหน่ายในวันพรุ่งนี้ดังนั้นเรามาฉลองกัน!

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

XcYsZi

ที่ไหน

  • X คือจำนวนหีบสมบัติที่คุณสามารถเติมให้สมบูรณ์ได้ด้วย N รายการ
  • Y คือจำนวนของสแต็คที่คุณสามารถเติมด้วยไอเท็มที่เหลือหลังจากเติมหีบ
  • Z หากจำนวนรายการที่เหลือหลังจากกรอกหีบและกอง

โปรดทราบว่า:

  • 64 รายการพอดีในสแต็ก (เราจะเพิกเฉยรายการที่ซ้อนกันถึง 16 หรือไม่ซ้อนกัน)
  • 27 กองพอดีในหน้าอก (นี่คือหีบเดี่ยวไม่ใช่หีบคู่)

ดังนั้นจะไม่มีเหตุผลถ้าYมากกว่า 26 หรือZมากกว่า 63

ข้อแม้ที่มีรูปแบบคือหากไม่มีสิ่งใดเป็นศูนย์คำนั้นจะไม่ถูกพิมพ์

  • ดังนั้นสำหรับตัวอย่างเช่นถ้าYเป็นศูนย์Xและไม่ใช่ศูนย์รูปแบบจะมีลักษณะอย่างไรZXcZi

  • ในทำนองเดียวกันถ้าYและZเป็นศูนย์และไม่ใช่ศูนย์รูปแบบจะเป็นXXc

  • ข้อยกเว้นที่นี่คือเมื่อ N เป็นศูนย์ จากนั้น0iเป็นผลลัพธ์แทนที่จะเป็นสตริงว่าง

คุณสามารถสมมติว่ารายการ N ทั้งหมดเป็นประเภทเดียวกันจึงสามารถวางซ้อนกันได้ทั้งหมด

คุณไม่สามารถส่งออกรายการหรือทูเปิลของตัวเลขสามตัว คุณต้องให้สตริงพร้อมสัญกรณ์ "csi" ที่แน่นอนตามลำดับโดยไม่มีช่องว่างหรือเครื่องหมายจุลภาค

สำหรับการอ้างอิงนี่เป็นหีบที่เต็มไปด้วยไอเทมทั้งหมด:

Minecraft ข้างเดียวเต็มไปด้วยเพชร 27 กอง

Testcases

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

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ



33
ตกลงเห็นได้ชัดว่านี่คือการสอบสวนที่เกิดเหตุ
Okx


@Okx ฉันอ่านชื่อและคิดว่ามันจะเป็นรูปแบบของ Clue / Cluedo แต่สำหรับ minecraft
caird coinheringaahing

@ อ็อกซ์กับสปินดาวน์ทั้งหมดที่ไม่น่าแปลกใจ ตอนนี้เราต้องการความท้าทายด้วยการวาดโครงร่างชอล์

คำตอบ:


11

เจลลี่ ,  26  24 ไบต์

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

โปรแกรมเต็มรูปแบบรับหมายเลขและพิมพ์ผลลัพธ์
ดูเหมือนจะนานเกินไปสำหรับฉัน ...

ลองออนไลน์! หรือดูชุดทดสอบ

อย่างไร?

ปรับปรุง ...

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

เรติน่า , 49 48 41 ไบต์

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

ลองออนไลน์! รวมถึงกรณีทดสอบทั้งหมดยกเว้นกรณีสุดท้ายในกรณีที่ TIO โอเวอร์โหลด แก้ไข: บันทึกแล้ว 7 ไบต์ด้วย @MartinEnder คำอธิบาย:

.+
$*i

แปลงหมายเลขอินพุทเป็น unary โดยใช้is

i{64}
s

64 รายการเติมหนึ่งสแต็ก

s{27}
c

27 กองเติมหนึ่งหน้าอก

(.)\1*
$.&$1

แปลงทรวงอกสแต็คหรือรายการที่เหลือเป็นทศนิยม แต่ปล่อยให้พิมพ์เป็นคำต่อท้าย

^$
0i

0iถ้าใส่เป็นศูนย์ให้ผล


โอ้นี่คือการแปลงเป็น unary จริงๆแล้วแทนที่?
Jonathan Allan

@JonathanAllan ฉันได้เพิ่มคำอธิบาย (ฉันไม่ได้มีเวลาขออภัยก่อนหน้านี้) (การเขียนคำอธิบายทำให้ฉันมีโอกาสบันทึกไบต์ด้วย!)
Neil

2
คุณสามารถหลีกเลี่ยงการ$.&ทำซ้ำบางอย่างเช่นนี้: tio.run/##FYs9DsIwDIX3d46ASpGq2Ens5ARcAiEQYsjCQNmqnj21Lb9veD@/…
Martin Ender

@ มาร์ตินเอนเดอร์ฉันสงสัยว่ามันจะคุ้มค่าที่จะเปลี่ยนโดยตรงiแทนที่จะเป็น1แต่ฉันไม่เห็นความเรียบง่ายนั้นขอบคุณ!
Neil

4

C #, 84 86 ไบต์

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

สังเกตว่าการลบแบบอินไลน์ไม่ได้ตระหนักว่ามันเป็นไปได้ แต่i--ก็สมเหตุสมผลแล้วทำไมไม่ทำเช่นนั้นi-=10

แก้ไข:

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

สำหรับกรณีขอบ 0 และข้อเสนอแนะ


1
+1 และคุณสามารถเปลี่ยน_-=_/1728*1728เพื่อ_%=1728การกอล์ฟไม่กี่ไบต์
Kevin Cruijssen

นอกจากนี้คุณลืมเกี่ยวกับกรณีขอบ0ซึ่งควรส่งผลให้0iและกำลังออกอะไร การเพิ่มเพียงแค่_>0?...:"0i"จะแก้ไขปัญหานี้
Kevin Cruijssen

@KevinCruijssen Ahh ขอบคุณ
LiefdeWen

3
+1 สำหรับ>_>ในหนึ่งที่ถูกแก้ไข
caird coinheringaahing


3

05AB1E , 24 ไบต์

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

ลองออนไลน์!

คำอธิบาย

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

มันทำงานอย่างไรใน0กรณีอินพุตและทำไมมันถึงพิมพ์บรรทัดใหม่ที่ตามมาในขณะที่อินพุตอื่นไม่ทำงาน
Jonathan Allan

@JonathanAllan: หากไม่มีสิ่งใดพิมพ์ 05AB1E จะพิมพ์ส่วนบนสุดของสแต็กเมื่อสิ้นสุดการเรียกใช้งาน (ด้วย newline) For-loops break รายการแยกออกจากกันและผลักองค์ประกอบไปยังสแต็คดังนั้นรายการใด ๆ ที่ไม่ได้พิมพ์จะถูกเพิ่มลงในสแต็ก ในตอนท้ายของลูปใน0กรณี0iจะอยู่ด้านบนของสแต็ค ( 0sและ0cจะอยู่ภายใต้มัน) และจะถูกพิมพ์
Emigna

3

C, 85 87 105 110 111 112 ไบต์

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

ลองมันนี่

รหัสยังทำงานอย่างถูกต้องกับจำนวนลบ ตอนนี้คุณอาจติดค้างบล็อก OP เซิร์ฟเวอร์!


ฟังก์ชั่นได้รับการยอมรับตามมาตรฐานใน PPCG
Beta Decay

3

JavaScript (ES6), 77 76 ไบต์

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

กรณีทดสอบ



2

CJam , 31 ไบต์

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

ลองออนไลน์!

คำอธิบาย

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 ไบต์

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

ตัวอย่างข้อมูล:



1

แบตช์, 347 335 283 246 234 202 199 191 189 ไบต์

@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%

คุณรู้หรือไม่ว่าคุณสามารถใช้การหารและโมดูลัสในการset/aแสดงออกใช่มั้ย
Neil

@Neil ฉันรู้ว่าฉันกำลังทำงานในลักษณะเดียวกันตอนนี้
stevefestl

@ ไม่มีฉันเพิ่งพบปัญหา: if %c%==0 (set c=)else remรหัสนี้ให้ฉัน " (setไม่คาด"
stevefestl

นั่นจะเกิดขึ้นได้ก็ต่อเมื่อคว่าง ...
Neil

1
JFTR โซลูชันของฉัน (สองรูปแบบที่แตกต่างกันเล็กน้อยที่มีความยาวเท่ากัน) ลดลงเป็น 122 ไบต์
นีล


0

Mathematica, 155 ไบต์

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 ไบต์

การป้อนข้อมูลจะถูกเก็บไว้ในคอลัมน์ของที่มีอยู่ก่อนตารางที

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

การขึ้นบรรทัดใหม่เพื่อให้สามารถอ่านได้ไม่นับรวมเป็นไบต์ ทดสอบบน MS SQL Server 2012

แก้ไข 1:การเปลี่ยนแปลงหลาย ๆREPLACEเพื่อIIFที่จะบันทึก 5 ไบต์ สุดท้ายREPLACEยังคงมีความจำเป็นเพราะSTRแผ่นรองน่ารำคาญที่มีช่องว่างถึง 10 ตัวอักษร

แก้ไข 2:คงต้องปฏิบัติตามกฎโดยใช้ประเภทการป้อนข้อมูลได้รับการอนุมัติสำหรับ SQL, ค่าเก็บไว้ในตารางชื่อ ค่าใช้จ่ายนี้ไบต์สำหรับFROMยังต้องแทนSELECT PRINTกู้คืน 2 ไบต์โดยวาง parens ที่ไม่จำเป็น


0

PowerShell, 113 ไบต์

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

สิ่งนี้กระทบกับความเจ็บปวดหลายจุดของพาวเวอร์เซลล์อย่างแม่นยำ

[math]::Floor จำเป็นสำหรับสิ่งนี้เนื่องจาก PS ทำการปัดเศษของธนาคารโดยค่าเริ่มต้น

PS Ternary ใช้โหลดไบต์เมื่อเทียบกับภาษาอื่น ๆ เพื่อทำ coallescence แบบง่าย ๆ ( $a="This";$a?$a:"That"หรือ"This"?:"That") ที่เราต้องทำ(($a="This"),"That")[$a-ne$null]

จากนั้นเราจำเป็นต้องใช้ทั้งหมดนี้สองครั้งและเพิ่มในชุดของวงเล็บอื่นในบางสถานที่เนื่องจากคำสั่งการดำเนินการเริ่มต้นของ PowerShell



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.