Codegolf - Наполни Ведро

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

Ваша задача — заполнить ведро числами до заданного значения.

Правила

Числа занимают крайнее левое положение, затем крайнее правое, затем крайнее левое и так далее.

После переполнения числа начинают собираться вокруг ведра аналогичным образом. Они занимают положение по диагонали.

В примерах должно быть понятно, каков ожидаемый результат (в примерах упоминаются некоторые правила).

Если число больше 10, используйте крайнюю правую цифру.

Примеры:

 The bucket: 
|      |  or |      | 
|      |     |      | 
|      |     |      |
|      |     |      |
|------|     |______|

input:1  (You can start from either 0 or 1)
output:
|      |  (There can be whitespace to the left even if there is no overflow
|      |  but the bucket must not be distorted.)
|      |
|1     |
|------|

input:6
output:
|      |
|      |
|      |
|135642|
|------|

input:8
output:
|      |
|      |
|7    8|
|135642|
|------|

input:23
output:
|913 20|
|357864|
|791208|
|135642|
|------|

input:27
output:

|913420|

|357864|

|791208|

|135642|
75|------|6

input:30
output:

|913420|

|357864|

|791208|

9|135642|0
75|------|68

input:40
output:

|913420|

|357864|

5|791208|6

939|135642|040
7175|------|6828

input:54   (Maximum input for start=1)

3|913420|4

13|357864|42

915|791208|620

7939|135642|0408
57175|------|68286
 

Это код-гольф поэтому побеждает самый короткий код.

#код-гольф #ascii-art

Klyuchnik


Рег
07 Sep, 2006

Тем
78

Постов
201

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

JavaScript (Node.js), 145 143 байт

Жестко запрограммированный шаблон (см. здесь дополнительную математику).

1-индексированный.

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 11011011011510200300040000 

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

Сэкономлено 2 байта благодаря @tsh

 

Svetl.efremowa2015


Рег
10 Nov, 2019

Тем
100

Постов
190

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

JavaScript (ES6), 144...139 137 байт

Математический подход (см. здесь меньше математики).

0-индексированный.

003003003005203004000500

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

Как?

Вывод строится посимвольно, при этом \$y\$ уменьшается от \$4\$ до \$0\$, а \$x\$ увеличивается от \$0\$ до \$18\$ в каждой строке.

Мы определяем:

$$X=\begin{cases}x&\text{if }x\le 8\\17-x&\text{if }x>8\end{cases}$$

Записав полные значения, а не только цифры единиц, мы получим следующую таблицу:

