Retina o Cestino?


47

Viviamo in una meravigliosa era di tecnologia in cui possiamo avere schermi 8K meravigliosamente dettagliati sui nostri televisori e persino schermi 2K sui nostri telefoni per il nostro piacere di navigazione mobile. Negli ultimi anni abbiamo fatto molta strada in termini di tecnologia dello schermo.

Uno dei prodotti di questo è un termine che è stato reso popolare da Apple, Retina . Ciò si riferisce alla densità di pixel del display in questione che è così elevata, che a una distanza di visualizzazione di 10-12 pollici di distanza, i singoli pixel non possono essere facilmente individuati.

Steve Jobs ha affermato che la densità di pixel in cui ciò si verifica è di circa 300 pixel per pollice e ha iniziato a impiegare densità di pixel in questa gamma sui propri dispositivi con la parola d'ordine Retina utilizzata per la pubblicità.

La densità dei pixel può essere calcolata con la seguente formula:

D = sqrt (w ^ 2 + h ^ 2) / d

Dov'è dla diagonale dello schermo in pollici, wè il numero di pixel sull'asse orizzontale ed hè il numero di pixel sull'asse verticale.

Il tuo compito

Per questa attività, utilizzerai lo standard Retina per decidere quali prodotti vale la pena acquistare. Essendo il consumatore moderno che sei, quando acquisti dispositivi vuoi assicurarti di ottenere un buon prodotto, non un dispositivo degli anni '90! Come tale, vuoi costruire un programma o una funzione che prenda la larghezza, l'altezza e la lunghezza della diagonale come parametri di input o funzione e ti dica se la particolare schermata si qualifica come retina ( D > 300) stampando sullo schermo o ritornando .

A causa del tuo disprezzo per i dispositivi non Retina, il tuo programma o funzione verrà emesso Retina!quando il dispositivo si qualifica e Trash!quando non lo fa.

Puoi presumere che tutti i numeri saranno maggiori di 0. I valori dei pixel per larghezza e altezza saranno sempre numeri interi. Le dimensioni dello schermo possono essere interpretate in qualsiasi modo, purché supportino i decimali. L'input può essere nell'ordine scelto e può anche essere su un massimo di 3 righe separate.

Esempio I / O

1920 1080 4.95   -> Retina!
2560 1440 5.96   -> Retina!
1920 1080 10.5   -> Trash!
10 10 0.04       -> Retina!
4096 2160 19(.0) -> Trash!
8192 4320 100.00 -> Trash!
3000 1500 11.18  -> Retina!
180 240 1(.0)    -> Trash!

Questo è , quindi vince il minor numero di byte.


Ecco una soluzione bloccata, un linguaggio di programmazione basato su stack che sto creando:

