Gå til innhold

ProgrammeringsBaren! Småprat, om det du elsker!


Anbefalte innlegg

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` 10
Fin. 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` 10
Samme 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 = x
Fin. 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 == 0
Her kan det være lurt å bryte opp litt:

 

luhn = creditChecksum == 0
where creditSum = (sumDigits . doubleEveryOther . toRevDigits) n
creditChecksum = creditSum `mod` 10
Ellers 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 av Lycantrophe
  • Liker 1
Lenke til kommentar
Videoannonse
Annonse
-- 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
Fin. 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

 

-- 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

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

-- 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

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 av Martin HaTh
  • Liker 1
Lenke til kommentar
  • 2 uker senere...

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

 

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

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

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

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...