Codegolf - Csi: Предметы Minecraft

  • Автор темы Omillebybof
  • Обновлено
  • 23, Oct 2024
  • #1

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

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

 
 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
 

где

  • 0i is the number of chests you can completely fill with N items,
  • Xc is the number of stacks you can fill with the items remaining after filling chests,
  • X if the number of items remaining after filling chests and stacks.

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

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

Поэтому это никогда не имело бы смысла, если бы Z is more than 26 or if Y больше 63.

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

  • Так, например, если XcZi были нулевыми и Z и X nonzero, the format would look like Y .

  • Аналогично, если Z and Y were zero and Z nonzero, the format would be Y .

  • Исключением здесь является случай, когда N равно нулю. Затем X is the output rather than an empty string.

Вы можете предположить, что все N предметов относятся к одному и тому же типу, следовательно, все их можно штабелировать.

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

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

codegolf - CSI: Предметы Minecraft

Тестовые случаи

XcYsZi

Выигрывает самый короткий код в байтах.

#код-гольф #математика #арифметика #игра #целое число

Omillebybof


Рег
20 Sep, 2011

Тем
71

Постов
202

Баллов
557
  • 26, Oct 2024
  • #2

Желе, 26 24 байты

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 d64d1¦27Fż“csi”ẠƇȯ⁾0i
 

Полная программа, принимающая число и распечатывающая результат.
Мне кажется это слишком долго...

Попробуйте онлайн! или посмотреть набор тестов.

Как?

обновление...

d64d1¦27FµTȯ3ịż“csi”$ ||answer||

сетчатка, 49 48 41 байт

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

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

(($a="This"),"That")[$a-ne$null]

Преобразуйте входное число в унарное, используя "This"?:"That" s.

$a="This";$a?$a:"That"

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

[math]::Floor

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

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

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

PRINT

Если ввод был равен нулю, сделайте результат SELECT .

 

Svetase


Рег
02 Apr, 2011

Тем
68

Постов
200

Баллов
560
  • 26, Oct 2024
  • #3

05AB1E, 24 байта

FROM

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

Объяснение

STR ||answer||

С#, 84 86 байт

REPLACE

Обратите внимание на встроенное вычитание, я не осознавал, что это возможно, но IIF made sense so why not REPLACE

Редактировать:

SELECT IIF(a=0,'0i',REPLACE(IIF(a<1728,'',STR(a/1728)+'c') +IIF(a28<64,'',STR(a28/64)+'s') +IIF(a%64=0,'',STR(a%64)+'i'),' ',''))FROM t

для 0-краевого случая и предложения.

 

Raibek1


Рег
17 Nov, 2019

Тем
80

Постов
194

Баллов
644
  • 26, Oct 2024
  • #5

С, 85 87 105 110 111 112 байты

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

Попробуйте это здесь.

Код корректно работает даже с отрицательными числами. Теперь вы можете задолжать блоки OP сервера!

 

Defan


Рег
15 Mar, 2020

Тем
77

Постов
222

Баллов
617
  • 26, Oct 2024
  • #6

JavaScript (ES6), 77 76 байт

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)&

Тестовые случаи

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

Java 8, 86 байт

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

Попробуйте здесь.

 

Дмитрий Бабайцев


Рег
22 Oct, 2020

Тем
84

Постов
187

Баллов
657
  • 26, Oct 2024
  • #7

CJam, 31 байт

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

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

Объяснение

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) ||answer||

///, 179 байт

f= n=>[n/1728|0,(n/64|0)%27,n%64].map((a,i)=>a?a+'csi'[i]:'').join``||'0i' console.log(f(0)) // 0i console.log(f(1)) // 1i console.log(f(2)) // 2i console.log(f(62)) // 62i console.log(f(63)) // 63i console.log(f(64)) // 1s console.log(f(65)) // 1s1i console.log(f(66)) // 1s2i console.log(f(127)) // 1s63i console.log(f(128)) // 2s console.log(f(129)) // 2s1i console.log(f(200)) // 3s8i console.log(f(512)) // 8s console.log(f(1337)) // 20s57i console.log(f(1664)) // 26s console.log(f(1727)) // 26s63i console.log(f(1728)) // 1c console.log(f(1729)) // 1c1i console.log(f(1791)) // 1c63i console.log(f(1792)) // 1c1s console.log(f(1793)) // 1c1s1i console.log(f(4096)) // 2c10s console.log(f(5183)) // 2c26s63i console.log(f(5184)) // 3c console.log(f(5200)) // 3c16i console.log(f(9999)) // 5c21s15i console.log(f(385026)) // 222c22s2i console.log(f(1000000000)) // 578703c19s

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

Ввод принимается в унарном формате. n=>[n/1728|0,(n/64|0)%27,n%64].map((a,i)=>a?a+'csi'[i]:'').join``||'0i' s at the end of the program right before the 1 .
Бывший:

x

Вы также можете использовать .../si/s|cs/c|ci/c/mcl0sl0<--input here-->i in place of 8 i Это побочный эффект от игры в гольф по программе. Ниже приведена оболочка для упрощения тестирования.

Тестовая оболочка: Попробуйте онлайн!

Негольфед: Попробуйте онлайн!