э§”)⊟E≡≦⌈▷⊖ü∕”꧔)⊟&hXτtD(λэ”κ

Эта таблица по существу симметрична относительно оси Y, за исключением того, что значения в левой части являются четными, а значения в правой части — их нечетными аналогами.

Мы определяем:

$$k=\begin{cases}24+(4+y-X)(5+y-X)+2y&\text{if }X<5\\6y+2X-18&\text{if }X>5\end{cases }$$

$$k'=\begin{cases}k&\text{if }x\le 8\\k+1&\text{if }x>8\end{cases}$$

И для каждой ячейки добавляем:

  • перевод строки, если \$X=-1\$
  • труба, если \$X=5\$
  • дефис, если \$k<0\$
  • пробел, если \$Xn\$ (где \$n\$ — входные данные)
  • \$k' \bmod 10\$ в противном случае

Прокомментировал

↖I﹪⁺⊗κ⊕ιχ ||answer||

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

F⊘⁺θ¬ι«

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

 

TatianaP


Рег
14 Dec, 2008

Тем
83

Постов
210

Баллов
635
  • 26, Oct 2024
  • #4

Java 10, 168 байт

‖J⁻³ι±¹

Порт @АрноJavaScript-ответ (а также 1-индексированный и вывод F²« as bottom). If you like this answer, make sure to upvote him as well!

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

Объяснение:

³↑⁵‖?← ||answer||

6502 машинный код (C64), 130 байт

Nθ

Здесь используется модифицированная версия «предварительно отформатированного» подхода некоторых других ответов. Он содержит полную строку сегмента, но цифры заменены значениями, начинающимися с Nθ³↑⁵‖?←F²«‖J⁻³ι±¹F⊘⁺θ¬ι«↖I﹪⁺⊗κ⊕ιχэ§”)⊟E≡≦⌈▷⊖ü∕”꧔)⊟&hXτtD(λэ”κ , while any characters for direct printing are in the range 00 C0 .WORD $C000 ; load address .C:c000 20 9B B7 JSR $B79B ; get unsigned byte from commandline .C:c003 A9 C0 LDA #$C0 ; add #$C0 (+ carry = #$C1) ... .C:c005 65 65 ADC $65 ; ... to parameter .C:c007 85 FB STA $FB ; and store in $FB .C:c009 A2 00 LDX #$00 ; loop index .C:c00b .loop: .C:c00b BD 2B C0 LDA .bucket,X ; loop over encoded string .C:c00e F0 1A BEQ .done ; null-terminator -> done .C:c010 10 12 BPL .out ; positive (bit 7 clear) -> output .C:c012 C5 FB CMP $FB ; compare with parameter+#$C1 .C:c014 90 04 BCC .digit ; smaller -> convert to digit .C:c016 A9 20 LDA #$20 ; otherwise load space character .C:c018 D0 0A BNE .out ; and output .C:c01a .digit: .C:c01a 69 70 ADC #$70 ; add offset to '0' (#$30) .C:c01c .check: .C:c01c C9 3A CMP #$3A ; greater than '9' (#$39) ? .C:c01e 90 04 BCC .out ; no -> to output .C:c020 E9 0A SBC #$0A ; otherwise subtract 10 (#$a) .C:c022 B0 F8 BCS .check ; and check again .C:c024 .out: .C:c024 20 D2 FF JSR $FFD2 ; output character .C:c027 E8 INX ; next index .C:c028 D0 E1 BNE .loop ; and repeat loop .C:c02a .done: .C:c02a 60 RTS ; exit .... .C:c02b .bucket: .C:c02b 20 20 20 [...] ; "encoded" string for bucket - SYS49152,54 .

Кодировка C64 не включает канал ( SYS49152,[n] ) character, it's therefore replaced with the similar-looking ПЕТСКИИ характер 0x7d .

Онлайн демо

Использование: | (1-indexed, e.g. 0x7f для полного вывода)

Комментируемая дизассемблирование:

0x01 ||answer||

Древесный уголь, 64 байта

0xC1

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

00 C0 20 9B B7 A9 C0 65 65 85 FB A2 00 BD 2B C0 F0 1A 10 12 C5 FB 90 04 A9 20 D0 0A 69 70 C9 3A 90 04 E9 0A B0 F8 20 D2 FF E8 D0 E1 60 20 20 20 20 F5 7D D3 D5 D7 D8 D6 D4 7D F6 0D 20 20 20 F3 EB 7D CD CF D1 D2 D0 CE 7D EC F4 0D 20 20 F1 E9 E3 7D C7 C9 CB CC CA C8 7D E4 EA F2 0D 20 EF E7 E1 DD 7D C1 C3 C5 C6 C4 C2 7D DE E2 E8 F0 0D ED E5 DF DB D9 7D 2D 2D 2D 2D 2D 2D 7D DA DC E0 E6 EE 00

Введите номер.

n-> // Method with integer parameter and no return-type " g|EGIJHF|h\n e]|?ACDB@|^f\n c[U|9;=><:|V\\d\n aYSO|357864|PTZb\n_WQMK|------|LNRX`" // String containing the bucket and magic string .chars().forEach(c-> // Loop over the characters (as integers) System.out.print( // Print: c<46|c==124? // If the character is "\n", " ", "-", or "|": (char)c // Output the character as is :c<n+51? // Else-if the character value is smaller than the input + 51: c // Output a digit: the character value modulo-9 : // Else: " ")) // Output a space

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

-

Петли для каждой стороны ведра.

n->" g|EGIJHF|h\n e]|?ACDB@|^f\n c[U|9;=><:|V\\d\n aYSO|357864|PTZb\n_WQMK|------|LNRX`".chars().forEach(c->System.out.print(c<46|c==124?(char)c:c<n+51?c:" "))

Отразите ведро, чтобы мы могли рисовать в одном и том же направлении в обоих циклах, и перейдите к позиции первой цифры на этой стороне ведра.

I=input() s=" u|SUWXVT|v\n sk|MOQRPN|lt\n qic|GIKLJH|djr\n oga]|ACEFDB|^bhp\nme_[Y|------|Z\`fn" i=1 exec"s=s.replace(chr(64+i),[`i`,' '][i>I]);i+=1;"*55 print s

Переберите количество цифр на этой стороне ведра.

n => ( // main function taking n y = 4, // start with y = 4 g = x => // g = recursive function taking x ~y ? // if y is not equal to -1: ( X = x > 8 ? 17 - x : x, // compute X k = X < y ? // if X is less than y: g // set k to a non-numeric value : // else: X < 5 ? // if X is less than 5: 24 - (z = 4 + y - X) * ~z // apply the 'side numbers' formula + y * 2 // : // else: y * 6 + X * 2 - 18, // apply the 'middle numbers' formula ~X ? // if X is not equal to -1: X ^ 5 ? // if X is not equal to 5: k < 0 ? // if k is less than 0: '-' // append a hyphen : // else: (k += x > 8) < n ? // update k to k'; if it's less than n: k % 10 // append the unit digit of k' : // else: ' ' // append a space : // else (X = 5): '|' // append a pipe : // else (X = -1): `\n` // append a linefeed ) // + g(~X ? -~x : !y--) // update x and y, and do a recursive call : // else (y = -1): '' // stop recursion )() // initial call to g with x undefined

Напечатайте следующую цифру и переместите курсор вверх и влево.

x | 0 1 2 3 4 5 6 7 8 | 9 10 11 12 13 14 15 16 17 18 X | 0 1 2 3 4 5 6 7 8 | 8 7 6 5 4 3 2 1 0 -1 ---+----------------------------+------------------------------- 4 | .. .. .. .. 52 || 18 20 22 | 23 21 19 || 53 .. .. .. .. \n 3 | .. .. .. 50 42 || 12 14 16 | 17 15 13 || 43 51 .. .. .. \n 2 | .. .. 48 40 34 || 6 8 10 | 11 9 7 || 35 41 49 .. .. \n 1 | .. 46 38 32 28 || 0 2 4 | 5 3 1 || 29 33 39 47 .. \n 0 | 44 36 30 26 24 || -- -- -- | -- -- -- || 25 27 31 37 45 \n

Отрегулируйте положение курсора, прочитав смещения двух сжатых строк, n=>(y=4,g=x=>~y?(X=x>8?17-x:x,k=X<y?g:X<5?24-(z=4+y-X)*~z+y*2:y*6+X*2-18,~X?X^5?k<0?'-':(k+=x>8)<n?k:' ':'|':` `)+g(~X?-~x:!y--):'')() (horizontal offsets) and n=>` g|EGIJHF|h e]|?ACDB@|^f c[U|9;=><:|V\\d aYSO|357864|PTZb _WQMK|------|LNRX\``.replace(/[3-h]/g,c=>(x=Buffer(c)[0])<n+51?x:' ') (вертикальные смещения). Эти смещения учитывают вышеуказанное движение курсора, что удобно означает, что они никогда не должны быть отрицательными.

 

Stavr


Рег
27 Jul, 2004

Тем
77

Постов
199

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

Интересно