Lycantrophe Skrevet 12. mars 2015 Del Skrevet 12. mars 2015 (endret) Vet det, det var derfor jeg ikke postet mer kode. Jeg skal holde meg for god til å be deg tygge på det. Stor forskjell. Det er lov og prøve og feile. Du får ikke tyn for å være ny, men du vil få høre det når man aktivt går inn for ikke å forbedre seg. Hvordan ser det under ut? -- Get the last digit from a number lastDigit :: Integer -> Integer lastDigit n = n `mod` 10Fin. Jeg hadde antagelig skrevet lastDigit = mod n 10, men det er helt greit å bruke den som operator. -- Drop the last digit from a number dropLastDigit :: Integer -> Integer dropLastDigit n = n `div` 10Samme stil-sak her, men fortsatt fint. toRevDigits :: Integer -> [Integer] toRevDigits n | n < 1 = [] | otherwise = lastDigit n:toRevDigits (dropLastDigit n)Decent. Jeg tror jeg heller hadde skrevet med implisitt rekursjon: toRevDigits :: Integer -> [integer] toRevDigits = map lastDigit . takeWhile (> 0) . iterate dropLastDigit -- Double every second number in a list starting on the left. doubleEveryOther :: [Integer] -> [Integer] doubleEveryOther [] = [] doubleEveryOther (x:y:zs) = x : y*2 : doubleEveryOther zs doubleEveryOther x = xFin. Du trenger ikke både [] og x-retur (den første dekkes av den siste), men det er ok å eksplisitt ha med nulltilfellet. -- Calculate the sum of all the digits in a single Integer >= 0 sumDigitsNum :: Integer -> Integer sumDigitsNum n = sum (toRevDigits n)Foretrekker point-free her:sumDigitsNum = sum . toRevDigits -- Calculate the sum of all the digits in every Integer >= 0 sumDigits :: [Integer] -> Integer sumDigits l = sum (map sumDigitsNum l)Samme: sumDigits = sum $ map sumDigitsNum -- Validate a credit card number using the above functions. luhn :: Integer -> Bool luhn n = sumDigits (doubleEveryOther (toRevDigits n)) `mod` 10 == 0Her kan det være lurt å bryte opp litt: luhn = creditChecksum == 0 where creditSum = (sumDigits . doubleEveryOther . toRevDigits) n creditChecksum = creditSum `mod` 10Ellers fint. edit: disclaimer: jeg har faktisk testet veldig lite av dette, så det kan være typos og andre småfeil. Det er veldig lite å forandre på, da, og mye koker ned til preferanse. edit2: hvordan i all verden klarer -tags å tryne indenteringen min. Endret 15. mars 2015 av Lycantrophe 1 Lenke til kommentar
Emancipate Skrevet 12. mars 2015 Del Skrevet 12. mars 2015 edit2: hvordan i all verden klarer -tags å tryne indenteringen min.Mulig du bruker rich text editoren. Fin. Du trenger ikke både [] og x-retur (den første dekkes av den siste), men det er ok å eksplisitt ha med nulltilfellet.Takk, jeg grublet mye på den, for jeg så det var noe rart. Lenke til kommentar
Lycantrophe Skrevet 13. mars 2015 Del Skrevet 13. mars 2015 Mulig du bruker rich text editoren.Nei (selvsagt ikke). Lenke til kommentar
Martin HaTh Skrevet 14. mars 2015 Del Skrevet 14. mars 2015 -- Double every second number in a list starting on the left. doubleEveryOther :: [Integer] -> [Integer] doubleEveryOther [] = [] doubleEveryOther (x:y:zs) = x : y*2 : doubleEveryOther zs doubleEveryOther x = xFin. Du trenger ikke både [] og x-retur (den første dekkes av den siste), men det er ok å eksplisitt ha med nulltilfellet. Du kan evt. skrive noe så kult som doubleEveryOther xs = zipWith ($) (cycle [(2*), id]) xs .. selv om det kanskje ikke er like lett å se med en gang hva som skjer. -- Calculate the sum of all the digits in a single Integer >= 0 sumDigitsNum :: Integer -> Integer sumDigitsNum n = sum (toRevDigits n)Foretrekker point-free her: sumDigitsNum = sum $ toRevDigits sumDigitsNum = sum . toRevDigits mener du, vel? Lenke til kommentar
Lycantrophe Skrevet 15. mars 2015 Del Skrevet 15. mars 2015 Jepp, gikk litt fort, siden jeg beholdt n først. Skal oppdatere. Lenke til kommentar
x871kx6167ss7 Skrevet 15. mars 2015 Del Skrevet 15. mars 2015 -- Double every second number in a list starting on the left. doubleEveryOther :: [Integer] -> [Integer] doubleEveryOther [] = [] doubleEveryOther (x:y:zs) = x : y*2 : doubleEveryOther zs doubleEveryOther x = x Som andre har nevnt, så er det første tilfellet unødvendig. Jeg ville heller ha skrevet: doubleEveryOther [] = [] doubleEveryOther [x] = [x] doubleEveryOther (x:y:zs) = x : y*2 : doubleEveryOther zs Lenke til kommentar
Emancipate Skrevet 17. mars 2015 Del Skrevet 17. mars 2015 Oppgave: Hvilke tall mellom 0 og 9 multiplisert gir siste siffer 1 i produktet? Helst med output som fra koden under, her vist for tallet 3. Output: [[1, 3, 3, 3], [3, 1, 3, 3], [7, 9, 3, 63], [9, 7, 3, 63]]OpenSCAD kode med list comprehensions: function get_last_digit(n) = n%10; /* Løsning 1 */ function multiply_all() = [for (i=[0:9], j=[0:9]) [i, j, get_last_digit(i*j), i*j]]; function filter_on_last_digit(digit, list) = [for (i=list) if (i[2] == digit) i]; echo(filter_on_last_digit(3,multiply_all())); /* Løsning 2*/ function last_digit_in_product(digit) = [ for (i=[0:9], j=[0:9]) let (n = j*i) if (get_last_digit(n) == digit) [i, j, get_last_digit(n), n] ] ; echo( last_digit_in_product(3) );Hvordan skriver jeg det samme i Haskell? Lenke til kommentar
Emancipate Skrevet 17. mars 2015 Del Skrevet 17. mars 2015 -- Get the last digit from a number lastDigit :: Integer -> Integer lastDigit n = n `mod` 10 last_digit_in_product digit = [[i,j,lastDigit (i*j), i*j] | i <- [0..9], j <- [0..9], lastDigit (i*j) == digit];Problem: koden er uleselig, og jeg skjønner egentlig ikke hva den gjør.F.eks. hvorfor i alle dager denne koden [i|i <- [0..9], j <- [0..9]] ikke gir [0,1,2,3,4,5,6,7,8,9]. Lenke til kommentar
Martin HaTh Skrevet 17. mars 2015 Del Skrevet 17. mars 2015 (endret) Når man skriver [a | a <- [1..10], b <- [1..10]] er det ish som å skrive for (int a = 1; a <= 10; a++) { for (int b = 1; b <= 10; b++) { array.add(a); } } En annen ting er at du ikke trenger å gå fra 0 til 9 på både A og B, siden a*b = b*a. Koden blir litt lang, men det får heller bare gå. Du har jo også tatt med litt mer informasjon enn du egentlig trenger. Feks, kan du skrive dette i stedet: lastDigit a = mod a 10 -- som du skrev [(a,b) | a<-[1..9], b<-[a..9], lastDigit (a*b) == 1] Endret 17. mars 2015 av Martin HaTh 1 Lenke til kommentar
rockPaperScissors() Skrevet 1. april 2015 Del Skrevet 1. april 2015 Noen som spesielle preferanser til språk og verktøy som kompilerer til JavaScript? Er veldig mange alternativer. Lenke til kommentar
Emancipate Skrevet 1. april 2015 Del Skrevet 1. april 2015 Er new i JavaScript egentlig nødvendig når man kan bruke literal object notation? Jeg vet hvordan new brukes, men kunne de like gjerne ha laget språket uten? Gjør ikke rett og slett kodene under det samme? var Mover = function() { this.position = new PVector(random(width), random(height)); this.velocity = new PVector(random(-2, 2), random(-2, 2)); }; var MoverLiteral = function() { return { position: new /* vet det! */ PVector(random(width), random(height)), velocity: new PVector(random(-2, 2), random(-2, 2)) }; }; var MoverLiteralParameter = function(self) { self.position = new PVector(random(width), random(height)); self.velocity = new PVector(random(-2, 2), random(-2, 2)); return self; }; var mover = new Mover(); var mover2 = MoverLiteral(); var mover3 = MoverLiteralParameter({}); Lenke til kommentar
Enthroner Skrevet 2. april 2015 Del Skrevet 2. april 2015 Er new i JavaScript egentlig nødvendig når man kan bruke literal object notation? Jeg vet hvordan new brukes, men kunne de like gjerne ha laget språket uten? Gjør ikke rett og slett kodene under det samme? Man trenger raskt new: ConstructorFunc = function () { this.propertyA = 'first'; }; ConstructorFunc.prototype.propertyB = 'second'; var instance = new ConstructorFunc(); console.log(instance.propertyA); console.log(instance.propertyB); Lenke til kommentar
Emancipate Skrevet 2. april 2015 Del Skrevet 2. april 2015 Ja, det hadde jeg ikke tenkt på. Latterlig at å sette .prototype etter at objektet er laget ikke oppdaterer .[[prototype]]. Man kan riktignok gjøre det sånn, men, bob, bob. var ConstructorFunc = function (self) { self.propertyA = 'first'; return self; }; ConstructorFunc.prototype.propertyB = 'second'; var instance = ConstructorFunc(Object.create(ConstructorFunc.prototype)); console.log(instance.propertyA); console.log(instance.propertyB); Lenke til kommentar
Emancipate Skrevet 4. april 2015 Del Skrevet 4. april 2015 Når man er logget inn, f.eks. på altinn, er det bare en cookie som beviser at jeg er meg? Lenke til kommentar
Matsemann Skrevet 4. april 2015 Del Skrevet 4. april 2015 Jupp, det er som regel bare det. Lenke til kommentar
Emancipate Skrevet 4. april 2015 Del Skrevet 4. april 2015 Ok. Da bør den velges veldig omhyggelig, med en kryptografisk random-funksjon. Men du sier "som regel," er det andre alternativer? Lenke til kommentar
Matsemann Skrevet 4. april 2015 Del Skrevet 4. april 2015 Ja, men er stort sett cookies eller tilsvarende som brukes. Altså, etter at man har autentisert får man en unik kode som man sender med hver request for å slippe og autentisere på nytt. Kan bruke public/private keys, f. eks i en del sammenhenger. Men på nettsider er det cookies som er det som brukes. Lenke til kommentar
rockPaperScissors() Skrevet 4. april 2015 Del Skrevet 4. april 2015 (endret) Når man er logget inn, f.eks. på altinn, er det bare en cookie som beviser at jeg er meg?Cookie-sesjon kan f.eks. inneholde hash basert på nettleserens fingermerke, som vanligvis er veldig unik* og gir flere variabler å validere mot. https://panopticlick.eff.org/ * Endret 4. april 2015 av rockPaperScissors() Lenke til kommentar
Emancipate Skrevet 4. april 2015 Del Skrevet 4. april 2015 (endret) Selv om den er unik vil den være triviell å fake, så jeg ser egentlig ikke poenget med det i et security-perspektiv. Edit: Manglet et vesentlig ikke! Endret 4. april 2015 av Emancipate Lenke til kommentar
Occi Skrevet 4. april 2015 Del Skrevet 4. april 2015 Panopticlick er et godt eksempel på hvorfor man burde bruke NoScript eller en tilsvarende løsning. Så mye rart som gis ut av nettleseren din hvis du lar den. Within our dataset of several million visitors, only one in 3,996 browsers have the same fingerprint as yours. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå