Jump to content

Programming Challenge Week #0 : Miljons


AndrisBB
 Share

Recommended Posts

C++

#include <iostream>    // std::cout
#include <algorithm>   // std::transform
#include <iterator>    // std::ostream_iterator
#include <functional>  // std::mem_fun_ref
#include <vector>      // std::vector
 
int main()
{
  std::vector<void*> two;
  two.push_back(NULL);
  two.push_back(NULL);
 
  std::vector<void*> zero;
 
  std::vector<void*> one;
  one.push_back(NULL);
 
  std::vector<void*> five;
  five.push_back(NULL);
  five.push_back(NULL);
  five.push_back(NULL);
  five.push_back(NULL);
  five.push_back(NULL);
 
  std::vector<std::vector<void*> > all;
  all.push_back(two);
  all.push_back(zero);
  all.push_back(one);
  all.push_back(five);
 
  std::transform(all.begin(), all.end(),
                 std::ostream_iterator<size_t>(std::cout),
                 std::mem_fun_ref(&std::vector<void*>::size));
}
Iespējams var vektorus novienkāršot par parastiem masīviem, bet šādi laikam strādā OK.

Vēl viens C++ risinājums (kods ir pašā apakšā): https://gist.github.com/mmozeiko/2db4d8ef17a3182c5abc


Līdzīgs iepriekšējam, tikai C risinājums (kods pašā apakšā): https://gist.github.com/mmozeiko/316664e2b6c2e012c082

Labots - bubu
Link to comment
Share on other sites

bubu, otrais nestrādā - izdrukā papildus atstarpi. Ja "kNumber[]" pamaina uz "kNumber[9]", tad vairākas.


Turklāt ar rindu numuriem ir tā "viltīgi" - varētu būt, ka neatbilst uzdevuma nosacījumiem, pieņemot, ka newline arī ir "viens simbols, kuru var pievienot/nodzēst".

Link to comment
Share on other sites

Pielaboju otro. Kā tagad?


Python2:

import sys
 
two = [None, None]
zero = [0] * int(False)
one = [None]
five = [None, None, None, None, None]
 
data = [two]
data.append( \
             zero)
data.append( \
            one)
data.append( \
            five)
 
map(sys.stdout.write,
    map(str, map(len, data)))

Nevar vienkārši rakstīt "zero = []", jo tad starp [ un ] varēs ielikt kaut ko un tad len(zero) būs 1.

Šis tas ir sadalīts pa vairākām rindām, lai nevarētu aizkomentēt ar vienu simbolu (#)

Labots - bubu
Link to comment
Share on other sites

Tagad nezinu, lai citi paskatās (nav īsti laika).

Pitons neder kaut vai dēļ tā, ka ar 1 simbolu var jebkuru rindu nokomentēt.

Link to comment
Share on other sites

Tā var šmaukties, ka ir jau gatavs fails ar "2015", vienalga kāds nosaukums, atrodas tajā pašā mapē. Programma atrod vienīgo failu un izvada saturu?

Link to comment
Share on other sites

Un man šķiet, ka Pitonā (un arī C/C++ vai gandrīz jebkurā strong typing valodā) strādās tas veids, ko Ieleja rakstīja PHP:

xx = "2015"
if xx == "2015":
  print \
          xx
else:
  print \
         "2015"

 

 

Pitons neder kaut vai dēļ tā, ka ar 1 simbolu var jebkuru rindu nokomentēt.

 

Pielaboju kodu, lai nevarētu aizkomentēt.


 

 

Programma atrod vienīgo failu un izvada saturu?

 

Atceries, ka tādai programmai būs jāstrādā arī pat ja nomainīs kaut vienu simbolu (faila vārdu? cikla iteratoru? utml). Vai to vari uzrakstīt?

Labots - bubu
Link to comment
Share on other sites

· Hidden by Mezavecis, Decembris 29, 2014 - Herņa
Hidden by Mezavecis, Decembris 29, 2014 - Herņa

Kādi tur komentāri un interese. Admnis mežavecis, par spīti tam, ka brīdinājuma punkti sen beigušies, turpina uzturēt man liegumu postu skaitam diennaktī un privāto sarunu skaita limitu diennaktī - viena!

Tā ka šeit ir tīņu garā administrēts forums, šādu konkursu labāk rīkot developers.lv vai php.lv ne šeit.

Ar šo es atsakos no mežaveča administrētā foruma izmantošanas un lūdzu dzēst lietotāja profīu beryl no boot.lv.

Link to comment

LISPs laikam nav diezko labs šādam uzdevumam,  tur visur var likt ' vai  ` , kas kodu pārtaisa par simbolu listu.

 

Ta jau labāk erlang.    :)

