Programátorská výzva na víkend

Sekcia: Programovanie 07.09.2018 | 13:13
Avatar Stanislav Hoferek Greenie 18.04  Používateľ

Ahojte. Napadla mi jednoduchá programátorská výzva, alebo niečo na odreagovanie. Je tu veľa šikovných ľudí a riešení je vždy viac. Pustíte sa do toho? V koľkých programovacích jazykoch dokáže vyriešiť jednoduchý príklad komunita LinuxOS do pondelka?

Zadanie: Pizzéria predáva malé pizze. Koľko ich musí za mesiac predať, aby nebola v strate?

Cena surovín na jednu malú pizzu je 43 centov, mesačné náklady (nájom, platy, energie...) sú 2000€. Cena jednej malej pizze je 1,5€.

Nie je to žiadne školské zadanie, len som zvedavý, akými rôznymi spôsobmi sa dá niečo podobné vypočítať :)

    • RE: Programátorská výzva na víkend 07.09.2018 | 13:34
      Avatar debian+   Návštevník
      #include <stdio.h>
      
      long int minimalne_predane_mesiac(double naklady_pizza, double najom, double cena_pizze)
      {
      	return (long int) (najom/(cena_pizze-naklady_pizza))+1;
      }
      
      int main(void)
      {
      	long int ret;
      	
      	ret=minimalne_predane_mesiac(0.43, 2000, 1.5);
      	printf("minimalne_predane_mesiac(): %ld\n", ret);
      	
      	return 0;
      }
      
    • RE: Programátorská výzva na víkend 07.09.2018 | 14:15
      Avatar Miroslav Bendík Gentoo  Administrátor

      Jednoduché riešenie

      CENA_JEDNOTKOVA = 1.5
      NAKLADY_JEDNOTKOVE = 0.43
      NAKLADY_PAUSALNE = 2000
      
      zisk_jednotkovy = CENA_JEDNOTKOVA - NAKLADY_JEDNOTKOVE
      minimalny_predaj = (NAKLADY_PAUSALNE // zisk_jednotkovy) + 1
      
      print("Minimalny predaj mesacne %d" % minimalny_predaj)
      
    • RE: Programátorská výzva na víkend 07.09.2018 | 14:16
      Avatar Miroslav Bendík Gentoo  Administrátor

      Hrubá sila

      CENA_JEDNOTKOVA = 1.5
      NAKLADY_JEDNOTKOVE = 0.43
      NAKLADY_PAUSALNE = 2000
      
      
      predane = 0
      while True:
          predane += 1
          print("Predal som %d pizze" % predane)
          zisk = (CENA_JEDNOTKOVA - NAKLADY_JEDNOTKOVE) * predane
          if zisk > NAKLADY_PAUSALNE:
              print("Luigi, predal si %d pizze a si v zisku, tu mas banan a sicko v poradku" % predane)
              break
          else:
              print("Luigi, ty lemra, neflakaj sa tolko a predavaj")
      
      • RE: Programátorská výzva na víkend 07.09.2018 | 19:17
        Avatar debian+   Návštevník

        Co je to za programovaci jazyk?

    • RE: Programátorská výzva na víkend 07.09.2018 | 14:29
      Avatar Livan Manjaro s XFCE  Používateľ

      Teda nechcem rýpať ale toto nie je úloha na programovanie ale pre kalkulačku, v krajnom prípade pre excel alebo iný tabuľkový procesor. Stačí náklady podeliť rozdielom medzi predajnou cenou a cenou surovín a výsledok zaokrúhliť nahor. Teda minimálny počet predaných píc je zaokrúhliť_hore(2000/(1,5-0,43))= 1870. Programovať takéto niečo je úplne kontraproduktívne, ten libreoffice calc je úplne dostačujúci.

      • RE: Programátorská výzva na víkend 07.09.2018 | 15:13
        Avatar Stanislav Hoferek Greenie 18.04  Používateľ

        samozrejme, že je to jednoduché a postačí kalkulačka. každopádne som zvedavý, v čom všetkom sa to dá urobiť. python, java, assembler... tých možností je veľmi veľa :)

        • RE: Programátorská výzva na víkend 07.09.2018 | 15:40
          Avatar Livan Manjaro s XFCE  Používateľ

          Však ja chápem, ako to bolo myslené, ja som iba prezentoval jeden možný spôsob (ak berieme v úvahu aj programovateľnú kalkulačku, tak dva) a ten začiatok bolo iba také premostenie.

      • RE: Programátorská výzva na víkend 07.09.2018 | 15:16
        Avatar WlaSaTy   Návštevník

        Stano navrhol na oživenie súťaž "72 spôsobov na zobrazenie Hello World". Tak naňho nebuď zlý. Na víkend predsa hlásili škaredé počasie.

        To, že by to bežný človek riešil v tabuľkovom procesore, a skúsený užívateľ zas v bc je druhá strana mince.

        • RE: Programátorská výzva na víkend 07.09.2018 | 15:17
          Avatar Stanislav Hoferek Greenie 18.04  Používateľ

          som zvedavý, či by sa to dalo 72 spôsobmi :) ešte by to niekto urobil v minecrafte alebo cez pytagorovu vetu :D

        • RE: Programátorská výzva na víkend 08.09.2018 | 15:09
          Avatar debian+   Návštevník

          bc zvlada aj premenne ... takze sa to da napisat aj pouzitelne do buducna :)

      • RE: Programátorská výzva na víkend 07.09.2018 | 15:20
        Avatar Stanislav Hoferek Greenie 18.04  Používateľ

        inak, keď sa už spomína kalkulačka :D

    • RE: Programátorská výzva na víkend 07.09.2018 | 15:29
      Avatar Stanislav Hoferek Greenie 18.04  Používateľ
      <!DOCTYPE html>
      <html>
      <body>
      <p>Javascript</p>
      <p id="pizza"></p>
      <script>
      var pausal = 2000
      var zisk = 1.5
      var naklad = 0.43
      var zisk1ks = zisk - naklad
      var x = pausal / zisk1ks + 1;
      document.getElementById("pizza").innerHTML = x;
      </script>
      </body>
      </html>
    • RE: Programátorská výzva na víkend 07.09.2018 | 18:07
      Avatar qw11 ubuntu mate 18.04 64bit Asus X751LB  Používateľ

      Treba mat xdotool. Prve sleep nastavit podla rychlosti internetu

      firefox http://www.wolframalpha.com; sleep 3; xdotool type "round(2000/(1.5-0.45)+1)";sleep 1; xdotool key --clearmodifiers Return
      

      :D

      • RE: Programátorská výzva na víkend 07.09.2018 | 18:25
        Avatar Laco2   Návštevník

        Pán je pekár a nevie si vypočítať zisk???

        • RE: Programátorská výzva na víkend 07.09.2018 | 18:47
          Avatar Stanislav Hoferek Greenie 18.04  Používateľ

          nie som pekár, ide čisto o príklad :)

        • RE: Programátorská výzva na víkend 07.09.2018 | 19:01
          Avatar qw11 ubuntu mate 18.04 64bit Asus X751LB  Používateľ

          Uctovnicka je na dovolenke. Tento mesiac to ma na starosti. :D

    • RE: Programátorská výzva na víkend 07.09.2018 | 19:30
      Avatar debian+   Návštevník
      #!/bin/bash
      
      function minimalne_predane_mesiac {
      	if [ "$#" -ne 3 ]; then
      		echo "minimalne_predane_mesiac NAKLADY_PIZZA NAJOM CENA_PIZZE"
      		return
      	fi
      	
      	naklady_pizza=$1
      	najom=$2
      	cena_pizze=$3
      	najom=`echo "scale=0;$najom/($cena_pizze-$naklady_pizza)+1"|bc -l`
      	
      	echo "najom: $najom"
      }
      
      minimalne_predane_mesiac 0.43 2000 1.5
    • RE: Programátorská výzva na víkend 07.09.2018 | 19:34
      Avatar debian+   Návštevník
      <?php
      
      function minimalne_predane_mesiac($naklady_pizza, $najom, $cena_pizze)
      {
      	return ceil($najom/($cena_pizze-$naklady_pizza));
      }
      
      
      $ret=minimalne_predane_mesiac(0.43, 2000, 1.5);
      echo "minimalne_predane_mesiac(): $ret\n";
      
      ?>
      
    • RE: Programátorská výzva na víkend 07.09.2018 | 22:48
      Avatar wamba   Návštevník

      Hrubou silou (2x):

      perl6 -e 'say ^Inf .first:  * * (1.5-.43)-2000 > 0'
      perl6 -e 'say (0,1 ... * * (1.5-.43)-2000 > 0).tail'
      

      Zajímavější je hranici zisku spočítat přesně, tam se ukáže, že počítání s centy může být ošemetné:

      perl6 -e 'say 2000/(1.5-.43)'         #1869.158879
      perl  -E 'say 2000/(1.5-.43)'         #1869.15887850467
      python -c 'print(2000/(1.5-.43))'     #1869.1588785046729
      ruby -e 'puts 2000/(1.5-0.43)'        #1869.1588785046729
      elixir -e 'IO.puts(2000/(1.5-0.43))'  #1869.1588785046729
      echo '(/ 2000 (-  1.5 .43))'|racket   #1869.1588785046729
      echo '2000/(1.5-0.43)'|ghci           #1869.1588785046729
      calc '2000/(1.5-.43)'                #~1869.15887850467289719626
      echo '2000/(1.5-.43)'|bc -l           #1869.15887850467289719626
      
    • RE: Programátorská výzva na víkend 08.09.2018 | 09:21
      Avatar Livan Manjaro s XFCE  Používateľ

      Ešte chýba C++

      #include <iostream>
      
      using namespace std;
      
      int main()
      {
      	float pausalneNaklady = 2000;
      	float cenaPicce = 1.5;
      	float cenaSurovin = 0.43;
              int pocetPic;
      
      	pocetPic = pausalneNaklady/(cenaPice - cenaSurovin) +1;
      
              cout << "Minimálny počet predaných píc je: " << pocetPic << endl;
      	return 0;
      }
    • RE: Programátorská výzva na víkend 08.09.2018 | 09:23
      Avatar bedňa LegacyIce-antiX  Administrátor

      Oneline:
      printf %.2f $(echo "2000/(1.5-0.43)" | bc) ; echo

      Táto správa neobsahuje vírus, pretože nepoužívam MS Windows. http://kernelultras.org
      • RE: Programátorská výzva na víkend 08.09.2018 | 09:33
        Avatar bedňa LegacyIce-antiX  Administrátor

        Máš to zle:
        echo "2000/(1.5-0.43)+1"|bc

        Táto správa neobsahuje vírus, pretože nepoužívam MS Windows. http://kernelultras.org
        • RE: Programátorská výzva na víkend 08.09.2018 | 10:03
          Avatar debian+   Návštevník

          bedna, opravujes sam seba v 3. osobe? :D

          • RE: Programátorská výzva na víkend 08.09.2018 | 10:35
            Avatar bedňa LegacyIce-antiX  Administrátor

            Kto sa mi tu sere do vlákna :-)

            Jasne bolo to myslené ako sranda.

            Táto správa neobsahuje vírus, pretože nepoužívam MS Windows. http://kernelultras.org
          • RE: Programátorská výzva na víkend 08.09.2018 | 10:45
            Avatar bedňa LegacyIce-antiX  Administrátor

            Teda napadlo ma ešte jednochšie riešenie:
            echo "Luigi, práve sme mi oni predali +100 000 000 000" pizzas určite budem ja ty v zisku"

            Táto správa neobsahuje vírus, pretože nepoužívam MS Windows. http://kernelultras.org
    • RE: Programátorská výzva na víkend 08.09.2018 | 12:38
      Avatar Stanislav Hoferek Greenie 18.04  Používateľ

      trúfne si niekto na turbo pascal? :)

      • RE: Programátorská výzva na víkend 08.09.2018 | 19:13
        Avatar Livan Manjaro s XFCE  Používateľ

        A čo toto?

        program PICA;
        
        uses crt;
        var PICA, SUROVINY, NAKLADY: real;
        var POCET: interger;
        
        begin
        clrscr;
        
        PICA:=1.5;
        SUROVINY:=0.43;
        NAKLADY:=2000;
        
        POCET:=NAKLADY/(PICA-SUROVINY)+1;
        
        writeln(’Minimálny počet pridaných píc = ’,POCET);
        
        readln
        end.
        • RE: Programátorská výzva na víkend 09.09.2018 | 08:15
          Avatar Stanislav Hoferek Greenie 18.04  Používateľ
        • RE: Programátorská výzva na víkend 08.07 | 22:23
          Avatar Peter Kotrčka Fedora  Používateľ

          prečo tam máš na konci readln?

          • RE: Programátorská výzva na víkend 09.07 | 10:10
            Avatar Richard Antix  Používateľ

            Asi aby to nezavrelo konzolu...

            • RE: Programátorská výzva na víkend 09.07 | 14:27
              Avatar Peter Kotrčka Fedora  Používateľ

              Prečo by malo? Sme snáď vo Windows? :-)

              • RE: Programátorská výzva na víkend 10.07 | 16:13
                Avatar bedňa LegacyIce-antiX  Administrátor

                Pretože Lazarus spawne okno s terminálom a po skončení úlohy ho automaticky zavrie.

                Táto správa neobsahuje vírus, pretože nepoužívam MS Windows. http://kernelultras.org
    • RE: Programátorská výzva na víkend 13.09.2018 | 07:26
      Avatar laco2 cinamon  Používateľ

      Mne na to stačí kalkulačka-som sellák!

    • RE: Programátorská výzva na víkend 09.07 | 09:07
      Avatar Richard Antix  Používateľ

      Bez rozmýšľania prepísaný Mirecov kód do eLispu:

      (defun pizza ()
        "Aj tak ti vlada zavrie pizzeriu!"
        (interactive)
        (setq cena-1ks 1.5)
        (setq nakl-1ks 0.43)
        (setq nakl-paus 2000.0)
        (setq zisk-1 (- cena-1ks nakl-1ks))
        (setq min-pred (+ (/ nakl-paus zisk-1) 1))
        (message "Min. predaj mesacne = %f " min-pred))

       

      • RE: Programátorská výzva na víkend 09.07 | 10:02
        Avatar Richard Antix  Používateľ

        Krajší kód:

        (defun pizza ()
          "Aj tak ti vlada zavrie pizzeriu!"
          (interactive)
          (message "Min. predaj mesacne = %f "
                   (let ((cena-1ks 1.5)
                         (nakl-1ks 0.43)
                         (nakl-paus 2000.0))
                     (+ (/ nakl-paus (- cena-1ks nakl-1ks)) 1))))
        • RE: Programátorská výzva na víkend 09.07 | 10:06
          Avatar Branislav Poldauf Manjaro, Debian stable  Používateľ

          síce ten víkend trval 2 roky ale inak pekný výsledok ;-)

          Linux: the operating system with a CLUE... Command Line User Environment
          • RE: Programátorská výzva na víkend 09.07 | 10:11
            Avatar Richard Antix  Používateľ

            Aha fakt, to som si nevšimol.

            Aspoň vidno, že dobrá vtákovina prežije.

        • RE: Programátorská výzva na víkend 09.07 | 14:19
          Avatar Peter Kotrčka Fedora  Používateľ

          Už som ani nedúfal, chvalastallmanovi niekto použil Lisp

          • RE: Programátorská výzva na víkend 09.07 | 16:12
            Avatar Richard Antix  Používateľ

            Áno, ak sme pri písmene L, tak po legínach je Lisp druhá najlepšia vec, ktorá bola vymyslená. 😀

    • RE: Programátorská výzva na víkend 09.07 | 09:35
      Avatar tb20vt   Používateľ
      #!/usr/bin/ruby -w
      a = 2000
      b = (1.5-0.43)
      i = 0
        while a > 0
        a = (a-b)
        i = i + 1
        end
      puts "Pizzamizza musi predat #{i} pizz aby nebol v strate"
      
    • RE: Programátorská výzva na víkend 09.07 | 10:52
      Avatar kormidelnik   Používateľ

      Najde sa borec, co to spravi v Brainfuck? https://sk.wikipedia.org/wiki/Brainfuck

      https://www.tutorialspoint.com/execute_brainfk_online.php

      • RE: Programátorská výzva na víkend 09.07 | 14:35
        Avatar Peter Kotrčka Fedora  Používateľ

        Brainfuck je taká mantra, akože je to super ťažký jazyk, ale nie je, len sa rozvláčne píše kvôli obmedzeniam ktoré má.

        Radšej by som videl nejaké zaujímavé (aj keď u tejto úlohy to asi bude ťažké) riešenia v jazykoch ako je Haskell (a "odvodených" - Idris, Agda), OcaML, v assembleri pre nejaké zaujímavé ne-x86 CPU, ...

    • RE: Programátorská výzva na víkend 10.07 | 15:55
      Avatar Peter Kotrčka Fedora  Používateľ
      IDENTIFICATION DIVISION.
      PROGRAM-ID. PIZZERIA.
      DATA DIVISION.
      WORKING-STORAGE SECTION.
      01 WS-CENA PIC 9(1)V9(5) VALUE 1.50.
      01 WS-SUROVINY PIC 9(1)V9(5) VALUE 0.43.
      01 WS-NAKLADY PIC 9(5)V9(5) VALUE 2000.
      01 WS-POCET PIC 9(5)V9(5) COMP-3 VALUE 0.
      01 WS-ROZDIEL PIC 9(1)V9(5) VALUE 0.
      01 WS-RESULT PIC 9(4) VALUE 0.
      PROCEDURE DIVISION.
      SUBTRACT WS-SUROVINY FROM WS-CENA GIVING WS-ROZDIEL.
      DIVIDE WS-NAKLADY BY WS-ROZDIEL GIVING WS-POCET.
      ADD 1 TO WS-POCET GIVING WS-POCET.
      MOVE WS-POCET TO WS-RESULT.
      DISPLAY 'Pizzeria musí predať ' WITH NO ADVANCING.
      DISPLAY WS-RESULT WITH NO ADVANCING.
      DISPLAY ' pizz mesačne.'
      STOP RUN.

      Určite sa to dá napísať krajšie, zvlášť to formátovanie ma v COBOL-e vždy straší, ale funguje to.

      Test možný na COBOL Online compileri

      • RE: Programátorská výzva na víkend 11.07 | 08:16
        Avatar Richard Antix  Používateľ

        Super, skvelé.

        Ani navyše ten kód ani netreba komentovať, lebo ako hovorí starý vtip, "načo komentovať, pretože je to ťažké (kód) napísať a je ťažké ho pochopiť a teda bude ťažké (a zbytočné) ho modifikovať :) ".

         

        • RE: Programátorská výzva na víkend 12.07 | 08:45
          Avatar Peter Kotrčka Fedora  Používateľ

          Tento kód je release quality level, načo opravovať?

          • RE: Programátorská výzva na víkend 12.07 | 10:01
            Avatar Richard Antix  Používateľ

            Veď inú kvalitu by som ani neočakával :)

    • RE: Programátorská výzva na víkend 11.07 | 11:22
      Avatar Bibibo   Používateľ

      Zadavatel este zabudol, ze z kazdej pizze musis zaplatit dan.

      • RE: Programátorská výzva na víkend 11.07 | 22:08
        Avatar Peter Kotrčka Fedora  Používateľ

        Ale keď nezarábaš (si na nule), tak prakticky asi daň ani nezaplatíš.

      • RE: Programátorská výzva na víkend 12.07 | 06:26
        Avatar Livan Manjaro s XFCE  Používateľ

        To môže byť zahrnuté v nákladoch.

      • RE: Programátorská výzva na víkend 12.07 | 09:06
        Avatar Branislav Poldauf Manjaro, Debian stable  Používateľ

        zadanie bolo smerované na 2000€, to nie je ani polka nezdaniteľnej časti základu dane (dnes niečo vyše 4500€), daňové zaťaženie by bolo nulové

        Linux: the operating system with a CLUE... Command Line User Environment