CSI: Minecraft Öğeleri


22

Minecraft 1.12 yarın serbest bırakılacak, kutlayalım!

Minecraft'ta bir şeyin öğelerinin sayısını temsil eden negatif olmayan bir tamsayıya giren kodu yazın . Oyuncular için daha yararlı bir şekilde çıkın, sandık, yığın ve N eşyasına eşittir. Formatı kullanın

XcYsZi

nerede

  • X N eşyalar ile tamamen doldurabileceğiniz sandık sayısıdır,
  • Y sandıkları doldurduktan sonra kalan eşyalarla doldurabileceğiniz yığın sayısıdır,
  • Z sandık ve yığınları doldurduktan sonra kalan madde sayısı.

Bunu not et:

  • 64 ürün bir yığına sığar. (16'ya yığın yapan ya da yığın yapmayan öğeleri görmezden geleceğiz.)
  • 27 adet yığın göğsüne oturdu. (Bunlar tek sandık, çift sandık değil.)

Bu yüzden Y26'dan büyükse veya Z63'ten büyükse hiç mantıklı olmaz .

Biçimlendirilmiş bir uyarı, bir şeyin sıfır olması durumunda, bu terimin yazdırılmamasıdır.

  • Bu nedenle, örneğin, Ysıfır Xve Zsıfır olmasaydı, biçim şöyle görünürdü XcZi.

  • Aynı şekilde eğer Yve Zsıfır ve were Xsıfırdan farklı, biçim olacaktır Xc.

  • Buradaki istisna, N sıfır olduğunda. Sonra 0iboş bir dize yerine çıktıdır.

Tüm N öğelerinin aynı türde olduğunu ve dolayısıyla istiflenebileceğini varsayabilirsiniz.

Üç sayıdan oluşan bir liste veya liste çıktısı alamazsınız. Kesin "csi" notasyonuna sahip bir dize vermelisiniz, bu sırada boşluk veya virgül içermez.

Başvuru için, burada tamamen madde yığınlarıyla dolu bir sandık:

Minecraft tek göğüs, 27 elmas yığını ile dolu

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

Bayt cinsinden en kısa kod kazanır.



33
Tamam görünüşe göre bu bir suç mahalli soruşturması
Okx


@Okx Başlığı okudum ve bir çeşit Clue / Cluedo şekli olacağını, ancak minecraft için olacağını düşündüm.
caird coinheringaahing

Şaşırtıcı olmayacak tüm konuşmalar ile @Okx. Şimdi bir tebeşir taslağını çizmek için bir zorluğa ihtiyacımız var - belki de bir sarmaşık olan
Chris H

Yanıtlar:


11

Jöle ,  26  24 bayt

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

Numarayı alan ve sonucu basan eksiksiz bir program.
Bana çok uzun geliyor ...

Çevrimiçi deneyin! veya test odasına bakın .

Nasıl?

güncellenmesi ...

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

Retina , 49 48 41 bayt

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

Çevrimiçi deneyin! TIO'yu aşırı yüklediğinde, sonuncusu dışındaki tüm test durumlarını içerir. Düzenleme: @ Martininder sayesinde 7 bayt kaydedildi. Açıklama:

.+
$*i

iS kullanarak giriş numarasını unary'e dönüştürün .

i{64}
s

64 öğe bir yığını dolduruyor.

s{27}
c

27 yığın bir göğsü dolduruyor.

(.)\1*
$.&$1

Göğüsleri, yığınları veya kalan öğeleri ondalık basamağa dönüştürün, ancak türü bir sonek olarak bırakın.

^$
0i

Girdi sıfırsa, sonucu yapın 0i.


Oh benim bu gerçekten unary'e dönüşüp yerine geçiyor mu?
Jonathan Allan,

@ JonathanathanAlan Bir açıklama ekledim (Daha önce özür dilerim zamanım yoktu). (Açıklamayı yazmak bana bir byte kaydetme fırsatı da verdi!)
Neil

2
Bu $.&gibi bir çoğaltma işleminden
Martin Ender

@MartinEnder Ah, doğrudan iyerine doğrudan dönüştürmeye değecek bir şey olup olmadığını merak ediyordum 1, ama bu sadeleştirmeyi göremedim, teşekkürler!
Neil

4

C #, 84 86 bayt

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

Satır içi çıkartmaya dikkat edin, bunun mümkün olduğunu anlamadı ama i--mantıklıydı, neden olmasıni-=10

Düzenle:

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

0 kenar durum ve öneri için.


1
+1. Ve birkaç byte golf _-=_/1728*1728yapmak _%=1728için değiştirebilirsiniz .
Kevin Cruijssen

Ayrıca, 0sonuçta ortaya çıkması gereken 0ive şu anda hiçbir şey çıkmayan kenar çantasını unuttun . Bir basit eklemek, _>0?...:"0i"bunu düzeltirdi.
Kevin Cruijssen

@KevinCruijssen Ahh, teşekkür ederim.
LiefdeWen

3
>_>Düzenlenen içinde +1
caird coinheringaahing


3

05AB1E , 24 bayt

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

Çevrimiçi deneyin!

açıklama

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

0Giriş durumunda nasıl çalışır ve diğer girişler olmasa da neden bu durum izleyen bir yeni satır basar?
Jonathan Allan,

@JonathanAllan: Hiçbir şey yazdırılmadıysa, 05AB1E uygulama sonunda yığının üstünü (newline ile birlikte) yazdırır. For-döngüler sonları listeleri ayırır ve elemanları yığına iter, böylece yazdırılmayan herhangi bir öğe yığına eklenir. 0Durumda döngünün sonunda 0iyığının üstünde olacak ( 0sve 0caltında olacak) ve yazdırılacaktır.
Emigna

3

C, 85 87 105 110 111 112 bayt

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

Burada dene .

Kod, negatif sayılar üzerinde bile düzgün çalışıyor. Artık sunucu OP blokları borçlusunuz!


İşlevler PPCG'de standart olarak kabul edilebilir
Beta Decay

3

JavaScript (ES6), 77 76 bayt

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

Test durumları



2

CJam , 31 bayt

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

Çevrimiçi deneyin!

açıklama

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 bayt

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

Pasaj:



1

Toplu İş, 347 335 283 246 234 202 199 191 189 bayt

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

Bir set/aifadede bölme ve modülü kullanabileceğinizi biliyorsunuz , değil mi?
Neil,

@Neil biliyorum, şu anda aynı şekilde çalışıyorum
stevefestl

@Neil Sadece bir sorunla karşılaşıyorum: if %c%==0 (set c=)else rembu kodlar bana " (setbeklenmez" veriyor
stevefestl

Huh, bu sadece c boşsa olur ...
Neil

1
JFTR benim çözümüm (aynı uzunlukta iki hafif farklı varyasyon) 122 bayta kadar.
Neil


0

Mathematica, 155 bayt

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 bayt

Giriş, önceden var olan t tablosunun a sütununda saklanır .

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

Okunabilirlik için satır sonları, toplam bayt sayılmaz. MS SQL Server 2012'de test edilmiştir.

DÜZENLEME 1: birden değiştirdi REPLACEüzere IIF5 bayt kaydedin. Final REPLACEhala gerekli çünkü STRcan sıkıcı şekilde boşlukları 10 karaktere kadar dolduruyor.

2 EDIT: adlandırılmış bir tabloda depolanan değerleri , SQL için onaylanmış giriş türünü kullanarak kurallara uyması düzeltildi . Bu maliyet için bayt FROMda gerektirir SELECTyerine PRINT. Gereksiz bir parens bırakarak 2 bayt kurtarıldı.


0

PowerShell, 113 Bayt

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

Bu, pek çok powershell'ın acı noktalarını çok kesin vuruyor.

[math]::Floor PS varsayılan olarak Bankacılar Yuvarlama yaptığı için bunun için gereklidir.

PS Ternary ayrıca diğer dillere nazaran bir bayt yükü alıyor, yapmamız gereken basit bir boş nezaket ( $a="This";$a?$a:"That"veya "This"?:"That") yapmak için(($a="This"),"That")[$a-ne$null]

o zaman hepsini iki kez kullanmamız ve ayrıca powershell'in varsayılan işlem sırası nedeniyle bazı yerlerde başka bir parantez grubu eklememiz gerekiyor.



Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.