-module(foo).
-compile(export_all).
-define(FOO, "2015").

foo() when ?FOO =:= "2015" ->
    io:format(?FOO);
foo() ->
    io:format("2015").
Labots - MarisO
Link to comment
Share on other sites

Čau visiem! :)

 

bet nu pieņemu, ka 'Vilx-' ir savs risinājums, kuram tiek piedzīti uzdevuma noteikumi, jo sākumā varēja mainīt vienu simbolu, tagad var pielikt vai dzēst vienu simbolu, vakarā varbūt jau varēs manipulēt ar pāris simboliem

Nē, sorry, šoreiz nav mana vaina. :) Izlasi pats uzmanīgi uzdevuma nosacījumus. Vienīgais, ko es tur esmu precizējis ir vārds "jebkuru" (lai arī man šķita, ka tas jau tāpat ir saprotams). Uzdevuma nosacījumus mainīt netaisos, ja nu vienīgi precizēt kaut ko, ko kāds varētu vēl būt pārpratis.

 

Nu re, jāgaida vien atbilde no Vilx-.

Kādu atbildi jūs no manis gaidiet? :p Šī programma ir tāpat kā quine - tai ir daudz dažādu iespējamu risinājumu, daudzās dažādās valodās, un man nav nekāda "pareizā" risinājuma azotē.

Link to comment
Share on other sites

haskell to erlang

-module(foo).
-compile(export_all).

bar() ->
    io:format(integer_to_list(hd(lists:filter(fun(X)-> X =:= 2015 end, [2015]) ++ [2015]))).
Link to comment
Share on other sites

Ar failu šarpā:

Mapē jābūt exe un vienalga kāds fails ar ascii "2015" saturā.

        static void Main(string[] args)
        {
            string path = System.Reflection.Assembly.GetExecutingAssembly().Location;
            string[] files = System.IO.Directory.GetFiles(System.IO.Path.GetDirectoryName(path));
            bool aa, aaaa;
            foreach (string f in files)
            {
                aa = string.Equals(f, path);
                aaaa = string.Equals(f, path);
                if (aa || aaaa)
                {
                    int i = 5;
                }
                else
                {
                    Console.Write(new System.IO.StreamReader(f).ReadToEnd());
                }
            }
        }
Link to comment
Share on other sites

Java:

public class Main {

    public static void main(String[] args) {

        String year = String.valueOf(Math.min(Math.max(2015, 2015), Math.max(2015, 2015)));

        StringBuilder output = new StringBuilder();
        for(Character c: year.toCharArray()) {
            if (Character.isDigit(c) || Character.isDigit(c)) { // YOLO
                output.append(c);
            }
        }

        System.out.println(output);
    }
}

Paspēlēties var šeit: http://www.javarepl.com/console.html

 

Edit: Tomēr laužās easy pievienojot "-" pārveidošanas uz string. :)

Edit2: Salabots, ejot cauri simboliem un atlasot tikai ciparus.

Labots - rejectee
Link to comment
Share on other sites

vairāk jautrs kā nopietns uzdevums, vismaz pagaidām izskatās ka ir vajadzīga gan pareizā valoda, kuru nevar salauzt kaut ko pieliekot (sanāk uzreiz atkrīt valodas kam rindu var aizkomentēt ar 1 simbolu), gan atrisinājumam jābūt ar pareizajam pārbaudēm.

Link to comment
Share on other sites

 

 

Ar failu šarpā: Mapē jābūt exe un vienalga kāds fails ar ascii "2015" saturā.
 

Nesapratu. Tava programma izvadīs visu failu saturu mapē - tai skaitā 2015 un exe faila saturu. Tātad outputā tā neizvada "2015".


 

 

sanāk uzreiz atkrīt valodas kam rindu var aizkomentēt ar 1 simbolu)
 

Un kā ar manu Pitona risinājumu #46 postā? Pitonā rindu aizkomentē ar # simbolu. Vai tur var kaut ko aizkomentēt?

Link to comment
Share on other sites

