CSI: предметы Minecraft

22

Minecraft 1.12 выйдет завтра, так что давайте праздновать!

Напишите код, который принимает неотрицательное целое число N, которое представляет количество элементов чего-либо в Minecraft . Выведите его более удобным для игроков способом, указав количество сундуков, стеков и предметов, эквивалентное N. Используйте формат

XcYsZi

где

  • X количество сундуков, которые вы можете заполнить N предметами,
  • Y количество стеков, которое вы можете заполнить предметами, оставшимися после заполнения сундуков,
  • Z если количество предметов осталось после заполнения сундуков и стеков.

Обратите внимание, что:

  • В стек помещается 64 предмета. (Мы будем игнорировать элементы, которые складываются до 16 или не складываются.)
  • 27 стеков помещаются в сундук. (Это одиночные сундуки, а не двойные.)

Так что не имеет смысла, если Yбольше 26 или Zбольше 63.

Предостережение с форматом заключается в том, что если что-то есть ноль, этот термин не печатается.

  • Так, например, если бы Yбыло ноль Xи Zненулевое, формат был бы похож XcZi.

  • Аналогично, если бы Yи Zбыли нулевые и Xненулевые, формат был бы Xc.

  • Исключением является случай, когда N равно нулю. Тогда 0iвывод, а не пустая строка.

Можно предположить, что все N элементов одного типа, поэтому все они могут быть наращиваемыми.

Вы не можете вывести список или кортеж из трех чисел. Вы должны указать строку с точной нотацией "csi" в указанном порядке, без пробелов и запятых.

Для справки, вот сундук, полностью заполненный стопками предметов:

Майнкрафт сундук с 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

Самый короткий код в байтах побеждает.

Кальвин Хобби
источник
1
Связанный
Leaky Nun
33
ок, видимо, это расследование на месте преступления
Okx
1
Связанный.
Мартин Эндер
@Okx Я прочитал название и подумал, что это будет какая-то форма Clue / Cluedo, но для майнкрафта.
17
@Okx со всеми побочными доходами, что не удивительно. Теперь нам нужно
Крис Х,

Ответы:

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

Retina , 49 48 41 байт

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

Попробуйте онлайн! Включает в себя все тестовые случаи, кроме последнего, в случае, если он перегружен TIO. Редактировать: 7 байтов сохранено благодаря @MartinEnder. Объяснение:

.+
$*i

Преобразуйте входной номер в унарный, используя is.

i{64}
s

64 предмета заполняют одну стопку.

s{27}
c

27 стеков заполняют один сундук.

(.)\1*
$.&$1

Преобразуйте любые сундуки, стеки или оставшиеся элементы в десятичные, но оставляя тип в качестве суффикса.

^$
0i

Если вход был нулевым, сделайте результат 0i.

Нил
источник
О боже, это действительно преобразование в унарный, а затем заменить?
Джонатан Аллан
@JonathanAllan Я добавил объяснение (раньше не было времени извините). (Написание объяснения дало мне возможность сэкономить байт!)
Нил
2
Вы можете избежать такого $.&дублирования, как это: tio.run/##FYs9DsIwDIX3d46ASpGq2Ens5ARcAiEQYsjCQNmqnj21Lb9veD@/…
Мартин Эндер
@MartinEnder Ах, мне было интересно, стоило ли бы конвертировать iвместо 1, но я просто не мог увидеть это упрощение, спасибо!
Нил
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 крайний случай и предложение.

LiefdeWen
источник
1
+1. И вы можете изменить , _-=_/1728*1728чтобы _%=1728в поле несколько байтов.
Кевин Круйссен
Кроме того, вы забыли о крайнем случае 0, который должен закончиться 0iи в настоящее время ничего не выводит. Добавление просто _>0?...:"0i"исправит это.
Кевин Круйссен
@KevinCruijssen Ааа, спасибо.
LiefdeWen
3
+1 за >_>отредактированный
caird coinheringaahing
3

Python 3 , 87 байт

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)

Попробуйте онлайн!

Дрянная Монахиня
источник
В Python 2 это можно было бы сократить до 82 байт, используя простое деление ( / вместо //) и использование оператора backtick вместоstr(...)
Gábor Fekete
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
Emigna
источник
Как это работает в 0случае ввода, и почему это также печатает завершающий перевод строки, в то время как другие вводы не делают?
Джонатан Аллан
@JonathanAllan: Если ничего не было напечатано, 05AB1E неявно печатает верхнюю часть стека в конце выполнения (с символом новой строки). Циклы for разбивают списки на части и помещают элементы в стек, поэтому любой непечатный элемент будет добавлен в стек. По окончании цикла 0чехол 0iокажется на вершине стопки ( 0sи 0cбудет под ней) и будет напечатан.
Emigna
3

С, 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'

Контрольные примеры

Arnauld
источник
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

Python 2 , 82 байта

Я преобразовал комментарий Габора Фекете сверху в рабочий пример:

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)

Попробуйте онлайн!

Эндрю У Бейкер
источник
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%
stevefestl
источник
Вы знаете, что можете использовать деление и модуль в set/aвыражении, не так ли?
Нил
@ Нил, я знаю, я работаю так же, как сейчас
stevefestl
@Neil Я только что столкнулся с проблемой: if %c%==0 (set c=)else remэти коды дают мне « (setне ожидается»
stevefestl
Да, это должно произойти, только если с пусто ...
Нил
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)&
J42161217
источник
0

T-SQL, 139 134 139 байт

Входные данные хранятся в столбце a существующей таблицы 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

Разрывы строк для удобства чтения, не считаются в байтах. Протестировано на MS SQL Server 2012.

EDIT 1: Изменена мультипликатор REPLACEдля , IIFчтобы сохранить 5 байт. Финал REPLACEеще нужен, потому что STRдосадно колодки с пробелами до 10 символов.

РЕДАКТИРОВАТЬ 2: Исправлено, чтобы следовать правилам с использованием утвержденного типа ввода для SQL, значения хранятся в именованной таблице . Эта стоимость байтов для FROM, также требует SELECTвместо PRINT. Восстановил 2 байта, отбросив ненужные парены.

BradC
источник
0

PowerShell, 113 байт

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

Это очень точно бьет по болевым точкам PowerShell.

[math]::Floor для этого требуется, так как PS по умолчанию выполняет округление банкиров.

PS Ternary также занимает загрузку байтов по сравнению с другими языками, чтобы сделать простую нулевую коалесценцию ( $a="This";$a?$a:"That"или "This"?:"That") нам нужно сделать(($a="This"),"That")[$a-ne$null]

затем нам нужно использовать все это дважды, а также добавить в некоторых местах еще один набор скобок из-за порядка операций по умолчанию для powershell.

colsw
источник