CSI: Item Minecraft

22

Minecraft 1.12 akan dirilis besok, jadi mari kita rayakan!

Tulis kode yang menggunakan bilangan bulat non-negatif yang mewakili jumlah item dari sesuatu di Minecraft . Keluarkan dengan cara yang lebih bermanfaat bagi para pemain, memberikan jumlah peti, tumpukan, dan item yang setara dengan N. Gunakan format

XcYsZi

dimana

  • X adalah jumlah peti yang bisa kamu isi sepenuhnya dengan N item,
  • Y adalah jumlah tumpukan yang bisa kamu isi dengan barang yang tersisa setelah mengisi peti,
  • Z jika jumlah barang yang tersisa setelah mengisi peti dan tumpukan.

Perhatikan bahwa:

  • 64 item dimuat dalam tumpukan. (Kami akan mengabaikan item yang menumpuk hingga 16 atau tidak menumpuk.)
  • 27 tumpukan pas di peti. (Ini adalah peti tunggal, bukan peti ganda.)

Jadi tidak akan masuk akal jika Ylebih dari 26 atau jika Zlebih dari 63.

Peringatan dengan format adalah bahwa jika ada nol sesuatu, istilah itu tidak dicetak.

  • Jadi, misalnya, jika Ynol dan Xdan Zbukan nol, formatnya akan terlihat seperti XcZi.

  • Demikian juga jika Ydan Znol dan Xbukan nol, formatnya akan Xc.

  • Pengecualian di sini adalah ketika N adalah nol. Maka 0iadalah output daripada string kosong.

Anda dapat mengasumsikan semua item N dari jenis yang sama, maka semuanya dapat ditumpuk.

Anda tidak boleh menampilkan daftar atau tupel dari tiga angka. Anda harus memberikan string dengan notasi "csi" yang tepat, dalam urutan itu, tanpa spasi atau koma.

Untuk referensi, inilah peti yang penuh dengan tumpukan barang:

Dada tunggal Minecraft dipenuhi 27 tumpukan berlian

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

Kode terpendek dalam byte menang.

Hobi Calvin
sumber
1
Terkait
Leaky Nun
33
ok ternyata ini adalah investigasi TKP
Okx
1
Terkait
Martin Ender
@Okx Saya membaca judul dan berpikir itu akan menjadi semacam Clue / Cluedo tetapi untuk minecraft.
caird coinheringaahing
@ OKx dengan semua spin-off yang tidak akan mengejutkan. Sekarang kita perlu tantangan dengan menggambar garis besar kapur - mungkin menjalar
Chris H

Jawaban:

11

Jelly ,  26  24 byte

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

Program lengkap mengambil nomor dan mencetak hasilnya.
Rasanya terlalu lama bagi saya ...

Cobalah online! atau lihat test suite .

Bagaimana?

memperbarui ...

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)
Jonathan Allan
sumber
7

Retina , 49 48 41 byte

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

Cobalah online! Termasuk semua test case kecuali yang terakhir, jika TIO kelebihan beban. Sunting: Disimpan 7 byte berkat @MartinEnder. Penjelasan:

.+
$*i

Ubah nomor input menjadi unary menggunakan is.

i{64}
s

64 item mengisi satu tumpukan.

s{27}
c

27 tumpukan mengisi satu peti.

(.)\1*
$.&$1

Konversikan peti, tumpukan, atau item yang tersisa menjadi desimal, tetapi biarkan tipe tersebut sebagai akhiran.

^$
0i

Jika inputnya nol, buat hasilnya 0i.

Neil
sumber
Ya ampun, ini benar-benar mengkonversi ke unary kemudian mengganti?
Jonathan Allan
@JonathanAllan Saya telah menambahkan penjelasan (saya tidak punya waktu sebelumnya, maaf). (Menulis penjelasan memberi saya kesempatan untuk menyimpan byte juga!)
Neil
2
Anda dapat menghindari $.&duplikasi seperti ini: tio.run/##FYs9DsIwDIX3d46ASpGq2Ens5ARcAiEQYsjCQNmqnj21Lb9veD@/…
Martin Ender
@ MartinEnder Ah, saya bertanya-tanya apakah akan ada gunanya mengkonversi langsung ke ibukan 1, tapi saya tidak bisa melihat penyederhanaan itu, terima kasih!
Neil
4

C #, 84 86 byte

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

Perhatikan pengurangan inline, tidak menyadari itu mungkin tetapi i--masuk akal jadi mengapa tidaki-=10

Edit:

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

untuk 0 tepi case dan saran.

LiefdeWen
sumber
1
+1. Dan Anda dapat mengubah _-=_/1728*1728untuk _%=1728golf beberapa byte.
Kevin Cruijssen
Juga, Anda lupa tentang kasing tepi 0, yang seharusnya menghasilkan 0idan saat ini tidak menghasilkan apa-apa. Menambahkan hanya _>0?...:"0i"akan memperbaiki ini.
Kevin Cruijssen
@KevinCruijssen Ahh, terima kasih.
LiefdeWen
3
+1 untuk >_>yang sudah diedit
caird coinheringaahing
3

Python 3 , 87 byte

