Gå til innhold

Konvertere romertall til vanlig tall, klarer noen færre linjer enn meg?


Anbefalte innlegg

Var en venn som fikk en utfordring om å skrive kode som konverterer romertall til vanlig tall.

Tenkte jeg skulle ta utfordringen selv, bare i PHP.

 

Her er en gist som jeg har lagt ut:

https://gist.github.com/kakemot/ccd80f6509b648e1cec42681efc8ee5d

 

Noen som klarer færre enn 17 linjer? (dvs færre enn 13 faktiske linjer om man tar bort whitespace og "<?php".

 

Mitt forsøk er ikke helt elegant da den ene for loopen er "out of bounds" på et punkt, men så lenge man får et output som er riktig og scriptet ikke feiler så er det greit.

 

Så det er veldig åpne regler her:

Vi tar kun hensyn til romertall som er gyldige i utgangspunktet som input, scriptet behøver ikke å gjenkjenne ugyldige tall.

 

Man kunne sikkert satt romertall inn i et array på én linje, og spart mange linjer.

F.eks:

$rom = array('I' => 1, 'V' => 5, 'X' => 10, 'L' => 50, 'C' => 100, 'D' => 500, 'M' => 1000);

Men det er ikke helt gyldig føler jeg, så jeg valgte å generere et array, matematisk i en loop.

Hvordan man gjør det får likevel være opp til hver enkelt.

 

Lykke til!

Lenke til kommentar
Videoannonse
Annonse

Noen som klarer færre enn 17 linjer?

Har du hørt om Code golf?

Code golf is a type of recreational computer programming competition

Ha ha "rekreasjons",noen tar dette på alvor og kan bruke uker på og bli kvitt 1 tegn.

 

Perl har noen av de beste,eller mest gærne :ninja: i dette feltet.

En Perl-golfer ved navn eyepopslikeamosquito,

bestemte seg for å vinne alle fire språkene (Perl, PHP, Python og Ruby).

Dette var når Code golf siden var opp,nedlagt nå.

# Ruby, 53 strokes
n=1;$.+=n/2-n%n=10**(494254%C/9)%4999while C=getc;p$.

# Perl, 58 strokes and 53(not work any more it uses the $^T variable during a few second period in 2011!)
$\+=$z-2*$z%($z=10**(19&654115/ord)%1645)for<>=~/./g;print
$\+=$z-2*$z%($z=10**(7&$^T/ord)%1999)for<>=~/./g;print

# PHP, 70 strokes
# The six weird characters in the md5(..) are chr(111).chr(178).chr(219).chr(246).chr(172).chr(209) in Perl notation.
<?while(A<$c=fgetc(STDIN))$t+=$n-2*$n%$n=md5(o²Ûö¬Ñ.$c)%1858+1?><?=$t;

# Python, 78 strokes
t=p=0
for r in raw_input():n=10**(205558%ord(r)%7)%9995;t+=n-2*p%n;p=n
print t

Kan ta Python løsning hans ned til 75 ved og bruke Python 3.

t=p=0
for r in input():n=10**(205558%ord(r)%7)%9995;t+=n-2*p%n;p=n
print(t)

Test:

λ python rom.py
MMCMLXXI
2971
Endret av snippsat
Lenke til kommentar

Bbcode vil ikke på mobilen men her:

 

 

function romanToInt($roman) {

$result = 0;

$romans = array('M' => 1000,'CM' => 900,'D' => 500,'CD' => 400,'C' => 100,'XC' => 90,'L' => 50,'XL' => 40,'X' => 10,'IX' => 9,'V' => 5,'IV' => 4,'I' => 1,);

foreach($romans as $key => $value) {

while (strpos($roman, $key) === 0) {

$result += $value;

$roman = substr($roman, strlen($key));

}

}

return $result;

}

Endret av Dan-Levi
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å
×
×
  • Opprett ny...