Resistori di valore insolito


23

introduzione

Quando si costruisce un progetto di elettronica, uno schema può richiedere una resistenza di un valore insolito (diciamo, 510 ohm). Controlli il cestino delle parti e scopri di non avere resistori da 510 ohm. Ma hai molti valori comuni sopra e sotto questo valore. Combinando i resistori in parallelo e in serie, dovresti essere in grado di approssimare abbastanza bene il resistore da 510 ohm.

Compito

È necessario scrivere una funzione o un programma che accetta un elenco di valori di resistori (resistori disponibili) e un valore target (che si intende approssimare). Il programma deve considerare:

  • Resistori individuali
  • Due resistori in serie
  • Due resistori in parallelo

Il programma dovrebbe calcolare tutte le possibili combinazioni di 1 e 2 resistori dall'elenco di serie (incluse due copie dello stesso valore di resistenza), calcolare le loro serie e resistenza parallela, quindi ordinare le configurazioni in base alla loro approssimazione al valore target.

Il formato di output dovrebbe essere una configurazione per riga, con una +serie che |indica e che indica il parallelo, e un po 'di spazio o un segno = prima della resistenza netta.

formule

  • La resistenza di un resistore è R1
  • La resistenza netta di due resistori in serie è R1 + R2
  • La resistenza netta di due resistori in parallelo è 1 / (1/R1 + 1/R2)
  • La distanza tra un valore approssimato resistenza e il valore obiettivo può essere calcolato come distanza pseudo-logaritmica, non lineare distanza: dist = abs(Rapprox / Rtarget - 1). Ad esempio, 200 è più vicino a 350 che a 100.
  • Una misura di distanza migliore è la vera distanza logaritmica dist = abs(log(Rapprox/Rtarget)), ma poiché ciò non è stato specificato nella domanda originale, si è liberi di utilizzare entrambe le misurazioni.

punteggio

Il punteggio è misurato in caratteri di codice, secondo le normali regole del golf. Il punteggio più basso vince.

Esempio

Abbiamo in stock i seguenti resistori [100, 150, 220, 330, 470, 680, 1000, 1500, 2200, 3300, 4700]e desideriamo puntare su 510ohm. Il programma dovrebbe generare 143 configurazioni, approssimativamente come mostrato (è possibile modificare il formato, ma assicurarsi che il significato sia facilmente determinabile):

680 | 2200     519.444
1000 | 1000    500.
150 + 330      480.
220 + 330      550.
470            470
680 | 1500     467.89
680 | 3300     563.819
100 + 470      570.
220 + 220      440.
100 + 330      430.
470 | 4700     427.273
680 | 4700     594.052
1000 | 1500    600.
470 | 3300     411.406
680 | 1000     404.762
150 + 470      620.
...
many more rows
...
2200 + 4700    6900.
3300 + 4700    8000.
4700 + 4700    9400.

In questo esempio, la migliore approssimazione di 510 ohm è data in parallelo dai resistori da 680 e 2200 ohm.

Il meglio di ogni lingua finora (1 giugno 2014):

  1. J - 70 caratteri
  2. APL - 102 caratteri
  3. Mathematica - 122 caratteri
  4. Rubino - 154 caratteri
  5. Javascript - 156 caratteri
  6. Julia - 163 caratteri
  7. Perl - 185 char
  8. Python - 270 caratteri

3
@Claudiu Non vi è alcuna differenza elettricamente tra 100 + 150 e 150 + 100; entrambi producono 250 ohm di resistenza e consumano un resistore da 100 ohm e un resistore da 150 ohm, quindi non dobbiamo contare due volte. Tuttavia, dovrebbero essere distinti da 125 + 125, perché anche se questo produce anche 250 ohm, consuma resistori diversi (il che può essere preferibile, dati i nostri conteggi delle parti).
fosgene

3
510 è nella serie E24, quindi non è così insolito avere a portata di mano
Gnibbler,