lambda n:g(n//1728,"c")+g(n//64%27,"s")+g(n%64,"i")or"0i"
g=lambda n,s:(str(n)+s)*(n>0)

Cobalah online!

Biarawati Bocor
sumber
Dalam Python 2 ini bisa disingkat menjadi 82 byte, menggunakan divisi sederhana ( / bukan //) dan menggunakan operator backtick alih-alihstr(...)
Gábor Fekete
3

05AB1E , 24 byte

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

Cobalah online!

Penjelasan

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
Emigna
sumber
Bagaimana cara kerjanya dalam 0kasus input, dan mengapa itu juga mencetak baris tambahan sementara input lainnya tidak?
Jonathan Allan
@ JonathanAllan: Jika tidak ada yang dicetak, 05AB1E secara implisit mencetak bagian atas tumpukan pada akhir eksekusi (dengan baris baru). Daftar for-loop terpisah dan dorong elemen ke stack, sehingga item apa pun yang tidak dicetak akan ditambahkan ke stack. Pada akhir lingkaran dalam 0kasing 0iakan berada di atas tumpukan ( 0sdan 0cakan di bawahnya) dan akan dicetak.
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)}

Coba di sini .

Kode tersebut bahkan berfungsi dengan baik pada angka negatif. Anda sekarang dapat berhutang blok OP server!

Keyu Gan
sumber
Fungsi dapat diterima sebagai standar pada 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'

Uji kasus

Arnauld
sumber
2

Java 8, 86 byte

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

Coba di sini.

Kevin Cruijssen
sumber
2

CJam , 31 byte

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

Cobalah online!

Penjelasan

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.
Kucing Bisnis
sumber
1

JavaScript (ES6) 71 byte

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

Potongan:

Rick Hitchcock
sumber
1

Python 2 , 82 byte

Saya mengubah komentar Gabor Fekete dari atas menjadi contoh yang berfungsi:

lambda n:g(n/1728,"c")+g(n/64%27,"s")+g(n%64,"i")or"0i"
g=lambda n,s:(`n`+s)*(n>0)

Cobalah online!

Andrew U Baker
sumber
1

Batch, 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%
stevefestl
sumber
Anda tahu Anda bisa menggunakan pembagian dan modulus dalam set/aekspresi, bukan?
Neil,
@Neil Saya tahu, saya bekerja dengan cara yang sama sekarang
stevefestl
@Neil Saya hanya mengalami masalah: if %c%==0 (set c=)else remkode ini memberi saya " (settidak diharapkan"
stevefestl
Huh, itu hanya akan terjadi jika c kosong ...
Neil
1
JFTR solusi saya (dua variasi yang sedikit berbeda dengan panjang yang sama) turun ke 122 byte.
Neil,
0

Braingolf , 71 byte

V"isc"R#@!%>93*!*,>,>!/!*,>,$_-,>,>,/<$_<&,!?_v@R:>|!?_v@R:>|!?_v@R:>|;

Cobalah online!

Sama sekali tidak golfy, tetapi berhasil

Skidsdev
sumber
0

Mathematica, 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)&
J42161217
sumber
0

PHP , 84 byte

<?=($c=($a=$argn)/1728^0)?$c.c:"",($s=$a/64%27)?$s.s:"",($i=$a%64)||$c+$s<1?$m.i:"";

Cobalah online!

PHP , 93 byte

$i-=64*$s=($i-=1728*$c=($i=$argn)/1728^0)/64^0;echo$c?$c.c:"",$s?$s.s:"",$i||$c+$s<1?$i.i:"";

Cobalah online!

Jörg Hülsermann
sumber
0

T-SQL, 139 134 139 byte

Input disimpan dalam kolom a dari tabel yang sudah ada t .

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

Jeda baris untuk keterbacaan, tidak dihitung dalam total byte. Diuji pada MS SQL Server 2012.

EDIT 1: Berubah beberapa REPLACEuntuk IIFmenyelamatkan 5 byte. Final REPLACEmasih diperlukan karena STRbantalan menjengkelkan dengan ruang hingga 10 karakter.

EDIT 2: Tetap mengikuti aturan dengan menggunakan tipe input yang disetujui untuk SQL, nilai yang disimpan dalam tabel bernama . Ini byte biaya untuk FROM, juga membutuhkan SELECTbukan PRINT. Dipulihkan 2 byte dengan menjatuhkan parens yang tidak perlu.

BradC
sumber
0

PowerShell, 113 Bytes

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

Ini menyentuh banyak titik sakit PowerShell dengan sangat tepat.

[math]::Floor diperlukan untuk ini karena PS melakukan Rounding Bankir secara default.

PS Ternary juga memakan banyak byte dibandingkan dengan bahasa lain, untuk melakukan null coallescence sederhana ( $a="This";$a?$a:"That"atau "This"?:"That") yang perlu kita lakukan(($a="This"),"That")[$a-ne$null]

maka kita perlu menggunakan semua ini dua kali, dan juga menambahkan satu lagi tanda kurung di beberapa tempat karena perintah operasi standar powershell.

colsw
sumber
0

Python 2 , 77 byte

lambda n:''.join(`k`+c for k,c in zip([n/1728,n/64%27,n%64],'csi')if k)or'0i'

Cobalah online!

Tidak
sumber
0

dc , 76 byte

?dddsf[1728/n99P]sc1728/0<c1728%ddd[64/n115P]si64/0<i[64%n105P]sy64%0<ylf0=y

Cobalah online!

R. Kap
sumber