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" у такому порядку, без пробілів чи коми.

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

Minecraft single chest filled with 27 stacks of diamonds

Тестові шафи

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

@Oxx з усіма спинофанами, що не дивно. Тепер нам потрібна задача скласти контур крейди - можливо, плазуна
Кріс Х

Відповіді:


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

Перетворити вхідний номер в одинаковий за допомогою 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 крайнього випадку та пропозиції.


1
+1. І ви можете змінити , _-=_/1728*1728щоб _%=1728в поле кілька байтів.
Кевін Кройсейсен

Крім того, ви забули про крайовий випадок 0, який повинен спричинити 0iі наразі нічого не видає. Додавання просто вирішило _>0?...:"0i"б це.
Кевін Круїйсен

@KevinCruijssen Ааа, дякую.
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випадку введення, і чому він також друкує зворотний новий рядок, тоді як інші входи не роблять?
Джонатан Аллан

@JonathanAllan: Якщо нічого не було надруковано, 05AB1E неявно друкує верхню частину стека в кінці виконання (з новим рядком). For-loops розбиває списки на частини і висуває елементи в стек, тому будь-який не надрукований елемент буде доданий до стеку. В кінці циклу 0справа 0iбуде знаходитися у верхній частині стека ( 0sі 0cбуде під нею) і буде надрукована.
Емінья

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'

Тестові кейси



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 Я знаю, я зараз працюю так само
stevefestl

@Neil Я просто стикаюся з проблемою: if %c%==0 (set c=)else remцей код дає мені " (setне очікується"
stevefestl

Так, це може статися лише в тому випадку, якщо c порожній ...
Ніл

1
Моє рішення JFTR (дві дещо різні варіанти з однаковою довжиною) знижується до 122 байт.
Ніл


0

Математика, 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 байт

Введення зберігається у колонці 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 символів.

EDIT 2: Виправлено для дотримання правил за допомогою затвердженого типу введення для SQL, значень, збережених у названій таблиці . Ця вартість байтів для FROM, також вимагає SELECTзамість PRINT. Відновлено 2 байти, скинувши непотрібні паролі.


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 також займає навантаження байтів порівняно з іншими мовами, щоб зробити просту нульову величину ( $a="This";$a?$a:"That"або "This"?:"That"), що нам потрібно зробити(($a="This"),"That")[$a-ne$null]

тоді нам потрібно використати всі ці двічі, а також додати в інший набір дужок в деяких місцях через порядок роботи за замовчуванням посібника за замовчуванням.



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.