CSI: Itens do Minecraft

22

Minecraft 1.12 será lançado amanhã, então vamos comemorar!

Escreva um código que receba um número inteiro não negativo N que represente o número de itens de algo no Minecraft . Produza-o de uma maneira mais útil aos jogadores, fornecendo o número de baús, pilhas e itens N equivalentes. Use o formato

XcYsZi

Onde

  • X é o número de baús que você pode preencher completamente com N itens,
  • Y é o número de pilhas que você pode preencher com os itens restantes depois de encher baús,
  • Z se o número de itens restantes após o preenchimento de baús e pilhas.

Observe que:

  • 64 itens cabem em uma pilha. Ignoraremos os itens que empilham para 16 ou não empilham.
  • 27 pilhas cabem em um baú. (Estes são baús simples, não duplos.)

Portanto, nunca faria sentido se Yfosse superior a 26 ou se Zfosse superior a 63.

Uma ressalva com o formato é que, se houver zero de alguma coisa, esse termo não será impresso.

  • Então, por exemplo, se Yfosse zero Xe Zdiferente de zero, o formato seria semelhante XcZi.

  • Da mesma forma, se Ye Zfosse zero e Xdiferente de zero, o formato seria Xc.

  • A exceção aqui é quando N é zero. Então 0ié a saída em vez de uma sequência vazia.

Você pode assumir que todos os N itens são do mesmo tipo, portanto, todos empilháveis.

Você não pode produzir uma lista ou tupla de três números. Você deve fornecer uma sequência com a notação exata "csi", nessa ordem, sem espaços ou vírgulas.

Para referência, aqui está um baú completamente cheio de pilhas de itens:

Minecraft único baú cheio de 27 pilhas de diamantes

Casos de teste

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

O código mais curto em bytes vence.

Passatempos de Calvin
fonte
1
Relacionado
Leaky Nun
33
ok, aparentemente, esta é uma investigação da cena do crime
Okx
1
Relacionado.
Martin Ender
@ Ok, eu li o título e pensei que seria alguma forma de Clue / Cluedo, mas para minecraft.
caird coinheringaahing
@ Ok com todos os spin-offs que não seriam surpreendentes. Agora precisamos de um desafio com o desenho de um contorno de giz - talvez de uma trepadeira
Chris H

Respostas:

11

Geléia ,  26  24 bytes

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

Um programa completo, pegando o número e imprimindo o resultado.
Parece muito longo para mim ...

Experimente online! ou veja a suíte de testes .

Quão?

atualizando ...

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
fonte
7

Retina , 49 48 41 bytes

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

Experimente online! Inclui todos os casos de teste, exceto o último, caso sobrecarregue o TIO. Editar: salvou 7 bytes graças a @MartinEnder. Explicação:

.+
$*i

Converta o número de entrada para unário usando is.

i{64}
s

64 itens preenchem uma pilha.

s{27}
c

27 pilhas enchem um baú.

(.)\1*
$.&$1

Converta quaisquer baús, pilhas ou itens restantes em decimal, mas deixando o tipo como sufixo.

^$
0i

Se a entrada for zero, faça o resultado 0i.

Neil
fonte
Oh, isso é realmente converter para unário e depois substituir?
Jonathan Allan
@ JonathanAllan Adicionei uma explicação (não tive tempo, desculpe-me). (Escrevendo a explicação me deu a oportunidade de salvar um byte também!)
Neil
2
Você pode evitar alguns dos que $.&a duplicação assim: tio.run/##FYs9DsIwDIX3d46ASpGq2Ens5ARcAiEQYsjCQNmqnj21Lb9veD@/...
Martin Ender
@MartinEnder Ah, eu queria saber se valeria a pena converter diretamente em ivez de 1, mas simplesmente não conseguia ver essa simplificação, obrigado!
911 Neil
4

C #, 84 86 bytes

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

Observe a subtração em linha, não percebeu que era possível, mas i--fazia sentido; por que nãoi-=10

Editar:

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

para caso de borda 0 e sugestão.

LiefdeWen
fonte
1
+1. E você pode mudar _-=_/1728*1728para _%=1728a golf alguns bytes.
Kevin Cruijssen 7/06
Além disso, você esqueceu o case de borda 0, o que deve resultar 0ie não está produzindo nada no momento. Adicionar um simplesmente _>0?...:"0i"resolveria isso.
Kevin Cruijssen 7/06
@KevinCruijssen Ahh, obrigado.
precisa saber é o seguinte
3
+1 para >_>no editado
caird coinheringaahing
3

