Java 10, 168 байт
‖J⁻³ι±¹
Порт @АрноJavaScript-ответ (а также 1-индексированный и вывод F²«
as bottom). If you like this answer, make sure to upvote him as well!
Попробуйте онлайн.
Объяснение:
³↑⁵‖?←
||answer||
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||
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:' ')
(вертикальные смещения). Эти смещения учитывают вышеуказанное движение курсора, что удобно означает, что они никогда не должны быть отрицательными.