Jump to content
php.lv forumi

Obfuskācijas uzdevums


Леший
 Share

Recommended Posts

Uzdevums ir sekojošs:

 

Ir vārds "foo". Vajag uzrakstīt programmu, kas saņem uz input (vai kā argumentu, vienalga) integer skaitli n > 1. Programmai vajag izvadīt n rindas, pirmā no kurām ir jābūt n reizes vārdam "foo", otrā rindā n-1 reizes utt, pēdējā rindā vārdam foo ir jābūt tikai vienu reizi.

 

Piemērs:
> foo 3
foofoofoo

foofoo

foo

 

Svarīgākais nosacījums programmai: tai ir jābūt pēc iespējas obfuscētai. Bez koda aizkodēšanas un ievērojot koda standartus (indents utt) ir jāpanāk to, lai kods izskatītos maksimāli sarežģīti, lai cilvēks no malas ar lielām grūtībām varētu saprast, ko programma dara.

 

Izmantot var conventional, lasāmas valodas, nevar izmantot brainf**k vai līdzīgus.

Link to comment
Share on other sites

Svarīgākais nosacījums programmai: tai ir jābūt pēc iespējas obfuscētai. Bez koda aizkodēšanas un ievērojot koda standartus (indents utt) ir jāpanāk to, lai kods izskatītos maksimāli sarežģīti, lai cilvēks no malas ar lielām grūtībām varētu saprast, ko programma dara.

A jēga uzdevumam jebšu kam tas domāts/plānots?

Jo nu tikpat labi vari paņemt linux kerneli, tad un vienā C failā tur iebakstīt printf("foofofooo\n") (protams ar pārējiem vipendroniem) .. tb skatīt Master Programmer @ http://roze.lv/Evolucija.txt

Link to comment
Share on other sites


class ProcessInput

{

/**

* @var array

*/

private $mapDec = [];

/**

* @var int

*/

private $multiple;

 

/**

* @param array $mapDec

* @param int $multiple

*/

public function __construct(array $mapDec, $multiple)

{

$this->mapDec = $mapDec;

$this->multiple = $multiple;

}

 

/**

* @param string $destination

*/

public function exec($destination)

{

$memStream = $this->openStream();

 

for ($i = $this->multiple; $i > 0x0; $i += -1) {

fwrite($memStream, $this->getMapping($i));

}

 

rewind($memStream);

 

$this->safeCopyStream($memStream, $destination);

 

fclose($memStream);

}

 

/**

* @param int $r

* @param int $ii

* @return null|string

*/

private function doMap($r, $ii)

{

return (~(-$ii) + 1) % $r === 0x0 && $ii / $r === 0x1 ? chr($ii * 0x1) : null;

}

 

/**

* @return resource

*/

private function openStream()

{

return fopen('php://memory', 'rw');

}

 

/**

* @param $memStream

* @param $destination

*/

private function safeCopyStream($memStream, $destination)

{

if ($memStream && $destination) {

$targetStream = fopen($destination, 'w');

if ($targetStream) {

stream_copy_to_stream($memStream, $targetStream);

fclose($targetStream);

}

}

}

 

/**

* @param int $i

* @return string

*/

private function getMapping($i)

{

$buffer = [];

for ($ii = 0; $ii <= 0xFF; $ii++) {

 

$result = array_map(function ($r) use ($ii) {

return $this->doMap($r, $ii);

}, $this->mapDec);

 

$filtered = array_filter($result);

 

if ($filtered) {

$buffer[$ii] = implode($result);

}

}

 

return str_repeat(implode($buffer), ($i * 0x1)) . PHP_EOL;

}

}

 

$bMap = [

0b01101111,

0b01100110,

0b01101111,

];

 

(new ProcessInput(

$bMap,

$argv[1]

))->exec('php://stdout');

 

Link to comment
Share on other sites

Jāatkārto Rozes teiktais - kāda ir uzdevuma jēga?

Praktisks tas viennozīmīgi nav. Ko no šāda uzdevuma ir domāts iemācīties? Kā rakstīt nevajadzīgi sarežģītu kodu?

Varbut cilveks iet prom no darba un grib maksimali labi izpildit savu pedejo uzdevumu
Link to comment
Share on other sites

A jēga uzdevumam jebšu kam tas domāts/plānots?

For fun. Nekādas jēgas nav. Varbūt tikai parādīt, cik labi cilvēks prot valodu un visādus valodas knifiņus.

 

Mans variants:

import Data.Char
import System.Environment

fib = 1 : scanl (+) 1 fib

foo = map (chr . fromIntegral . (*3)) $ f : replicate 2 (f + 3)
    where
        f  = fib !! ((>>= id) (.) (fromIntegral . (!!) fib) 4)

output = mapM_ print . reverse . map ((>> foo) . e1) . e1
    where
        e1 = enumFromTo 1

main = getArgs >>= output . read . head

usage:

./foo 3
Edited by Леший
Link to comment
Share on other sites

Kaut kas starp woo un codez sanāca
const f = (n, c) => Array(c).fill().map((v,k)=>Array(c-k).fill(n).join('')).join('\n')
console.log(f('foo', 4))

Nē, tev tur rekursīvi strādā, shorthand pārbaudes un mutācijas.

codez atkal neaizsargā b parametru, kas nav pareizi. Imho, kāds to b var ierakstīt. console.log(f("foo",3, 7)). Papildus ir nevajadzīgs newline beigās. Tikai bez stresa.

 

 

Link to comment
Share on other sites

Bet Wuu "neaizsargā" c parametru ("whatever it means") - kāds var ierakstīt f("foo","bar")

 

Ideja ir ļoti vienkārša, nedot pieeju parametriem un iekšējām funkcijām kurām nav jābūt pieejas no ārpasaules.  

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

×
×
  • Create New...