Pxem, 30 bytes (Filename) + 0 bytes (Content) - 25 bytes (bonus) = 5 bytes, requires nonprintable character, does not deal with default.
- Filename (nonprintable is escaped):
._.c.w.tXXX.eX.eX.e.p.m\001.-.c.a
- Content is empty.
Try it online! (with pxem.posixism)
With comments
XX.z
# read integer and push it (pxem.posixism errors when not given)
.a._XX.z
# dup; while pop!=0; do
.a.c.wXX.z
# heap=pop
.a.tXX.z
# .e command actually stands for calling content as
# subroutine BUT content is empty so it stands for
# duplicating entire stack
# also non-command substrings stand for literals
# so stack would have (3*2+1)*2+1*2=30 X's
.aXXX.eX.eX.eXX.z
# pop all to output each of them
.a.pXX.z
# push heap; push 1; push abs(pop-pop); dup
.a.m\001.-.cXX.z
# done
.a.a
Pxem, 12 bytes (Filename) + 0 bytes (Content) = 12 bytes.
- Filename:
XX.eXX.e.e.p
- Content is empty.
It outputs 24 X's without trailing LF.
How it works
XX.z
# push two X's
.aXXXX.z
# call content (as subroutine), pushing final result
## NOTE if original stack was 1,2,3 from top,
## the subroutine stack is also intialized with 1,2,3
## Then when returning from subroutine with final result of stack 4,5,6
## then original stack would be 4,5,6,1,2,3
## Since content is empty, it stands for duplicatinf entire stack
.a.eXX.z
## now X,X,X,X
# push two X's
.aXXXX.z
## now four X's
# duplicate entire stack twice
.a.e.eXX.z
# finally pop all to output each of them
.a.p