Nē, izvadīs tā faila saturu, kura nosaukums atšķiras no exe. Tāpēc jau pārbaude 10. rindā ar diviem booliem.

Link to comment
Share on other sites

@@argonaut - Nu, principā programmai nevajadzētu paļauties uz kaut kādiem ārējiem failiem, kurus nevar modificēt. Vai arī tad šos failus arī uzskatām par programmas daļu un ļaujam tos modificēt. Un, enīvei - ieliec semikolu aiz "else" un viss nojuks tik un tā. :)

 

@@rejectee - Pieliec Math.Min priekšā ~ simbolu (bitwise inversion). ;)

 

 

sanāk uzreiz atkrīt valodas kam rindu var aizkomentēt ar 1 simbolu

Var arī tādās - tikai vajag uztaisīt tā, ka jebkuru rindu izkomentējot nekompilējas.

Labots - Vilx-
Link to comment
Share on other sites

ColorPulse

Te vajag kodu, kurš dublējās ar iespējams mazāk rindiņām un operatoriem, jo lielākajā skaitā gadījumu pārrakstot operatorus vai kaut atstarpi ieliekot pie definējuma, nemaz nepalaidīs.

Link to comment
Share on other sites

Леший

Леший haskell kods laikam nav "salaužams"

Tā izskatās. Uzprasīju gudriem haskell guru - viņi nevarēja atrast variantu kā salauzt, kurš atbilstu nosacījumiem.

 

bubu, lūdzu pielabo to garo rindu #44. postā, jo tā lauž bootu uz lapša ekrāna.

 

_____

 

 

Gribu piedāvāt nedaudz grūtāku, bet tanī pašā laikā interesantāku uzdevumu - siltuma vienādojuma vizualizācija. Jāsaģenerē gif, līdzīgu šim:

Heat_eqn.gif

 

Viens bijušais kolēģis nesen uzrakstīja, izskatījās iespaidīgi:

xAgNVsG.gif

 

Input - monohroma bilde, kas simbolizē metāla plāksni. Ar melniem pikseļiem ir atzīmētas karstas zonas. Pieņemt, ka ievadā ir tikai divas temperatūras - karsta un auksta(0°C).

Link to comment
Share on other sites

Edit2: Salabots, ejot cauri simboliem un atlasot tikai ciparus.

 

Un ja nu es pielieku ! zīmi pirms Character.isDigit( c ) ?

 

 

bubu, lūdzu pielabo to garo rindu #44. postā, jo tā lauž bootu uz lapša ekrāna.

 

Man uz laptopa ar 1920x1080 ekrānu nekas nelaužās :)

Labots - bubu
Link to comment
Share on other sites

@@Леший - interesants uzdevums, bet tā wikipēdijas lapa ir pārbāzta ar formulām. :p Pēdējoreiz diferenciālvienādojumu redzēju pirms 10 gadiem augstskolā, un jūtos laimīgs, ka to nav vajadzējis atkārtot. Citiem vārdiem sakot - slinkums burties cauri, kas prasītu vismaz pusi dienas, lai to izprastu. Nevari, lūdzu, izstāstīt vienkāršos vārdos, kāds ir gala algoritms/formula, pēc kuras tas tiek rēķināts?
Link to comment
Share on other sites

 

 

Un ja nu es pielieku ! zīmi pirms Character.isDigit( c ) ?

Tieši tāpēc uzrakstīju tik nesakarīgi - divas reizes, lai vienai pārbaudei pieliekot negāciju nekas netiek salauzts. :grin:  

Link to comment
Share on other sites

androidss

rejectee - tad vajag 

if (Character.isDigit(c) || Character.isDigit(c)) 

nevis

 if (Character.isDigit(c) && Character.isDigit(c))
Link to comment
Share on other sites

Paldies par labojumu, androidss un par pirmo norādi no bubu, kurā es neiebraucu.

Vilx-, es nesaprotu kā tas uzlabotu risinājumu. Vērtība varētu būt negatīva tikai ja pirms Math.Min ielikam mīnusa zīmi, kā arī lietojot bitwise inversion kodu varētu viegli pārveidot pievienojot vēl vienu "~" un tas neatbilstu uzdevuma nosacījumiem. 

Link to comment
Share on other sites

Un kā ar šādu izmaiņu?

 

output.append(-c);

 

Vilx- domā šādu izmaiņu (pielikt tikai vienu ~ simbolu):