Python 3 , 87 bytes

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)

Experimente online!

Freira Furada
fonte
Em Python 2 este pode ser reduzido para 82 bytes, utilizando divisão simples ( / em vez de //) e usando em vez do operador crasestr(...)
Gábor Fekete
3

05AB1E , 24 bytes

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

Experimente online!

Explicação

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
fonte
Como isso funciona no 0caso de entrada e por que isso também imprime uma nova linha à direita, enquanto outras entradas não?
Jonathan Allan
@ JonathanAllan: Se nada foi impresso, 05AB1E imprime implicitamente a parte superior da pilha no final da execução (com nova linha). For-loops separa as listas e empurra os elementos para a pilha, para que qualquer item não impresso seja adicionado à pilha. No final do loop, o 0estojo 0iestará no topo da pilha ( 0se 0cestará embaixo dela) e será impresso.
Emigna
3

C, 85 87 105 110 111 112 bytes

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

Experimente aqui .

O código ainda funciona corretamente em números negativos. Agora você pode dever os blocos OP do servidor!

Keyu Gan
fonte
As funções são aceitáveis ​​como padrão no PPCG
Beta Decay
3

JavaScript (ES6), 77 76 bytes

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

Casos de teste

Arnauld
fonte
2

Java 8, 86 bytes

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

Experimente aqui.

Kevin Cruijssen
fonte
2

CJam , 31 bytes

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

Experimente online!

Explicação

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.
Gato de negócios
fonte
1

JavaScript (ES6) 71 bytes

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

Snippet:

Rick Hitchcock
fonte
1

Python 2 , 82 bytes

Eu converti o comentário de Gabor Fekete de cima em um exemplo de trabalho:

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)

Experimente online!

Andrew U Baker
fonte
1

Lote, 347 335 283 246 234 202 199 191 189 bytes

@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
fonte
Você sabe que pode usar divisão e módulo em uma set/aexpressão, não é?
911 Neil
@Neil Eu sei, eu estou trabalhando como o mesmo caminho agora
stevefestl
@Neil eu só estou encontrando um problema: if %c%==0 (set c=)else remeste códigos me dá " (setnão se espera"
stevefestl
Huh, que só deve acontecer se c está vazia ...
Neil
1
JFTR minha solução (duas variações ligeiramente diferentes com o mesmo comprimento) caiu para 122 bytes.
7117 Neil
0

Braingolf , 71 bytes

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

Experimente online!

Nem um pouco de golfe, mas funciona

Skidsdev
fonte
0

Mathematica, 155 bytes

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
fonte
0

PHP , 84 bytes

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

Experimente online!

PHP , 93 bytes

$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:"";

Experimente online!

Jörg Hülsermann
fonte
0

T-SQL, 139 134 139 bytes

A entrada é armazenada na coluna a da tabela preexistente 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

Quebras de linha para facilitar a leitura, não contadas no total de bytes. Testado no MS SQL Server 2012.

EDIT 1: Mudou múltiplos REPLACEpara IIFsalvar 5 bytes. FinalREPLACE ainda necessário, porque STRirrita almofadas com espaços para 10 caracteres.

EDIT 2: Corrigido para seguir as regras usando o tipo de entrada aprovado para SQL, valores armazenados em uma tabela nomeada . Este custo bytes para o FROM, também requer em SELECTvez de PRINT. Recuperou 2 bytes descartando um parênteses desnecessário.

BradC
fonte
0

PowerShell, 113 bytes

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

Isso atinge um monte de pontos de dor do PowerShell com muita precisão.

[math]::Floor é necessário para isso, pois o PS faz o arredondamento de banqueiros por padrão.

o PS Ternary também ocupa uma carga de bytes em comparação com outros idiomas, para fazer uma simples coalescência nula ( $a="This";$a?$a:"That"ou"This"?:"That" ) que precisamos fazer(($a="This"),"That")[$a-ne$null]

então precisamos usar tudo isso duas vezes e também adicionar outro conjunto de colchetes em alguns lugares devido à ordem de operação padrão do PowerShell.

colsw
fonte
0

Python 2 , 77 bytes

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

Experimente online!

xnor
fonte