r;`;/300>"Retina!""Trash!"?

34
Qualcuno, per favore, rispondi Retina
Digital Trauma,

2
@DigitalTrauma Ma galleggia.
Sp3000,

7
@ Sp3000 pfft, scuse !. Costruisci il tuo float analizzando regex in Retina!
Ottimizzatore

46
@ Sp3000 Va bene, alziamo la posta in gioco. Con la presente prometto di dare uno schiaffo a una grande e succosa taglia di 500 pt sulla risposta legale più breve (consenso della comunità) Retina a una domanda a una settimana da questo commento postando data e ora.
Digital Trauma,

2
Hmm, la soglia scelta non corrisponde esattamente al marketing di Apple, ad esempio per Retina iMac: 5120 2880 27
Ed Avis,

Risposte:


5

Pyth - 27 byte

Utilizza un operatore ternario e absper calcolare pitagorico.

?>c.avzQ300"Retina!""Trash!

Accetta input in due righe, prima riga width, height, seconda riga diag.

Le regole sono state rilassate, quindi tornando indietro.

Provalo online qui .


115

Retina , 530 220 210 202 201 193 191 187 185 (184) byte

Crediti a randomra per il salvataggio di 3 byte! (E spianando la strada per un altro paio.)

+`\.(\d)(.+)( .+)
$1.$2_$3_
\b
#
+`(\d*)#((((((((((9)|8)|7)|6)|5)|4)|3)|2)|1)|\w)
$1$1$1$1$1$1$1$1$1$1$3$4$5$6$7$8$9$10$11#
\d
11
(?=(1*)\1)[^.]
$1
^(1+)\.\1{90000}1+
Retina!
1.+
Trash!

Ai fini del conteggio dei byte, ogni riga va in un file separato, ma è possibile eseguire il codice sopra come da un singolo file invocando Retina con il -sflag.

Questo si aspetta prima la densità (che deve contenere un punto decimale, anche se finale), seguita da larghezza e altezza, cioè d w h.

Questo è un po ' lento. Non proverei la maggior parte dei casi di test indicati, perché funzionerà per anni. Tuttavia, è possibile verificare che funzioni correttamente con i casi di test

19. 4096 2160     -> Trash!
1. 180 240        -> Trash!
1. 181 240        -> Retina!
1. 180 241        -> Retina!
0.04 10 10        -> Retina!

Fondamentalmente, dopo aver moltiplicato tutti i numeri per rendere la densità un numero intero, non si desidera che la larghezza e l'altezza contengano più di 4 cifre.

Mentre questo è lento, è completamente esatto ... non ci sono problemi in virgola mobile o qualcosa del genere. Tutta l'aritmetica utilizza numeri interi (unari).

In linea di principio, potrei radere via un altro byte: ^può essere omesso, ma renderà Trash!i casi di test orribilmente lenti a causa di eccessive quantità di backtracking.

Spiegazione

Innanzitutto, riorganizziamo la disuguaglianza per evitare operazioni in virgola mobile:

√(w2 + h2) / d > 300
√(w2 + h2) > 300 d
w2 + h2 > 90000 d2

Possiamo anche notare che questo è invariante per moltiplicare w, he dper lo stesso numero x:

w2 + h2 > 90000 d2
(x w)2 + (x h)2 > 90000 (x d)2
x2 (w2 + h2) > 90000 x2 d2
w2 + h2 > 90000 d2

Esistono diversi modi per quadrare un numero unario, ma utilizzeremo l'identità

n2 = Σi=1..2n ⌊i/2⌋

Questo ci dà un modo per risolvere il problema usando solo l'aritmetica dei numeri interi (che rappresenta i numeri interi in unario).

Analizziamo il codice. Ogni coppia di righe è una sostituzione regex.

+`\.(\d)(.+)( .+)
$1.$2_$3_

Questo sposta ripetutamente il punto decimale nella densità verso destra moltiplicando larghezza e altezza per 10 (quanto xsopra). Questo per garantire che tutti i numeri siano numeri interi. Invece di aggiungere zero, sto aggiungendo _, che in seguito tratterò come zero. (Questo è un trucco da golf, perché altrimenti avrei bisogno di scrivere ...${3}0per evitare ambiguità con $30.) Il +davanti al regex dice a Retina di ripetere questa sostituzione fino a quando il risultato non smette di cambiare (che è il caso in cui il modello non corrisponde più) .

\b
#

Stiamo preparando i tre numeri per la conversione in unario ora. In linea di principio, abbiamo bisogno di un marcatore (il #) davanti a ciascun numero, ma è più breve aggiungerne uno alla fine di ogni numero, il che non influirà sul passaggio di conversione.

+`(\d*)#((((((((((9)|8)|7)|6)|5)|4)|3)|2)|1)|\w)
$1$1$1$1$1$1$1$1$1$1$3$4$5$6$7$8$9$10$11#

Questa è la conversione in unario, usando un trucco che è stato sviluppato da dan1111 . Fondamentalmente sto traducendo ogni cifra in una ripetizione di se stessa, mentre moltiplico le cifre esistenti per 10 (spostando l' #indicatore a destra nel processo). Questa rappresentazione binaria sarà un bel miscuglio di cifre diverse, ma il numero totale sarà uguale al valore dell'intero originale. Nota \walla fine - normalmente questo è giusto 0, ma vogliamo considerare _anche zero (che è considerato un carattere di parola in regex).

\d
11

Trasformiamo ogni cifra in due 1s, quindi a) assicurandoci che tutte le cifre siano uguali (che sarà necessario in seguito) eb) raddoppiando ciascuno dei numeri.

(?=(1*)\1)[^.]
$1

Questo fa due cose: piazza tutti i numeri (o piuttosto la metà di ogni numero, calcolando una somma 2n) e aggiunge i quadrati risultanti della larghezza e dell'altezza. Si noti che [^.]corrisponde a 1s, #marcatori e spazi. Se è uno #o uno spazio, il lookahead non catturerà nulla, il che significa che tutti questi vengono semplicemente rimossi, ovvero i risultati per la larghezza e l'altezza vengono concatenati / aggiunti. Il punto decimale .rimane per separare il risultato dda quelli. Se [^.]corrisponde 1invece a, allora il lookahead assicura che catturiamo metà delle 1s dopo di essa (arrotondate per difetto) in gruppo 1. Questo calcola la somma che ho menzionato sopra, che produrrà quindi il quadrato del numero originale.

^(1+)\.\1{90000}1+
Retina!

La stringa è ora (in unario), quindi , quindi (in unario). Vogliamo sapere se il primo numero unario è più breve del secondo. Possiamo facilmente fare questa moltiplicazione usando un gruppo di acquisizione e la sintassi della ripetizione. Usiamo (invece di ) in seguito per garantire che il secondo numero sia effettivamente maggiore di quello e non solo uguale. In tal caso, lo sostituiamo con .d2.w2 + h290000{n}1+1*Retina!

1.+
Trash!

Se il secondo numero non era abbastanza grande, il passaggio precedente non avrebbe cambiato nulla e la stringa inizierà comunque con a 1. In tal caso, sostituiamo semplicemente l'intera stringa con Trash!e abbiamo finito.


24
Bene, è successo. Ora possiamo morire tutti felici.
Alex A.

94
Come nota a margine, dato che si tratta di Retina, questo fa spazzare via tutte le altre risposte?
Alex A.

5
Il nostro dio è arrivato!
Kade,

7
OK, quindi la mia promessa di grazia resta valida, ma vorrei vedere una spiegazione approfondita (concettualmente penso di sapere come è stato fatto, ma vorrei vedere i dettagli). Inoltre assegnerò la generosità alla più breve risposta legale della Retina, quindi, gente, la generosità è ancora aperta alle risposte più brevi della Retina!
Trauma digitale

2
@AlexA. No, perché c'è un'altra risposta Retina.
Ismael Miguel,

38

Python, 49

lambda w,h,d:"RTertaisnha!!"[w*w+h*h<=9e4*d*d::2]

Utilizza l'interlacciamento delle stringhe.

Si è rivelato più breve per quadrare entrambi i lati che per usare la norma complessa.

w*w+h*h<=9e4*d*d
abs(w+1j*h)<=300*d

18
Avremmo dovuto stampare Retina!o Trash!! Non ritwittare @ertaisnha !!
Ottimizzatore


2
@Mew ma questo è il contrario;)
Ottimizzatore

Bello, non ho ancora visto che (ab) usa per stampare una o l'altra stringa
Nick T

15

Retina , 312 byte

(\d+) (\d+) (\d+)(?:\.(\d+))?
a$1bc$2dj300ke$3fg$4h9iiiiiiiii8iiiiiiii7iiiiiii6iiiiii5iiiii4iiii3iii2ii1i0
+`(b.*)(d.*)fg(\d)
0$10$2$4fg
+`(a|c|e|j)(\d)(\d*)(i*)((?:b|d|f|k).*h.*\2(i*))
$1$3$4$4$4$4$4$4$4$4$4$4$6$5
g`(i+)
Q$1R$1
+`Q(i+)Ri
$1Q$1R
+`(j(i*).*e)i(.*f)
$1$3$2
a(i*).*c(i*).*f\1\2.*
Trash!
.*0
Retina!

Questo richiede un po 'di tempo per funzionare, ma sembra funzionare.

Probabilmente si potrebbe giocare a golf molto di più ...

Spiegazione:

(\d+) (\d+) (\d+)(?:\.(\d+))?
a$1bc$2dj300ke$3fg$4h9iiiiiiiii8iiiiiiii7iiiiiii6iiiiii5iiiii4iiii3iii2ii1i0

Aggiungi tag per rendere più conveniente l'analisi della stringa e aggiungi un po 'di spazzatura per rendere più semplice la conversione in base 1 e aggiungi un 300 da moltiplicare per dopo

+`(b.*)(d.*)fg(\d)
0$10$2$4fg

Aggiungi 0s alla larghezza e all'altezza, mentre aggiungi la parte decimale della diagonale alla parte intera. Al termine, la diagonale sarà un numero intero e la larghezza e l'altezza saranno moltiplicate per il numero di 10secondi necessari.

+`(a|c|e|j)(\d)(\d*)(i*)((?:b|d|f|k).*h.*\2(i*))
$1$3$4$4$4$4$4$4$4$4$4$4$6$5

Converti tutti i numeri in base 1, utilizzando la tabella di ricerca che ho aggiunto nel primo passaggio

g`(i+)
Q$1R$1

Preparati a quadrare tutti i numeri

+`Q(i+)Ri
$1Q$1R

Quadrare ogni numero

+`(j(i*).*e)i(.*f)
$1$3$2

Moltiplica il quadrato della diagonale per il quadrato dei 300 che abbiamo inserito nel primo passaggio

a(i*).*c(i*).*f\1\2.*
Trash!

Se la larghezza aggiunta all'altezza si adatta al prodotto che abbiamo appena calcolato, la densità dei pixel è troppo bassa ed è Cestino!

.*0
Retina!

Altrimenti, è Retina!


14

CJam, 30 29 27 byte

q~mh300/<"Retina""Trash"?'!

Richiede input per essere in forma di diagonal width height

AGGIORNAMENTO: 1 byte salvato grazie a Dennis!

Provalo online qui


9

APL, 40 36 byte

Risparmiato 4 byte grazie a Dennis!

{(9E4×⍵*2)<+/⍺*2:'Retina!''Trash!'}

Questo crea una funzione diadica senza nome che accetta i primi due argomenti a sinistra e il terzo a destra. Verifica se la somma dei quadrati dei valori di sinistra è maggiore di 300 ^ 2 volte il quadrato di quello di destra. L'output viene stampato di conseguenza.

Puoi provarlo online !


Avrebbe dovuto essere aggiornato prima di pubblicare ... È possibile salvare qualche byte byte prendendo i primi due argomenti a sinistra.
Dennis,

@Dennis Grazie per il tuo aiuto! Ho considerato di eliminare la mia risposta quando ho visto la tua perché la tua era migliore. : P
Alex A.

9

TI-BASIC, 43

Prende larghezza e altezza attraverso la schermata iniziale come un elenco di due elementi e diagonale attraverso Input.

Input D
If 300D>√(sum(Ans²
Then
Disp "Retina!
Else
"Trash!

Le lettere minuscole a due byte di TI-BASIC aggiungono 7 byte ( i, essendo l'unità immaginaria, è un byte) che lo rendono piuttosto non competitivo. Per fortuna, !è anche un byte perché rappresenta la funzione fattoriale.


9

JavaScript ES6, 49 byte

(w,h,d)=>Math.hypot(w,h)/d>300?'Retina!':'Trash!'

Odio che JavaScript abbia operatori matematici così lunghi. Ma anche se ci fosse un Math.pythagoreanquesto sarebbe più breve.


Qualcuno ti sta spiegando il downvote?
Downgoat,

Probabilmente per essere troppo lungo.
lirtosiast

1
@ThomasKwa Python è più corto di 1 byte
Ottimizzatore

5
Invece di calcolare la radice quadrata, potrebbe essere più breve se si confrontano i quadrati dei valori.
Reto Koradi,

4
@RetoKoradi Sì, è più breve:(w,h,d)=>w*w+h*h>9e4*d*d?'Retina!':'Trash!'
pepkin88,

8

Excel, 44 byte

Digita i tuoi input in queste celle.

  • A1 = Larghezza in pixel
  • B1 = Altezza in pixel
  • C1 = Diagonale in pollici

E questa formula dà il tuo risultato:

=IF((300*C1)^2<A1^2+B1^2,"Retina!","Trash!")

4
Ho provato a golf 2 byte da questo digitando 9E4*C1^2invece di (300*C1)^2... questo produce una lunghezza di 42. Tuttavia, digitando 9E4una formula in Excel, verrà modificato 90000non appena si preme invio. :(
Ross Presser,

7

Prolog, 51 byte

a(W,H,D,R):-9e4*D*D<W*W+H*H,R="Retina!";R="Trash!".

a(8192,4320,100.0,R).Uscite in esecuzione :R = "Trash!" .

Modifica: grazie a @PaulButcher per la correzione di un caso limite e il golfing di un byte.


Questo restituisce "Retina!", Quando la densità è 300 (ad es. 180 240 1 -> Trash!) Dall'esempio. Fortunatamente, dato che puoi radere via due personaggi con notazione, cambiando >per >=lasciarlo a 52:b(W,H,D,R):-9e4*D*D>=W*W+H*H,R="Trash!";R="Retina!".
Paul Butcher,

@PaulButcher L'utilizzo di 9e4 invece di 90000 in realtà elimina 2 caratteri, non uno. Quindi hai abbreviato efficacemente la mia risposta di un byte, oltre a correggere questo caso limite, grazie.
Fatalizza il

1
Molto bene! È bello vedere un esempio di Prolog ragionevolmente breve.
Paul Butcher,

@PaulButcher Hai rasato un altro byte usando e <invece >=scambiando i risultati delle due stringhe ...
Fatalizza il

5

JavaScript (ES6), 45 byte

f=(w,h,d)=>w*w+h*h>d*d*9e4?'Retina!':'Trash!'

CoffeeScript, 47 byte

Nessun operatore ternario, ma c'è esponenziazione (che non aiuta nell'ultimo tentativo).

f=(w,h,d)->w*w+h*h>d*d*9e4&&'Retina!'||'Trash!'

# Previous attempt
f=(w,h,d)->(w*w+h*h)**.5/d>300&&'Retina!'||'Trash!'

1
Secondo le specifiche, non è necessario disporre della funzione denominata ( f=). È possibile tagliare 2 byte in tutte le versioni.
Kroltan,

5

O , 40 37 byte

jjjrmd \ / 'iu> { "Retina!" p} { "Trash!" p}?

Molti byte per la formattazione di input: \

Provalo online


5

Pure Bash (no bc / altri comandi esterni), 138 136 135 82 83 byte

a=${3#*.}
d=${a//?/0}
r=(Trash Retina)
echo ${r[$1$d**2+$2$d**2>90000*${3/./}**2]}!

Ho deciso di provare a farlo in puro bash. Probabilmente ho fatto alcune evidenti inefficienze in quanto questo è il mio primo gioco di golf a codice, ma ho MOLTO familiarità con bash e in passato mi sono divertito a provare a scrivere cose che non usano alcun comando esterno (cioè puro bash).

L'istruzione printf è la più fastidiosa. Qualcuno ha idee migliori per riempire i numeri con zero?

EDIT: salvato due byte, risulta printf prenderà un argomento vuoto per zero. Ho salvato un altro byte, risulta che avevo precedentemente contato in modo errato e che l'assegnazione dell'output di printf a una variabile è inferiore rispetto all'uso di -v.

EDIT2: Grazie a Digital Trauma nei commenti, questo è ora molto più significativo. Trucchi: usare il supporto regex di bash per sostituire la stringa di cifre con zero invece di contarla, quindi stampare quel numero di zero (sembra ovvio quando lo metto in quel modo ...), memorizzare le stringhe in un array bash per salvare un'eco, e tenendo conto di una leggera modifica delle regole, ciò significa che è possibile terminare tutti i numeri di input in .0.

EDIT3: aggiunto un byte per correggere il bug introdotto dalla modifica suggerita da Digital Trauma.


Qualcosa del genere per un punteggio di 102: a=${3#*.};d=${a/./0};((${#a}-${#3}))||d=;r=(Trash Retina);echo ${r[$1$d**2+$2$d**2>90000*${3/./}**2]}! (puoi sostituirlo ;con newline - Stavo solo cercando di ottenerlo in un commento).
Trauma digitale il

E se supponi che i numeri interi di densità finiscano in .0(ok, penso), allora puoi segnare 82:a=${3#*.};d=${a/./0};r=(Trash Retina);echo ${r[$1$d**2+$2$d**2>90000*${3/./}**2]}!
Trauma digitale

L'esempio originale aveva alcuni che non finivano con .0, ma noto che la domanda ora è stata modificata, quindi risparmierò parecchio. Grazie per le idee! Mi piace particolarmente la tua idea di ridurre le due dichiarazioni di eco; Stavo cercando di capire come farlo, per qualche motivo non mi è venuto in mente di usare un array! Per qualche ragione, ANCORA non mi è mai venuto in mente che potresti usare ** ... Proverò a verificare la tua risposta, sono un po 'confuso su come funziona $ d qui, ma lo capirò.
Muzer,

Non $dè troppo complicato. acontiene le cifre della densità dopo il punto decimale. d=${a/./0}sostituisce tutte quelle cifre con zeri. Quindi possiamo concedere quegli zeri alla fine di we hmoltiplicarli per la stessa potenza di dieci che si ottiene rimuovendo il punto decimale da d.
Digital Trauma,

1
Saluti, ho pensato che stavo impazzendo per un minuto!
Muzer,

4

dc, 41 byte

[[Retina!]pq]sr?d*rd*+vr/300<r[Trash!]p

Richiede l'inserimento di args in d, w, hordine - spero che vada bene.

Uscita di prova:

$ for t in \
> "4.95 1920 1080" \
> "5.96 2560 1440" \
> "10.5 1920 1080" \
> "0.04 10 10" \
> "19 4096 2160" \
> "100.00 8192 4320" \
> "11.18 3000 1500" ; do \
> echo $t | dc -e'9k[[Retina!]pq]sr?d*rd*+vr/300<r[Trash!]p'
> done
Retina!
Retina!
Trash!
Retina!
Trash!
Trash!
Retina!
$ 

3

Julia, 46 45 42 byte

f(w,h,d)=w^2+h^2>9e4d^2?"Retina!":"Trash!"

Ciò crea una funzione che accetta tre valori numerici e restituisce una stringa.

È un'implementazione diretta della formula, appena riorganizzata un po '. Entrambe le parti della disuguaglianza furono moltiplicate per dpoi quadrate.


3

R, 59 55 byte

Come una funzione senza nome ora

function(h,w,d)if(h^2+w^2>9e4*d^2)'Retina!'else'Trash!'

Implementazione molto semplice, che elimina la necessità di riferimenti all'indice.

Precedente

cat(if((n=scan()^2)[1]+n[2]>9e4*n[3])'Retina!'else'Trash!')

Abbastanza semplice, ottieni l'input dalla scansione in un vettore (linea singola, spazio separato o multilinea). Square il vettore. Fai il calcolo e cat il risultato.


3

MATLAB - 49 45 byte

c={'Trash!','Retina!'};c{(w*w+h*h>9e4*d*d)+1}

Prima ho dovuto dichiarare un array di celle che contiene Trash!e Retina!che sono memorizzati nelle posizioni 1 e 2 dell'array di celle. Successivamente, utilizzo l'osservazione osservata da molti per riorganizzare l'equazione in modo da verificare la condizione utilizzando solo l'aritmetica dei numeri interi. Ho rappresentato 90000 come 9e4per salvare alcuni byte. Se questa condizione è vera, viene emesso un 1, altrimenti viene emesso uno 0. Uso questo output per indicizzare direttamente nell'array di celle. Poiché MATLAB inizia a indicizzare da 1, ho anche dovuto aggiungere 1 per completare l'indicizzazione. La cosa bella è che l'aggiunta truecon 1 dà 2, mentre l'aggiunta falsecon 1 dà 1. Questo produrrà Trash!o Retina!nel prompt dei comandi MATLAB.

Esempio

>> w=1920;h=1080;d=4.95;
>> c={'Trash!','Retina!'};c{(w*w+h*h>9e4*d*d)+1}

ans =

Retina!

non è necessario int8, vero + 1 è un doppio (2).
Jonas,

@Jonas L'ho provato. Non cambierebbe in 2 su MATLAB R2013a ... Strano.
rayryeng - Ripristina Monica il

@Jonas - Ho dovuto incapsulare l' logicalespressione tra parentesi perché funzioni. Ordine delle operazioni ... d'oh. Grazie per il consiglio!
rayryeng - Ripristina Monica il

Bel approccio! (Ci ho provato hypotma il tuo w*w+h*h>9e4*d*dè più corto). Tuttavia, questo soddisfa i requisiti della domanda? È un programma, non una funzione. Quindi dovrebbe prendere w, he dcome input. Presumo che significhi stdin, come al solito nella sfida del codice
Luis Mendo,

@LuisMendo ah dovrò cambiarlo! Grazie
Rayryeng - Ripristina Monica il

3

XSLT, 400 byte

Questo è il debutto di un linguaggio mai visto prima su PPCG e spero di usarlo di più in futuro man mano che lo imparerò di più.

Codice:

<?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:template match="input"><xsl:variable name="n" select="for $i in tokenize(.,'[^\d\.]+')return number($i)" /><xsl:choose><xsl:when test="$n[1]*$n[1]+$n[2]*$n[2]>90000*$n[3]*$n[3]">Retina!</xsl:when><xsl:otherwise>Trash!</xsl:otherwise></xsl:choose></xsl:template></xsl:stylesheet>

Abbastanza stampato

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="input">
        <xsl:variable name="n" select="for $i in tokenize(.,'[^\d\.]+')return number($i)" />
        <xsl:choose>
            <xsl:when test="$n[1]*$n[1]+$n[2]*$n[2]>90000*$n[3]*$n[3]">
                Retina!
            </xsl:when>
            <xsl:otherwise>
                Trash!
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

Appunti:

Dato che XSLT non ha modo di ricevere input tramite STDIN, dobbiamo usare un file XML, con l'input tra due <input>tag. Naturalmente, questo metodo ha i suoi limiti, ma funzionerà perfettamente per la maggior parte delle sfide.

Esempio I / O

File di input:

<?xml version="1.0" encoding="ISO-8859-1"?>
<input>3000 1500 11.18</input> 

File di uscita:

<?xml version="1.0" encoding="UTF-8"?>Retina!

File di input:

<?xml version="1.0" encoding="ISO-8859-1"?>
<input>1920 1080 10.5</input>

File di uscita:

<?xml version="1.0" encoding="UTF-8"?>Trash!

2

C # (81)

string D(int w,int h,double d){return Math.Sqrt(w*w+h*h)/d>300?"Retina":"Trash";}

Ungolfed:

string Density(int width, int height, double diagonal)
{
    return Math.Sqrt(width * width + height * height) / diagonal > 300 ? "Retina" : "Trash";
}

È possibile ridurre questo fino a 73 con il trucco molti altri hanno utilizzato per ri-scrivere la formula e rimuovere l'operazione sqrt: string D(int w,int h,double d){return w*w+h*h>9e4*d*d?"Retina":"Trash";}. Ma devi anche aggiungere in !ogni stringa in modo che possa tornare a 75 penso.
goric,

2

Rapido, 77 byte

Le declerazioni dei parametri di funzione indicano che occupa più caratteri di quanto dovrebbe:

func r(w:Float,h:Float,d:Float){print((w*w+h*h)>9e4*d*d ?"Retina!":"Trash!")}


2

Rapido, 56 byte

let r={print($0*$0+$1*$1>9e4*$2*$2 ?"Retina!":"Trash!")}

Sostanzialmente uguale a quello di GoatInTheMachine ma con parametri di chiusura impliciti

Quando giochi a golf con Swift, dichiari sempre metodi come questo, è molto più breve


2

Haskell, 46

f w h d|w^2+h^2>d^2*9e4="Retina!"|0<1="Trash!"

Quale sistema Haskell dovrebbe essere usato? Non funziona con la versione di Ghci che ho provato, dando <interactive>:2:8: parse error on input '|'.
Ed Avis,

@EdAvis: GHCi non esegue i programmi; per provarlo lì, è necessario let f w h d|….
Ry,

2

C ++ 72 70 byte

void F(int w,int h,float d){cout<<w*w+h*h>9e4*d*d?"Retina!":"Trash!";}

Simile ad altre soluzioni, ho deciso di scaldarmi con il golf del codice.


1
Puoi radere una coppia scrivendo 90000come9e4
Toby Speight,

2

Ecco il mio contributo per questo problema

Rubino, 67 byte in lettura dallo stdin

w,h,d=ARGV.map{|v|Float(v)}
puts w*w+h*h>d*d*9e4?"Retina!":"Trash!"

Ruby, 56 byte in una funzione

Un po 'più corto

def r(w,h,d)
puts w*w+h*h>d*d*9e4?"Retina!":"Trash!"
end

Grazie ai precedenti collaboratori per 9e4!


2

Bash, 85 byte

if [ $(echo "sqrt($1^2+$2^2)/$3"|bc) -gt 300 ];then
echo Retina!
else
echo Trash!
fi

1
Questo non funziona per "3000 1500 11,18". Per impostazione predefinita, bcla precisione è di 0 decimali. Avrai bisogno di impostare scale, o probabilmente puoi cavartela con il bc -lquale imposta implicitamente la scala su 20
Digital Trauma

Oh ok, ho aggiornato la mia risposta. Grazie!
addison

1
Oh, e controlla codegolf.stackexchange.com/questions/15279/… . Ad esempio((`bc<<<"sqrt($1^2+$2^2)/$3"`>300))&&echo Retina!||echo Trash!
Digital Trauma,

2

PHP, 47,43,40 38 byte

<?=sqrt($w*$w+$h*$h)/$d>300?'Retina':'Trash'?>!
<?=sqrt($w*$w+$h*$h)/$d>300?Retina:Trash?>!
<?=$w*$w+$h*$h>9e4*$d*$d?Retina:Trash?>!

<?=hypot($w,$h)/$d>300?Retina:Trash?>!

Richiede register_globals==true(cosa che non dovrebbe mai essere!), Con valori GET w, h, d
- Salvato 4 byte rimuovendo le virgolette attorno alla stringa. Codifica errata, ma funziona.
- Spostato de radice quadrata sull'altro lato dell'equazione, salvando la sqrt()funzione
- Salvato 2 byte passando a hypot()(grazie Lucas Costa)


Dovresti semplicemente dire che questa è una risposta PHP4.1 e non hai bisogno register_globalsdi impostare la direttiva.
Ismael Miguel,

2
Entrambe le opzioni sono ugualmente cattive ahah
Martijn,

2

C # 6, 67 byte

string D(int w,int h,double d)=>w*w+h*h>9e4*d*d?"Retina!":"Trash!";

Questa risposta si basa sulla risposta di Wolfsheads. L'ho ridotto di 8 byte usando una nuova funzionalità di C # 6.


2

JavaScript (ES6) 58 54 43 byte

43 byte

Assegnazione della funzione rimossa (secondo le regole PPCG) (-2), nonché rimozione della radice quadrata e confronto con 900 (300 ^ 2) (-12)

(w,h,d)=>w*w+h*h/d*d>300?"Retina!":"Trash!"

54 byte

Sbarazzarsi delle parentesi unnessesary (-4 byte)

a=(w,h,d)=>Math.sqrt(w*w+h*h)/d>300?"Retina!":"Trash!"

58 byte

a=(w,h,d)=>Math.sqrt((w*w)+(h*h))/d>300?"Retina!":"Trash!"

Spiegazione qui:

a =                           // The function is a
 (w,h,d) =>                   // Accepts the three arguments
   Math.sqrt((w*w)+(h*h))/d   // Calculate pixel density
   > 300                      // Above the threshold
   ? "Retina!"                // If so, return "Retina!"
   : "Trash!"                 // Otherwise return "Trash!"

Questo utilizza operatori ternari per testare la densità e uccide un paio di byte usando le funzioni freccia


1
Puoi accorciarlo evitando la radice quadrata e confrontando invece i quadrati dei valori.
Reto Koradi,

1

Java, 82 74 byte

String g(int w,int h,double d){return 9e4*d*d>w*w+h*h?"Trash!":"Retina!";}

Chiamalo con g(width,height,diagonal)


1
Puoi doubleString g(int w,int h,double x){return 9e4*x*x>w*w+h*h?"Trash!":"Retina!";}
ridurlo

@Geobits Grazie, non mi ero preso il tempo di stanziare i byte sui due approcci, sono contento che tu l'abbia preso!
DeadChex,

1

Clojure, 58 byte

#(if(>(+(* %1%1)(* %2%2))(* %3%3 90000))"Retina!""Trash!")

Ho usato la fantasia matematica di @ Kroltan per accorciare questo. Utilizza argomenti impliciti passati nell'ordine di (w, h, d).

Primo golf Clojure ... Sono stato sorpreso di quanto spazio bianco mi è permesso lasciare

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.