String year = String.valueOf(~Math.min(Math.max(2015, 2015), Math.max(2015, 2015)));
Labots - bubu
Link to comment
Share on other sites

Aha. Rezultātā mēs iegūstam "-2016". Mīnus zīmi gan noēdīs, bet izvads tik un tā būs "2016".

Link to comment
Share on other sites

Nelieši, man jau likās, ka kaut kas sanāca. Labi, padomāšu kaut ko citu.

 

Vienkāršākais jau laikam būs tas pats if/else, taču gribētos kaut kādu atjautīgāku veidu.

 String Y2015 = "2015";
 System.out.println(Y2015.equals("2015") ? Y2015 : "2015");
Labots - rejectee
Link to comment
Share on other sites

Jap, tas ir tas, ko es saku #49 postā. Ja vien mainīgais tiek definēts kā strings, tad imho tas strādās jebkurā valodā, izņemot ja šajā valodā stringam ir iespējams pielietot kaut kādu dīvainu vien-simbola operāciju.

Labots - bubu
Link to comment
Share on other sites

C valodā - itkā jā, bet tad tur sāk parādīties nedefinētas uzvedības, un man šķiet, ka šādu modifikāciju arī vajadzētu uzskatīt par "nelegālu", tāpat kā modifikācijas, kuras traucē sakompilēties. Bet, nu, vienošanās jautājums. :)

Jap, tas ir tas, ko es saku #49 postā. Ja vien mainīgais tiek definēts kā strings, tad imho tas strādās jebkurā valodā, izņemot ja šajā valodā stringam ir iespējams pielietot kaut kādu dīvainu vien-simbola operāciju.

Nu, jā, principā jau tas arī ir tipiskais risinājums, tikai vēl jāskatās, kādas kurā valodā ir iespējas to salauzt.

 

OK, laikam jau vairāk te nekas jauns neparādīsies, tad rekur, ir links, kur es šito uzdevu pirms 3 gadiem. :)

Link to comment
Share on other sites

Леший

Vakar iztērēju ~3 stundas, mēģinot salauzt to 29 char versiju haskellā, pirms pamanīju, ka kāds to jau izdarīja ar skriptu. Tiešām iespaidīgi, nebūtu iedomājies izmantot pattern matching:

main=print$(\xx@2012->xx)2012

Īsumā paskaidrošu, lai cilvēki saprastu, kāpēc tas ir spēcīgi.

  • $ ir aplikācijas simbols. print $ right_side ir tas pats, ka print (right_side). Tiek izmantots, kad ir diezgan paliels nestošanas koks, lai tiktu vaļā no ))))) beigās.
  • iekavās ir nodefinēta lambda funkcija, jeb anonima funkcija - funkcija bez nosaukuma. Formats ir šāds: (\arg -> body). Pēc iekavām iet arguments - tā, ka tā ir anonima funkcija, mēs to uzreiz izsaucam. Piemēram (\x -> x * x) 2 būs 4.
  • Haskell ļauj matchot argumentus gan pēc struktūras (piemēri - \x:[] - masīvs ar vienu elementu; \[] - tukšs masīvs; \x:xs - masīvs ar vairākiem elementiem, pirmajam tiks piešķirts vārds x; \(a,b) - pāris), gan pēc vērtības (\1 - šis funkcijas variants izpildīsies, kad arguments ir 1), gan kombinējot mainīgo un vērtību (\x@1 - piešķir argumentam nosaukumu x, un šis funkcijas variants izpildas, kad x ir 1)
  • konkrēta piemērā, cilvēks definē funkciju ar argumentu xx, kura atgriež pašu xx, pie tam, tāds funkcijas behavior ir definēts priekš versijas, kad xx ir 2012. Ja mainīt padoto argumentu, tad būs compile error, jo funkcija nav definēta variantiem, kad xx nav 2012. Tas pats, ja mainīt to xx@2012.
Link to comment
Share on other sites

Izveido kontu, vai pieraksties esošajā, lai komentētu

Jums ir jābūt šī foruma biedram, lai varētu komentēt tēmas

Izveidot jaunu kontu

Piereģistrējies un izveido jaunu kontu, tas būs viegli!

Reģistrēt jaunu kontu

Pierakstīties

Jums jau ir konts? Pierakstieties tajā šeit!

Pierakstīties tagad!
 Share

×
×
  • Izveidot jaunu...