3
Fosgene, che dire dei ROUV?
carne

3
Non penso che esistano.
fosgene,

1
Di solito non fissiamo scadenze per domande sul code golf, perché potrebbe scoraggiare alcune persone dalla pubblicazione. Puoi sempre modificare le risposte accettate.
Nzall,

Risposte:


6

J - 86 71 70 char

((]/:[|@<:@%~2{::"1])(;a:,<)"0,[:,/(<,.+`|,.+/;+&.%/)"1@;@((<@,.{:)\))

Non mi preoccuperò di spiegare ogni piccolo dettaglio perché molto del codice viene speso per sincronizzare i risultati di diverse funzioni, ma ecco l'essenza del golf:

  • ;@((<@,.{:)\) rende possibile ogni coppia di resistori, da collegare in parallelo o in serie.

  • [:,/(<,.+`|,.+/;+&.%/)"1@ quindi li collega, in parallelo e in serie, creando un grande elenco di possibili connessioni.

  • (;a:,<)"0, aggiunge la possibilità di utilizzare solo un resistore da solo per approssimare.

  • (]/:[|@<:@%~2{::"1])ordina l'elenco delle combinazioni di resistori in base alla distanza pseudologica ( |@<:@%) tra il bersaglio e la resistenza risultante da ciascuna combinazione.

E questo è come usarlo:

   rouv =: ((]/:[|@<:@%~2{::"1])(;a:,<)"0,[:,/(<,.+`|,.+/;+&.%/)"1@;@((<@,.{:)\))
   # 510 rouv 100 150 220 330 470 680 1000 1500 2200 3300 4700      NB. how many?
143
   10 {. 510 rouv 100 150 220 330 470 680 1000 1500 2200 3300 4700  NB. view first 10
+---------+-+-------+
|680 2200 |||519.444|
+---------+-+-------+
|1000 1000|||500    |
+---------+-+-------+
|150 330  |+|480    |
+---------+-+-------+
|220 330  |+|550    |
+---------+-+-------+
|470      | |470    |
+---------+-+-------+
|680 1500 |||467.89 |
+---------+-+-------+
|680 3300 |||563.819|
+---------+-+-------+
|100 470  |+|570    |
+---------+-+-------+
|220 220  |+|440    |
+---------+-+-------+
|100 330  |+|430    |
+---------+-+-------+

Non è necessario visualizzare solo i primi 10 come ho fatto sopra, ma questa è una funzione e J REPL tronca valori di ritorno molto grandi e l'output completo per questo esempio ha 287 righe. Puoi forzare tutto su STDOUT con qualcosa di simile tmoutput toCRLF , LF ,.~ ": blah rouv blaha Windows, rilasciare toCRLFLinux, ma rouvè una funzione e internamente esistono tutte le righe.

Nota:

La domanda sembra essere stata cambiata proprio sotto il nostro naso, e ora la distanza del tronco è definita come abs(log(Rapprox/Rtarget))invece di abs(Rapprox/Rtarget-1). Per correggere ciò nel mio golf, possiamo cambiare |@<:@%in |@^.@%: <:is Decrement mentre ^.is Logarithm.


Sebbene il tuo codice sia apparentemente insondabile, possiamo ancora apprezzare il mistero. Il miglior punteggio dopo un giorno - resisterà?
fosgene,

1
No, non voglio inviare una mail a -. & A: @, @: {@ (({.;
Kilazur,

12

Mathematica, 151 122 caratteri

Si aspetta che la resistenza target venga memorizzata re l'elenco delle resistenze disponibili in l.

SortBy[Join[{#,#}&/@l,Join@@(#@@@Union[Sort/@N@l~Tuples~{2}]&/@{{"+",##,#+#2}&,{"|",##,#*#2/(#+#2)}&})],Abs[#[[-1]]/r-1]&]

Meno golf:

SortBy[Join[{#, #} & /@ l,
  Join @@ (# @@@ 
       Union[Sort /@ N@l~Tuples~{2}] & /@ {{"+", ##, # + #2} &, {"|", ##, 
        #*#2/(# + #2)} &})], Abs[#[[-1]]/r - 1] &]

Il formato di output differisce da quello suggerito ma le configurazioni sono facilmente determinabili. L'output è un elenco di configurazioni. Ogni configurazione ha una delle seguenti forme:

{R1, Total}
{"+", R1, R2, Total}
{"|", R1, R2, Total}

Quindi leggono i primi tre elementi dell'output

{{"|", 680., 2200., 519.444}, {"|", 1000., 1000., 500.}, {"+", 150., 330., 480.}, ...}

Se stai bene con i numeri razionali, potrei salvare due personaggi dall'omettere N@. Cioè, il primo elemento (ad esempio) verrebbe restituito come 4675/9anziché 519.444.


Bel lavoro. Mi hai battuto (e con un codice più breve).
DavidC,

15
Didn '# your den # is # w @ rn you @ g @ ins # e @ # ing # h @ # much syn # @ c # ic sug @ r?
fosgene

2
@ N @ l Tuples? È una specie di malattia dei programmatori?
clabacchio,

@clabacchio fantastico, non l'ho nemmeno visto. fosgene, deve aver dimenticato di menzionarlo ... o forse gli piace anche giocare a golf ...
Martin Ender,

10

APL (102)

{V←{⊃¨⍺{⍺,⍺⍺,⍵,'=',⍺⍵⍵⍵}⍺⍺/¨Z/⍨≤/¨Z←,∘.,⍨⍵}⋄K[⍋|¯1+⍺÷⍨0 4↓K←↑('|'{÷+/÷⍺⍵}V⍵),('+'+V⍵),{⍵,'  =',⍵}¨⍵;]}

Questo prende la resistenza target come argomento sinistro e un elenco di resistori disponibili come argomento giusto.

Spiegazione:

  • V←{... }: Vè una funzione che:
    • Z/⍨≤/¨Z←,∘.,⍨⍵: trova ogni combinazione unica di due valori in ,
      • Z←,∘.,⍨⍵: unisci ciascun valore con ogni valore in , archivia in Z,
      • Z/⍨≤/¨Z: selezionare tra Zquelle combinazioni in cui il primo valore è inferiore o uguale al secondo valore
    • ⍺{... }⍺⍺/¨: e quindi applica la seguente funzione, associata alla funzione sinistra ( ⍺⍺) a destra e all'argomento sinistro ( ) a sinistra, a ciascuna coppia:
      • ⍺,⍺⍺,⍵,'=',⍺⍵⍵⍵, l'argomento left, seguito dall'argomento left bound, seguito dall'argomento right, seguito da =, seguito dalla funzione right ( ⍵⍵) applicata a entrambi gli argomenti. (Questa è la funzione di formattazione X [configuration] Y [equals] (X [fn] Y).)
    • ⊃¨: e quindi deseleziona ogni elemento.
  • {⍵,' =',⍵}¨⍵: per ogni elemento in , effettuare le configurazioni per i singoli resistori. ( , Niente, niente, =, ).
  • ('+'+V⍵): usa la Vfunzione per effettuare tutte le configurazioni seriali (il carattere è '+'e la funzione è +).
  • '|'{÷+/÷⍺⍵}V⍵: usa la Vfunzione per effettuare tutte le configurazioni parallele (carattere è '|'e funzione è {÷+/÷⍺⍵}, inverso della somma dell'inverso degli argomenti).
  • K←↑: trasformalo in una matrice e conservalo in K.
  • 0 4↓K: rilascia le 4 prime colonne da K, lasciando solo i valori di resistenza.
  • |¯1+⍺÷⍨: calcola la distanza tra e ciascuna configurazione.
  • K[⍋... ;]: ordina Kper distanza.

3
Prenderò la tua parola che funziona. Nella mia tastiera mancano molti di questi personaggi: D
fosgene

@phosgene: se vuoi testarlo, puoi scaricare una versione di prova di Dyalog APL su dyalog.com. Quindi incolla il tutto, dovrebbe funzionare. Gli argomenti vanno ai lati, quindi per esempio:510 code_here 100, 150, 220, 330, 470, 680, 1000, 1500, 2200, 3300, 4700
marinus

@phosgene Puoi provare questo interprete online, anche se non fornisce l'output completo, puoi verificare che le poche righe iniziali e le ultime siano uguali.
user12205,

Verificato! APL è qualcosa di esoterico.
fosgene,

1
@ace TryAPL è molto limitato e di solito non funziona. Che capita di lavorare su questo è solo una coincidenza. Non supporta eval ( ), I / O ( ) o qualsiasi variabile di sistema (anche ⎕UCSe ⎕Anon funziona), quindi la maggior parte dei programmi APL non verrà eseguita. Fornirà effettivamente un ERRORE DI SINTASSI se viene utilizzata una delle funzioni disabilitate. Il fatto che questa non capiti di utilizzare una delle molte funzioni che TryAPL non supporta, è una coincidenza.
Marinus,

4

Python 3 - 250 247 270 byte

from itertools import*
import sys
r=sys.argv[1:]
t=int(r.pop())
p=set(map(tuple,map(sorted,product(r,r))))
a=[('+'.join(b),sum(map(int,b)))for b in p]+[('|'.join(b),1/sum(map(lambda n:1/int(n),b)))for b in p]
for s in sorted(a,key=lambda b:abs(float(b[1])/t-1)):print(s)

Esegui in questo modo:

python resistors.py 100 150 220 330 470 680 1000 1500 2200 3300 4700 510

(ovvero un elenco di resistori delimitati da spazi, con il valore target alla fine)

Produzione:

('2200|680', 519.4444444444445)
('1000|1000', 500.0)
('150+330', 480)
('220+330', 550)
('1500|680', 467.88990825688074)
('3300|680', 563.8190954773869)

[snip]

('2200+4700', 6900)
('3300+4700', 8000)
('4700+4700', 9400)

Direi che l'output, diciamo, 680|2200e 2200|680separatamente è ancora abbastanza chiaro. Se questo è inaccettabile, posso cambiarlo, ma mi costerà byte.Non era accettabile Mi è costato byte. Ora ordino le tuple prima di buttarle nel set, altrimenti la soluzione è identica.


Certo, l'output mi sembra molto chiaro!
fosgene,

Tuttavia, stai contando due volte le cose. 150 + 330 è elettricamente identico a 330 + 150, quindi solo uno di essi dovrebbe apparire nel risultato (143 configurazioni totali per l'esempio).
fosgene,

@pho Ok, riparato. Alcuni byte extra ma la soluzione dovrebbe essere valida ora.
undergroundmonorail,

Inoltre penso che il tuo programma non cerchi affatto un singolo resistore (a + = [(a, a) per a in r]). Puoi saltare a = ... mentre usi esattamente una volta. A questo proposito import sys;r=sys.args[1:], usa r=input().split()e dì che devi dare i valori su stdin. Finalmente: usi 1/sum(1/int(n)for n in b)invece di 1/sum(map(lambda n:1/int(n),b). Tutto sommato, dovrebbero essere 274 caratteri
WorldSEnder

Ho appena giocato a un altro carattere: Usa print (* ordinato (...), sep = '\ n')
WorldSEnder

3

Ruby 2.1, 156 154 byte

s=->(a,z){c={};a.map{|e|a.map{|f|c[e]=e;c[e+f]="#{e}+#{f}";c[1/(1.0/f+1.0/e)]="#{e}|#{f}"}};c.sort_by{|k,|(k/z.to_f-1).abs}.map{|e|puts"#{e[1]}=#{e[0]}"}}

Ungolfed:

s =->(a,z) {
  c={}
  a.map{|e|
    a.map{|f|
      c[e]=e
      c[e+f]="#{e}+#{f}"
      c[1/(1.0/f+1.0/e)]="#{e}|#{f}"
    }
  }
  c.sort_by{|k,|
    (k/z.to_f-1).abs
  }.map{|e|
    puts "#{e[1]}=#{e[0]}"
  }
}

Cosa fa:

  • Per ogni valore ein a;
    • Scorri a, calcolando i valori singoli, in serie e paralleli come chiavi dei valori stampati nell'hash c;
  • Determina la distanza da zper ciascun tasto c; e,
  • Per ogni valore e[1]per ogni chiave e[0]in c, stampare e[1]=e[0].

Esempio di utilizzo:

s[[100, 150, 220, 330, 470, 680, 1000, 1500, 2200, 3300, 4700], 510]

Uscita campione:

2200|680=519.4444444444445
1000|1000=500.0
330+150=480
330+220=550
470=470
1500|680=467.88990825688074
3300|680=563.8190954773869
.
.
.
4700+1500=6200
3300+3300=6600
4700+2200=6900
4700+3300=8000
4700+4700=9400

3

JavaScript (ECMAScript 6) - 186 caratteri

f=(R,T)=>(D=x=>Math.abs(x[3]/T-1),r={p:(x,y)=>x*y/(x+y),s:(x,y)=>x+y},[...[[x,0,0,x]for(x of R)],...[[x,y,z,r[z](x,y)]for(x of R)for(y of R)for(z in r)if(x<=y)]].sort((a,b)=>D(a)-D(b)))

Ingresso:

  • Una gamma Rdi resistenze; e
  • T, la resistenza target.

Produzione:

Una matrice di array (ordinati per distanza da T) ciascuno contenente:

  • il valore del resistore più piccolo;
  • il valore del resistore superiore (o 0 se un resistore solitario);
  • p, so 0 se i resistori sono in parallelo, seriale o solitario; e
  • la resistenza netta.

Spiegazione:

f=(R,T)=>(                               // Create a function f with arguments R & T
  D=x=>Math.abs(x[3]/T-1),               // A function D to calculate relative
                                         // distance from the target value
  r={p:(x,y)=>x*y/(x+y),s:(x,y)=>x+y},   // An object containing the formulae
                                         // to calculate resistance in serial and parallel
  solitary = [[x,0,0,x]for(x of R)],     // Create an array of solitary resistors
  pairs =                                // Use Array Comprehension to create the array of
   [[x,y,z,r[z](x,y)]                    // arrays
      for(x of R)                        // for each resistor value
      for(y of R)                        // for each resistor value (again)
      for(z in r)                        // for both serial & parallel
      if(x<=y)],                         // where the first resistor value is smaller than the second
  [
    ...solitary,                         // Use the spread ... operator to combine
    ...pairs                             // the two arrays
  ]
    .sort((a,b)=>D(a)-D(b))              // Sort the arrays by minimum distance
                                         // and return.
)

Manca un singolo resistore (len di uscita, ad esempio, l'ingresso è 132 anziché 143). Vorrei prendere in prestito il trucco della comprensione dell'array, se solo potessi capirlo ...
edc65,

Ah,
ho

3

Julia - 179 163 byte

f(t,s)=(\ =repmat;m=endof(s);A=A[v=(A=s\m).>=(B=sort(A))];B=B[v];F=[s,C=A+B,A.*B./C];n=sum(v);print([[s P=[" "]\m P;A [+]\n B;A [|]\n B] F][sortperm(abs(F-t)),:]))

Funziona allo stesso modo della versione precedente, ma l'argomento nell'istruzione print è stato organizzato in modo leggermente diverso per ridurre il numero di parentesi quadre necessarie. Salva 4 byte. L'assorbimento della creazione del vettore di spazi nell'argomento print consente di risparmiare 2 byte in più. È anche passato dall'uso di "trova" per ottenere gli indici rilevanti all'utilizzo della forma logica. Salva 6 byte. L'assorbimento del calcolo del vettore indice nella regolazione di A ha salvato altri 2 byte. Infine, la sostituzione di endof (v) con la somma (v) ha salvato altri 2 byte. Risparmio totale: 16 byte.

Vecchia versione:

f(t,s)=(\ =repmat;m=endof(s);A=s\m;v=find(A.>=(B=sort(A)));A=A[v];B=B[v];F=[s,C=A+B,A.*B./C];n=endof(v);P=[" "]\m;print([[s,A,A] [P,[+]\n,[|]\n] [P,B,B] F][sortperm(abs(F-t)),:]))

All'interno della funzione, ecco cosa sta facendo:

\ =repmat            # Overloads \ operator to save lots of characters
m=endof(s)           # Length of input s ("Stock")
A=s\m                # Equivalent to repmat(s,m) (see first command)
B=sort(A)            # Same as A but sorted - rather than cycling through
                     # the resistors m times, it repeats each one m times
v=find(A.>=B)        # Identify which pairs for A,B have A>=B
A=A[v];B=B[v]        # Remove pairs where A<B (prevents duplicates)
F=[s,C=A+B,A.*B./C]  # Constructs vector containing results for single resistor,
                     # resistors in series, and resistors in parallel
n=endof(v)           # equivalent to n=(m+1)m/2, gets number of relevant pairs
P=[" "]\m            # Construct array of blank entries for use in constructing output
print([[s,A,A] [P,[+]\n,[|]\n] [P,B,B] F][sortperm(abs(F-t)),:]))
# The following are the components of the argument in the print statement:
[s,A,A]              # Set of resistor values for resistor 1
[P,[+]\n,[|]\n]      # Operator column, prints either nothing, +, or |
[P,B,B]              # Set of resistor values for resistor 2 (blank for single resistor)
F                    # Contains resulting equivalent resistance
[sortperm(abs(F-t)),:] # Determines permutation for sorting array by distance from Target t
                     # and applies it to array

Uscita campione:

julia> f(170,[100,220,300])
300  |  300  150
100  +  100  200
300  |  220  126.92307692307692
220          220
220  |  220  110
100          100
300  |  100  75
220  |  100  68.75
100  |  100  50
300          300
220  +  100  320
300  +  100  400
220  +  220  440
300  +  220  520
300  +  300  600

Bello! Non vedo molti invii di Julia: sta crescendo in popolarità?
fosgene,

@phosgene - Spero di si; Le invierò principalmente perché mi stanno dando ulteriore esperienza con la lingua.
Glen O,

2

Javascript (E6) 156 162 164 186

Ultima modifica Supponendo che tutti i valori di resistenza> 0, è possibile utilizzarli per la condizione di loop

F=(t,s)=>{D=a=>Math.abs(a[1]/t-1);for(i=r=[];a=s[j=i++];r[l]=[a,a])for(;b=s[j--];)l=r.push([a+'+'+b,c=a+b],[a+'|'+b,a*b/c]);return r.sort((a,b)=>D(a)-D(b))}

Utilizzo: F(510, [100, 150, 220, 330, 470, 680, 1000, 1500, 2200, 3300, 4700])

Ungolfed

F = (t,s) => 
{
  D = a => Math.abs(a[1]/t-1);
  for (i=r=[]; a=s[j=i++]; r[l]=[a,a])
    for(; b=s[j--];)
      l = r.push([a+'+'+b, c=a+b], [a+'|'+b, a*b/c]);
   return r.sort((a,b) => D(a)-D(b))
}

1
Deve spingere (punteggio, più basso)!
fosgene,

L'ultima volta che ho controllato, tutti i miei resistori erano valutati positivamente. Penso che sia un presupposto sicuro.
fosgene,

1

Javascript, 248 byte

function r(T,L){R=[],O="";for(i in L){R.push([a=L[i],a]);for(j=i;j<L.length;)b=L[j++],s=a+b,R.push([a+"+"+b,s],[a+"|"+b,a*b/s])}R.sort(function(a,b){A=Math.abs;return A(a[1]/T-1)-A(b[1]/T-1)});for(i in R)q=R[i],O+=q[0]+"="+q[1]+"\n";console.log(O)}

Utilizzo: r(510, [100, 150, 220, 330, 470, 680, 1000, 1500, 2200, 3300, 4700]);

Produzione

670|2200=519.4444444444445
1000|1000=500
150+330=480

(...such rows...)

2200+4700=6900
3300+4700=8000
4700+4700=9400

0

Perl, 213 199 185 byte

213 byte:

$t=pop;sub t{abs 1-(split/=/,pop)[1]/$t}sub S{$_[0]+$_[1]}sub P{$_[0]*$_[1]/&S}$"=',';@i=@ARGV;say for sort{t($a)<=>t($b)}grep s!(..\b(\d+)\b,?\b(\d+)?\b\))=\K(??{$2<$3})!$1!ee&&/\d$/,<{S,P}({@i},{@i})= S({@i})=>;

199 byte:

$t=pop;sub t{abs 1-(split/=/,pop)[1]/$t}sub S{$_[0]+$_[1]}sub P{$_[0]*$_[1]/&S}$"=',';@i=@ARGV;say for sort{t($a)<=>t($b)}grep/(..(\d+),?(\d+)?\))/&&$2>=$3&&($_.=eval$1),<{S,P}({@i},{@i})= S({@i})=>;

185 byte:

$t=pop;sub t{abs 1-$_[0]=~s!.*=!!r/$t}sub S{$_[0]+$_[1]}sub P{$_[0]*$_[1]/&S}$"=',';$i="{@ARGV}";say for sort{t($a)<=>t$b}grep{my($x,$y)=/\d+/g;$_.='='.eval,$x>=$y}<{S,P}($i,$i) S($i)>

Passa tutte le resistenze disponibili come argomenti. La resistenza target dovrebbe essere l'ultima:

$ perl -E 'code' R1 R2 R3 ... Rn target

Come funziona (vecchio codice)

  • Definire subroutine SeP calcolare la somma e i valori paralleli di due resistori.

  • Impostare $"su "," per interpolare @ARGVall'interno globdell'operatore

  • <{S,P}({@i},{@i})= S({@i})=> genera un cartesiano di tutte le possibilità:

    S (100.100), S (100.150), S (100.220), ... P (100.100), P (100.150) ... S (100), S (150) ...

  • Combina s///eecon grepper valutare le resistenze equivalenti e filtrare le ripetizioni indesiderate (eseguite da (??{$2<$3})e/\d$/

  • sort per fitness calcolato in subroutine t

Modifiche nel nuovo codice

  • Evitare l'uso di s///ee, utilizzare regex più breve con controllo condizionale eeval dentrogrep

  • Sostituisci le ripetizioni di "{@i}" with $ i`

  • Presentare $x, $yinvece di$2 ,$3

  • Sostituire split/=/,pop con$_[0]=~s!!!r

  • Non è necessario il trascinamento ;

  • eval; è equivalente a eval $_;

  • Aggiungi =insieme aeval risposta -ed invece di dichiararla in anticipo

Produzione:

Prappresenta i resistori in parallelo, Srappresenta i resistori in serie.

P(2200,680)=519.444444444444
P(1000,1000)=500
S(330,150)=480
S(330,220)=550
S(470)=470
P(1500,680)=467.889908256881
P(3300,680)=563.819095477387
S(470,100)=570
S(220,220)=440
S(330,100)=430
P(4700,470)=427.272727272727
P(4700,680)=594.052044609665
P(1500,1000)=600
P(3300,470)=411.405835543767
P(1000,680)=404.761904761905
S(470,150)=620
P(2200,470)=387.265917602996
S(220,150)=370
S(330,330)=660
P(1500,470)=357.868020304569
S(680)=680
P(680,680)=340
P(2200,1000)=687.5
S(330)=330
S(470,220)=690
S(220,100)=320
P(1000,470)=319.727891156463
P(4700,330)=308.349900596421
S(150,150)=300
P(3300,330)=300
P(2200,330)=286.95652173913
P(680,470)=277.913043478261
P(1500,330)=270.491803278689
P(1500,1500)=750
P(3300,1000)=767.441860465116
S(150,100)=250
P(1000,330)=248.12030075188
S(680,100)=780
P(470,470)=235
P(680,330)=222.178217821782
S(470,330)=800
S(220)=220
P(4700,220)=210.162601626016
P(3300,220)=206.25
S(100,100)=200
P(2200,220)=200
P(4700,1000)=824.561403508772
P(470,330)=193.875
P(1500,220)=191.860465116279
S(680,150)=830
P(1000,220)=180.327868852459
P(680,220)=166.222222222222
P(330,330)=165
S(150)=150
P(470,220)=149.855072463768
P(4700,150)=145.360824742268
P(3300,150)=143.478260869565
P(2200,150)=140.425531914894
P(1500,150)=136.363636363636
P(330,220)=132
P(1000,150)=130.434782608696
P(2200,1500)=891.891891891892
P(680,150)=122.89156626506
S(680,220)=900
P(470,150)=113.709677419355
P(220,220)=110
P(330,150)=103.125
S(100)=100
P(4700,100)=97.9166666666667
P(3300,100)=97.0588235294118
P(2200,100)=95.6521739130435
P(1500,100)=93.75
P(1000,100)=90.9090909090909
P(220,150)=89.1891891891892
P(680,100)=87.1794871794872
P(470,100)=82.4561403508772
S(470,470)=940
P(330,100)=76.7441860465116
P(150,150)=75
P(220,100)=68.75
P(150,100)=60
P(100,100)=50
S(1000)=1000
S(680,330)=1010
P(3300,1500)=1031.25
S(1000,100)=1100
P(2200,2200)=1100
P(4700,1500)=1137.09677419355
S(680,470)=1150
S(1000,150)=1150
S(1000,220)=1220
P(3300,2200)=1320
S(1000,330)=1330
S(680,680)=1360
S(1000,470)=1470
P(4700,2200)=1498.55072463768
S(1500)=1500
S(1500,100)=1600
S(1500,150)=1650
P(3300,3300)=1650
S(1000,680)=1680
S(1500,220)=1720
S(1500,330)=1830
P(4700,3300)=1938.75
S(1500,470)=1970
S(1000,1000)=2000
S(1500,680)=2180
S(2200)=2200
S(2200,100)=2300
S(2200,150)=2350
P(4700,4700)=2350
S(2200,220)=2420
S(1500,1000)=2500
S(2200,330)=2530
S(2200,470)=2670
S(2200,680)=2880
S(1500,1500)=3000
S(2200,1000)=3200
S(3300)=3300
S(3300,100)=3400
S(3300,150)=3450
S(3300,220)=3520
S(3300,330)=3630
S(2200,1500)=3700
S(3300,470)=3770
S(3300,680)=3980
S(3300,1000)=4300
S(2200,2200)=4400
S(4700)=4700
S(3300,1500)=4800
S(4700,100)=4800
S(4700,150)=4850
S(4700,220)=4920
S(4700,330)=5030
S(4700,470)=5170
S(4700,680)=5380
S(3300,2200)=5500
S(4700,1000)=5700
S(4700,1500)=6200
S(3300,3300)=6600
S(4700,2200)=6900
S(4700,3300)=8000
S(4700,4700)=9400

Le due righe mancanti sono S(100)=100e S(1000)=1000.
algoritmo

@algorithmshark: Sì, capito. Il regex li stava inavvertitamente consumando
Zaid,

Sarà interessante vedere se qualcuno può trovare una soluzione Perl più breve.
Zaid,
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.