Он делает 2 divmods: один для разделения на сундуки, стопки и предметы, а затем еще раз для преобразования в десятичный формат. Я мог бы также преобразовать входные данные из десятичных чисел, но мне также пришлось бы изменить все имена символов и добавить дополнительную логику, чтобы они не ломались, поэтому я не собираюсь этого делать. Кроме того, я думаю, что унарный является признанным стандартным вводом для ///.

 

FoumbmowLog60


Рег
25 Oct, 2024

Тем
68

Постов
198

Баллов
538
  • 26, Oct 2024
  • #8

JavaScript (ES6) 71 байт

1

Фрагмент:

/|/\/\///b/l0|d/11|x/dddd|sbxxxxxxxx/1sb|cbxxxd1/1cb|bxd/1b|d/2|2222/8|222/6|22/4|21/3|81/9|61/7|41/5|bc/gc|cb/c|bs/gs|sb/s|bi/gi|b|/g/0|mc/m|ms/m|mi/0i|m|/si/s|cs/c|ci/c/mcl0sl0i ||answer||

Питон 2, 82 байта

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

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.

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

 

Иван Корсун


Рег
22 Oct, 2020

Тем
78

Постов
184

Баллов
594
  • 26, Oct 2024
  • #10

Брейнгольф, 71 байт

let f = n=>[n+1,1728,64,1].map((v,i,a)=>(v=n%a[--i]/v|0)?v+'csi'[i]:'').join``||'0i' console.log(f(0)) // -> 0i console.log(f(1)) // -> 1i console.log(f(2)) // -> 2i console.log(f(62)) // -> 62i console.log(f(63)) // -> 63i console.log(f(64)) // -> 1s console.log(f(65)) // -> 1s1i console.log(f(66)) // -> 1s2i console.log(f(127)) // -> 1s63i console.log(f(128)) // -> 2s console.log(f(129)) // -> 2s1i console.log(f(200)) // -> 3s8i console.log(f(512)) // -> 8s console.log(f(1337)) // -> 20s57i console.log(f(1664)) // -> 26s console.log(f(1727)) // -> 26s63i console.log(f(1728)) // -> 1c console.log(f(1729)) // -> 1c1i console.log(f(1791)) // -> 1c63i console.log(f(1792)) // -> 1c1s console.log(f(1793)) // -> 1c1s1i console.log(f(4096)) // -> 2c10s console.log(f(5183)) // -> 2c26s63i console.log(f(5184)) // -> 3c console.log(f(5200)) // -> 3c16i console.log(f(9999)) // -> 5c21s15i console.log(f(385026)) // -> 222c22s2i console.log(f(1000000000)) // -> 578703c19s

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

Совсем не гольф, но работает

 

Thebaby


Рег
14 Apr, 2009

Тем
57

Постов
197

Баллов
512
  • 26, Oct 2024
  • #11

Математика, 155 байт

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

PHP, 84 байта

#define a(x,y)x?printf("%d%c",x,y+99):0; f(z){a(z/1728,0)a(z28/64,16)!z+a(z%64,6)}

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

PHP, 93 байта

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)

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

 

Lelcophoppist


Рег
19 Oct, 2019

Тем
74

Постов
198

Баллов
588
  • 26, Oct 2024
  • #12

T-SQL, 139 134 139 байт

Ввод сохраняется в столбце а из уже существующей таблицы т.

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

Разрывы строк для удобства чтения, не учитываются в общем количестве байтов.

Протестировано на MS SQL Server 2012. РЕДАКТИРОВАТЬ 1: i-=10 to i-- Изменено несколько _=>(_/1728>0?_/1728+"c":"")+((_-=_/1728*1728)/64>0?_/64+"s":"")+(_%64>0?_%64+"i":"") still necessary because 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 чтобы сохранить 5 байт. Финал

раздражающе заполняется пробелами до 10 символов. РЕДАКТИРОВАТЬ 2: Исправлено соблюдение правил при использовании утвержденного типа ввода для SQL.значения, хранящиеся в именованной таблице 1728‰`64‰)˜…csiøvyJ¬0Êi? , also requires 0i . Это стоимость байтов для ^$ 0i . Recovered 2 bytes by dropping an unnecessary parens.

вместо

 

Зульфия Атаева


Рег
21 Oct, 2020

Тем
76

Постов
207

Баллов
647
  • 26, Oct 2024
  • #13
(.)\1* $.&$1

PowerShell, 113 байт

s{27} c is required for this as PS does Bankers Rounding by default.

Это очень точно затрагивает множество болевых точек PowerShell. i{64} s or i PS Ternary также занимает больше байтов по сравнению с другими языками, чтобы выполнить простое слияние нулей ( .+ $*i

) нам нужно сделать

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

 

Umka_n


Рег
25 Oct, 2005

Тем
66

Постов
199

Баллов
529
  • 26, Oct 2024
  • #15
Желе 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)

, 21 байт

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

Как и предыдущий ответ Джонатана Аллана, этот ответ кажется слишком длинным.

Еще более по сути то же самое:Желе

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

, 21 байт

 

Alexr22b


Рег
27 Nov, 2008

Тем
79

Постов
203

Баллов
658
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно