X marca o local - um trabalho de impressão

10

Dados dois números, imprima uma página com um "X" no local especificado (± 10%).

Os números devem ser porcentagens ou frações das dimensões da área de impressão da página, por exemplo, [25,75]ou ["15%","0%"]ou [0.33,1]. Você não precisa considerar margens. Lembre-se de indicar qual número é a largura, qual é a altura e qual canto é a origem.

Obviamente, você pode assumir que uma impressora está conectada e qualquer impressora virtual conta também. De fato, convém definir uma impressora PDF como sua impressora padrão antes de iniciar esse desafio.

Você pode criar um arquivo imprimível (por exemplo, um PDF) e enviá-lo para uma impressora virtual, que por sua vez cria o PDF resultante, mas não é possível criar diretamente o PDF final. Esse deve ser um trabalho de impressão adequado.

Se possível, inclua uma foto, digitalização ou captura de tela do resultado ou link para um documento online. Observe que o Imgur aceita PDFs.

Obviamente, você receberá mais votos se colocar um X em vez de gerar novas linhas e espaços com uma fonte e tamanho de papel assumidos.

Exemplo

Para altura de entrada 75% e largura 25%, no canto superior esquerdo, imprima o seguinte documento:


[25,75]


Adão
fonte
Podemos ler o arquivo de imagem de qualquer lugar?
Beta Decay
@BetaDecay Que arquivo de imagem?
Adám
A imagem em sua pergunta: i.stack.imgur.com/rfZeO.png
Deterioração beta de
@BetaDecay Você deveria gerar um documento, não ler uma imagem.
Adám 16/05/19
Que tamanho de papel devemos usar / assumir ou isso importa?
Stephen

Respostas:

6

MacOS Bash + OfficeJet Pro 8600, 46

(yes ''|sed $[$2*3/5]q;printf %$[$1*4/5]sX)|lp

Origem é o canto superior esquerdo.

Fiz uma impressão de teste para verificar as dimensões dos caracteres impressos lpna minha impressora - ela parece 82w x 64h, então (número inteiro) multiplica as porcentagens por 3/5 e 4/5, respectivamente, dentro da tolerância de 10%.

Resultado, com entrada da linha de comandos de 25 75:

insira a descrição da imagem aqui

Trauma Digital
fonte
6
Uau, deve ser o primeiro envio de objeto físico no PPCG.
Adám 16/05/19
11
@ Adám e quanto a isso ?
NoOneIsHere
1

APL (Dyalog) no Windows, 36 35 bytes

Função anônima recebendo (Y, X) em porcentagem da parte superior esquerda como argumento

{'X.'WC'Text'(2'X'WC'Printer')⍵}

Começamos com uma lista de três elementos:

{ uma função anônima (todas as variáveis ​​são locais)

 o argumento, por exemplo 75 25

( para a direita de

  'X'⎕WC'Printer'W indows C objeto reate uma impressora com o nome X , devolvendo'#.X'

  2↓ solte dois caracteres para obter apenas 'X'

) para a direita de

'Text' o que vamos adicionar

'X.'⎕WCW INDOWS C reate um (tipo, conteúdo, posição) objecto no objecto X , retornando'#.X'

} fim da função (como X é local, é destruído quando a função termina, sinalizando ao Windows que concluímos o trabalho de impressão, o que faz com que o Windows o imprima)


X @ 75 25

Adão
fonte
0

Java 8, 210 209 bytes

-1 byte: alterado para currying sintaxe

import java.awt.print.*;
x->y->{PrinterJob j=PrinterJob.getPrinterJob();j.setPrintable((g,p,i)->{g.drawString("X",(int)(p.getWidth()*x),(int)(p.getHeight()*y));return i;});try{j.print();}catch(Exception e){}};

Toma entrada como a versão de ponto flutuante de por cento de: 0.25, 0.75.

Se o tamanho do papel puder ser assumido como 8,5 x 11 pol (72 dpi), 184 bytes

import java.awt.print.*;
x->y->{PrinterJob j=PrinterJob.getPrinterJob();j.setPrintable((g,p,i)->{g.drawString("X",x*612/100,y*792/100);return i;});try{j.print();}catch(Exception e){}};

Usa valores padrão para imprimir em PDF. Agora leva entrada como versão inteiro por cento: 25, 75.

Se um sistema operacional Windows também puder ser assumido, 177 bytes

import sun.awt.windows.*;
x->y->{WPrinterJob j=new WPrinterJob();j.setPrintable((g,p,i)->{g.drawString("X",x*612/100,y*792/100);return i;});try{j.print();}catch(Exception e){}};

Mesmas entradas como acima: 25, 75.

Uso

import java.awt.print.*;
...
Function<Double, Consumer<Double>> f =
x->y->{PrinterJob j=PrinterJob.getPrinterJob();j.setPrintable((g,p,i)->{g.drawString("X",(int)(p.getWidth()*x),(int)(p.getHeight()*y));return i;});try{j.print();}catch(Exception e){}};
...
f.apply(.25).accept(.75);

Caso de teste

Para entrada de 0.25, 0.75:

Java Printing Test Case

(Não tenho uma impressora física, mas isso ainda deve funcionar sem problemas)

Justin Mariner
fonte
Muito impressionante. Por que você precisa catch(Exception e){}?
Adám
@ Adám Porque PrinterJob.print()joga um PrinterExceptione eu não vi nenhuma maneira de contornar isso.
Justin Mariner
0

C #, 259 202 201 bytes

namespace System.Drawing.Printing{w=>h=>{var p=new PrintDocument();p.PrintPage+=(s,e)=>e.Graphics.DrawString("X",new Font("Onyx",9),Brushes.Red,e.PageBounds.Width*w,e.PageBounds.Height*h);p.Print();};}

Onyx é uma fonte instalada na minha máquina Windows 10 por padrão, onde 4 parece ser o nome mais curto da fonte. Eu testei isso executando o seguinte em C # e depois inspecionando blahno depurador.

var blah = FontFamily.Families.GroupBy(o => o.Name.Length)
                              .OrderBy(g => g.Key);

Versão completa / formatada:

namespace System.Drawing.Printing
{
    class P
    {
        static void Main(string[] args)
        {
            Func<float, Action<float>> f = w => h =>
            {
                var p = new PrintDocument();
                p.PrintPage += (s, e) =>
                    e.Graphics.DrawString("X", new Font("Onyx", 9), Brushes.Red,
                                          e.PageBounds.Width * w, e.PageBounds.Height * h);
                p.Print();
            };

            f(0.25f)(0.75f);
        }
    }
}

Caso de teste (0,25, 0,75):


Documento de exemplo

TheLethalCoder
fonte