Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  15 4161
Hei!
Jeg skrev nylig en blog post om min mest elendige kode. Det vil si, jeg svarte på en tråd på et annet forum, og omgjorde svaret til en blog post.

Jeg tenkte at det hadde vært artig å ha en tråd om det samme her på freak óg, og dele med hverandre våre kanskje ikke helt oppegående øyeblikk.

Ser frem til å se hva dere har å by på
Sist endret av Mort96; 3. august 2013 kl. 18:48.
Har utallige ganger gitt opp på å løse et problem effektivt og har gått for brute force. Man blir jo direkte flau når man ser over koden etter man har en løsning som kjører på en brøkdel av tiden. Legger ved et meget stygt eksempel på dette som ble skrevet langt på natt, dersom det er noen unskylding.
SPOILER ALERT! Vis spoiler

for i=1:n
newvalue1 = value(1)*(1+deriv(i));
for j=1:m
newvalue2 = value(2)*(1+deriv(j));
for k=1: o
newvalue3 = value(3)*(1+deriv(k));
for l=1: p
newvalue4 = value(4)*(1+deriv(l));
for m=1: q
teller=teller+1;
newvalue5 = value(5)*(1+deriv(m));
eta = (newvalue5*(1-newvalue1*(vals-newvalue2).^newvalue3).^newvalue4);
if(sum(eta>low)==su && sum(eta<up)==su && (sum(eta>etas)==su || sum(eta<etas)))
if(sum(eta<etas)==su)
logic1(teller,: ) = [eta(end),i,j,k,l,m];
no=no+1;
else
logic2(teller,: ) = [eta(end),i,j,k,l,m];
no=no+1;
end
end
end
end
end
end
end
Det hadde vært interessant om folk i tillegg tok for seg hvordan de klare å gjøre koden bedre og finere når de så over den senere - da man lærer mye av å prøve å forbedre kode samt å se hva andre gjør for å forbedre sin kode.
Det er en god idé etse. Der det gir mening hadde det vært flott om dere kan kommentere hvordan dere fikset (eller kunne fikse) den elendige koden

Og forresten, jeg har skrevet en ny post siden den om "my worst code" - her er permalinken til posten som er relevant for denne tråden: http://mortie.org/mort/dynamic/blog/?p=37
Jeg sier bare en ting: "Goto"...


Men skulle gjerne beholdt den første kodesnutten min og poste her, men den er long gone.
Skal vi se. Skrev en AI til TG2013 på under en uke. Havna i finalen (kjeppjagaren) men den faila siste runde fordi A* algoen min bare sjekke et området på 15x15, og jeg spawna på noe 15,20 ellerno. Litt trist, men har hvertfall en god del morsom kode.
Planen var å skrive en POC i Python og etterpå skrive det i Clojure. Men tiden gikk litt for fort og jeg endte opp med ravioli og spagetti kode.
spaghetti
https://github.com/Foxboron/AI_Progr...r/src/stuff.py

Skal nevnes at det var null tid for refaktorering Så dette er et mer eller mindre sammen hacket prosjekt som egentlig ikke skulle se dagenslys.

Kode

while len(choose_weps) != 2:
    asdasd = ["droid", "mortar", "laser"]
    fghfgh = random.choice(asdasd)
    if fghfgh not in choose_weps:
        choose_weps.append(fghfgh)

Kode

def error(arg):
    """Error dude....."""
    print arg
Hva var det PEP sa om global vars?

Kode

    global resources_mined
    global laser_level
    global droid_level
    global mortar_level
    global player
    global turns
    global enemies
    global player_pos
    global mine_n
    global l_enemy_pos
    global attack_info
    global rest_walks

Kode

def next_move(player_pos, l):
    if l == "left-up":
        ret = (player_pos[0],player_pos[1]-1)
    elif l == "right-up":
        ret = (player_pos[0]-1,player_pos[1])
    elif l == "up":
        ret = (player_pos[0]-1,player_pos[1]-1)
    elif l == "left-down":
        ret = (player_pos[0]+1,player_pos[1])
    elif l == "down":
        ret = (player_pos[0]+1,player_pos[1]+1)
    elif l == "right-down":
        ret = (player_pos[0],player_pos[1]+1)
    return ret

Kode

class AStar(object):
    def __init__(self, board, start, end, cant_move, enemy=None):
        ...
        self.gridHeight = 15
        self.gridWidth = 15
Jeg holdt også en Lightning Talk på PilsProg i Bergen hvor jeg gikk igjennom koden og forklarte hvor jævlig den er. Har i ettertid ikke gjort noe med den.
Sist endret av Foxboron; 3. august 2013 kl. 22:19.
4 om kvelden, trøtt, for sent til å fylle på med kaffe.
Brukte nesten en time på å finne ut hvorfor koden under ga en stackoverflow.
Sovnet, våknet, slettet hele funksjonen og skrev en fungerende en på under 15 min..


Kode

	public void getInnerBlocks(){

		int buffer = 0;

		int first = 0;
		int last = 0;
		String sub = "";

		while(true){

			last = code.indexOf(";", first+1);

			if(last == -1){			
				last = code.length();
			}

			sub = code.substring(first,last);

			//System.out.println(sub);

			if(sub.isEmpty()){
				break;
			}

			if(sub.contains("{")){
				//System.out.println("{");

				int a = first;
				int b = first;
				String block_string = code.substring(first,code.length());


				int i = block_string.indexOf("{")+1;
				char chk = '0';
				buffer = 1;

				while(true){

					chk = block_string.charAt(i);

					if(chk == '{'){
						buffer++;
					}

					if(chk == '}'){
						buffer--;
					}


					i++;

					if(i >= block_string.length() || buffer <= 0){
						b = i;
						break;
					}
				}

				last = b;
				children.add(new Block(block_string.substring(0,b),statements.size(),statements.size()+2));				
				System.out.println(block_string.substring(0,b));

			}else{
				statements.add(sub);
			}

			first = last + 1;

			if(last >= code.length()-1 || code.indexOf("}",last+1)==-1 || code.indexOf(";",last+1)==-1){
				break;
			}


		}


		for(String s : statements){
			System.out.println(s);
		}

	}
Her har vi vel det styggeste jeg har gjort på en stund. Fikk faktisk noe hjelp av forumet for å få det sammen også da jeg sto skikkelig fast på dette.
Det er så hack på alle tenkelige måter, men den eneste måten jeg fikk det til å fungere. Har ikke hatt ork til å tenke på å forbedre det enda da det er for kaos

Det er en sånn edit-in-place funksjon som gjør at man kan skrive databaseendringer rett inn i en html-tabell. Ganske lik funksjon som jEditable for de som har vært borti det.

(copy/paste fra git med kommentarer på dårlig engelsk)

Kode

/*
lets just start it of with the html to get the understanding of functionality a little mapped out.
So, i got this form.
it's basicly just a regular form with a table that get populated from a backend-java-thingy.
The population of the table comes from this thingy: "for(Iterator it = backe....." to make it short its just a javacode
that does some database-queries and returns them so i get the data in rows...

th table-part is pherhaps the part of this code thats kinda messy.
So to break it up a little bit:
the java-code runs a loop and values gets assigned to each td every run of the loop. So, tr is each element, 
and td is each value kinda...
we got a ID and a value and a class for every td. 
id holds which value we are editing, and class holds the functionality.
*/

</form>
 <form name="dataTable" action="ctrl" method="POST">
 <input type="hidden" name="action" value="item" />
 <input type="hidden" name="spec" value="dataTable" />
 <input type="hidden" name="pricebook_ri" value="<%=pricebook_ri%>" />
 <br/>
 <br/>
 <table id="dataTable" class="tooltip">
 <tr>
  <td>Identifiertype</td>
	<td width="10"></td>
	<td>Identifier</td>
	<td width="10"></td>
	<td>Info</td>
	<td width="30"></td>
	<td>Markup</td>
	<td width="10"></td>
	<td>Netprice</td>
	<td width="10"></td>
	<td>Delete</td>
	<td width="10"></td>
	<td></td>
 </tr>
 <br/>
<%
int iterator = 0;
for(Iterator it = backenddata.getEntries().iterator();it.hasNext();) {
	EntryData entry = (EntryData)it.next();

%>
	<tr>
		<td><div id="editable1_<%=iterator%>" class="editable_select" onBlur="reset();" name="editable_select"><%=entry.getIdentifiertype()%></div><input type="hidden" id="newValue1_<%=iterator%>" name="newValue1_<%=iterator%>" value=""></td>
		<td></td>
		<td><div id="editable2_<%=iterator%>" class="editable"><%=entry.getIdentifier()%></div><input type="hidden" id="newValue2_<%=iterator%>" name="newValue2_<%=iterator%>" value="">
		<td></td>
		<td><%=entry.getIdentifierTitle() %></td>
		<td></td>	    
		<td><div id="editable3_<%=iterator%>" class="editable"><%if(entry.getEntrytype().equals("MARKUP")){out.println(entry.getEntrycontent());} %></div><input type="hidden" id="newValue3_<%=iterator%>" name="newValue3_<%=iterator%>" value=""></td>
		<td></td>
		<td><div id="editable4_<%=iterator%>" class="editable"><%if(entry.getEntrytype().equals("NETPRICE")){out.println(entry.getEntrycontent());} %></div><input type="hidden" id="newValue4_<%=iterator%>" name="newValue4_<%=iterator%>" value=""></td>
		<td></td>
		<td><input type="hidden" value="<%= entry.getIdentifiertype() %>" name="original_Identifiertype_<%=iterator%>" id="original_Identifiertype_<%=iterator%>"/></td>
		<td><input type="hidden" value="<%= entry.getEntrycontent() %>" name="original_EntryContent_<%=iterator%>" id="original_EntryContent_<%=iterator%>"/></td>		
		<td><input type="hidden" value="<%= entry.getIdentifier() %>" name="original_Identifier_<%=iterator%>" id="original_Identifier_<%=iterator%>"/></td>
		<td><input type="hidden" value="<%= entry.getEntrycontent() %>" name="original_Entrytype_<%=iterator%>" id="original_Entrytype_<%=iterator%>"/></td>

	</tr>
<% 
iterator++;} 
%>
<tr><td><input type="hidden" value="<%=iterator%>" name="iterator" id="iterator"/></td></tr>
 </table>
 <br/>
 <input type="button" name="updateData" id="updateData" value="update data" style="display:none;"/>
 </form>



/*hopefully some of the html makes sense.*

Kode

/*So, lets start with the jquery. i'm gonna comment straight into the code here.. it makes it easier to
udnerstand every step.

*/

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
  $("div.editable").click(function(){  /*Ok, click function for every td that got a class of "editable"*/
		var newInput = "<input type ='text' class='newInput' value=\""+$(this).text()+"\">";   /*lets make a new string with html-syntaxing*/
		$(this).html(newInput);		/*and now lets print that string out. So basicly, on a click we print out a string that is html-syntax*/
		var id = $(this).attr("id"); /*id of the value getting edited*/	
		$("input.newInput").focus();
		$("input.newInput").keydown(function(event){
			if(event.which == 13){	/*look for enter-key to be pressed. on enter we expect the editing to be done.*/
				var value = $(this).val(); /*gets the new value*/
				var str = id;
				var strArray = str.match(/(\d+)/g); /*gets the numbers from the id, so we can use this to store the value in the hidden field*/
			 	for(var i = 0;i<strArray.length;i++){				
					if(i == 0){var temp0 = strArray[i];} 
					if(i == 1){var temp1 = strArray[i];}
				}
			 	$("#newValue"+temp0+"_"+temp1).val(value); /*in this part we saves the value to the hidden-field using the numbers from the original id*/
			 	$("#editable" +temp0+"_"+temp1).text($(this).val()); /*and here we make the visible html changes with the new value*/
			 	$(this).blur();
			 	slide();
			}
		});
		$("input.newInput").keyup(function(event){ /*look for esc-key to be pressed. if you understand the code above this should be easy. It'-s just a cancel-function really.*/
			if(event.which == 27){	
				var str = id;
				var strArray = str.match(/(\d+)/g);
			 	for(var i = 0;i<strArray.length;i++){				
					if(i == 0){var temp0 = strArray[i];} 
					if(i == 1){var temp1 = strArray[i];}
				}
			 	var tempval = "";
			 	if(temp0 == 2){tempval = $("#original_Identifier_"+temp1).val();}
			 	else if(temp0 == 3){tempval = $("#original_EntryContent_"+temp1).val();}
			 	else if(temp0 == 4){tempval = $("#original_EntryContent_"+temp1).val();}
			 	$("#editable" +temp0+"_"+temp1).text(tempval);
			 	$(this).blur();
				//slide();
			}
		});
	});
});
 $(window).load(function(){
	var clickFunction = function(){  /*ok, so this is almost the same as earlier. we print out a string which consist of html-syntax. only that here we print a drop-down meny and not only a input box*/
	  var id = $(this).attr("id");	  
	  var select = '<select name="select" id="'+id+'">'; 
	  var options = ["ITEMS", "IN", "DROPDOWN"];
	   for(var i = 0;i<options.length;i++)
	     select += '<option value="'+options[i]+'">'+options[i]+'</option>';
	     select += '</select>';
	     $(this).html(select);
	     $(this).unbind('click',clickFunction);
	}
	$("div.editable_select").bind('click',clickFunction); /*when a td with class of editable_select get clicken, we run the above code.*/
});
$('#dataTable select[name^="select"]').live('change', (function () { /*looks for a click inside the newly created dropdown. and assignes the new selected value to a hidden field and changes the visible html to the clicked value..*/
    var value1 = ($("option:selected", this).val());
    var id = $(this).attr("id");
    var str2 = id;                                  
	var str2Array = str2.match(/(\d+)/g);
	for(var i = 0;i<str2Array.length;i++){				
		if(i == 0){var temp01 = str2Array[i];} 
		if(i == 1){var temp11 = str2Array[i];}
	}
    $("#newValue"+temp01+"_"+temp11).val(value1);
   // $("#editable" +temp01+"_"+temp11).text($(this).val());
    slide();
}));
function slide(){
		$("#updateData").slideDown("fast"); 
}
$(function(){
	$('#updateData').click(function(){
		updatePricebookTable();
	});
});

function updatePricebookTable(){ /* this is just the function i use to update the databse.  I do this in java and i wont be posting this code. But basicly what it does is loop in the iterator-value from the html and update every database-value with the data from the hidden-fields in the html. if there is no new value in the hidden filed it just skips it. */
	document.dataTable.spec.value="dataTable";
	document.dataTable.submit();
}
</script> 

/*as i said its kinda messy. but its kinda small and i find it kinda understandable. Some of the projects with the same funcitonality i found on the web had like 4-500 lines of code, this is like 60 or something.... so you wont break your brain going through it.

As a little sidenote. this stuff can be done so much better! don't see this as a finished project, its just some code i did at work to get shit working. 
if you want sexy, or perfect this is not it. at all ;)

*/
Når jeg fant ut at å bruke fields med iteratorverdi i navnet som jeg splitter gjennom en regex og så assigner til nye fields; da trodde jeg at et lavmål var nådd. Ohoy, så fælt det er! XD
Men, jeg er også litt stolt over at jeg faktisk fikk til dette. Det er relativt komplisert til tider og ikke akkurat hverdagslig. Se på hvordan dropdown'en funker feks; ganske kult imo.

Edit: Ja, dette ble ganske messy da kommentarer i jQuery-kode ikke ble tatt med... Les det den som kan
Haha, masse flott kode her :P

@Ross, hadde vært fint å vite hvordan funksjonen så ut etter at du skrev den om, kanskje til og med litt sammenligning?

Endret forresten litt på hvordan ting virker på blogen - riktig link er nå http://mortie.org/?p=37. Det burde være siste gang permalinken endres <.<
▼ ... noen måneder senere ... ▼
På tide med en ny post fra min side.
Nok en gang befinner vi oss i jQuery-land og alle de utrolige ting som finnes her.
Bakgrunnen for dette var at jeg skulle lage en mulighet for å legge to bilder oppå hverandre. Her har det underste bildet en link som skal bli en popup, mens det øverste bildet da skulle ignoreres. Det man sliter med her er å faktisk ignorere det øverste bildet og alle attributter det har. I firefox og whatnot fungerte dette med å sette en enkel css-greie på tre linjer, men i IE så ble det seff kuk i smørbrød.
I tillegg er det ikke bare ett bilde, det er seff flere. Så den popupen skulle også fungere som en bildekarusell. Noe som er drittmoro når man har ting som er autogenerert i backend, det gjelder filbane og filnavn og whatnot. Så her ble det mye rot og helvete.
Så da ble det å ty til jQuery da.

Jeg er egentlig lite interessert i å forklare hvert steg da koden er totalt dust og litt hack, men om noe lurer på et eller annet så kan jeg prøve å forklare så godt jeg kan.

html'en ser litt forenklet sånn ut:

Kode

<div id="itemDetail">
    	<div id="someSortOfWrapper" class="someSortOfWrapper"> 
            <div id="itemDetail_imageBox">
            	<img align="left">            		           
              </img>
           </div>
        </div>

      <div style="margin-left: 15px;" id="count">        		      
      	<div class="alternatePicture inline">
        	<div class="someKindOfWrapper" id="someKindOfWrapper">
               	<img align="left">
                	
                </img>
           </div>
        </div>
      </div>
      <div id="popUpDiv" style="display:none;">
      		<div class="inline" id="popUpPrevious">
      			<span id="popUpArrowPrevious"><a></a></span>
      		</div>
      	<div id="pictureFrame" class="inline">
      	</div>      	
      		<div class="inline" id="popUpNext">
      			<span id="popUpArrowNext"><a></a></span>      		
      		</div>
      	<div id="closePopUpLink"></div>
      </div>
Og så kommer jQuery'en inn og styrer funksjonaliteten til hele dritten:

Kode

<script>
$(document).ready(function(){
	var margTop = ((screen.height/2)-(534/2)) - 100;
	var margLeft = (($("#middlePart").width()/2)-(538/2));    	
	$("#someSortOfWrapper").click(function(){
		blackUp();
		var src1 = $(this).find('img').attr('src');   			
		$("#popUpDiv").show(function showThisPic(){
 		$('#pictureFrame').append("<img src="+src1+" />");			
		}).css({ 'display':'block' }).css({ "margin-top":margTop + 'px', "margin-left":margLeft + 'px' });            
	});
	$("#someKindOfWrapper").click(function(){
		blackUp();		
		var src2 = $(this).find('img').attr('src');
		$("#popUpDiv").show(function showThisPic(){
			$('#pictureFrame').append("<img src="+src2+" />");			
		}).css({ 'display':'block' }).css({ "margin-top":margTop + 'px', "margin-left":margLeft + 'px' });            	   			
	});
	$("#closePopUpLink").click(function(){
		$("#popUpDiv").hide();$("#blackIt").remove();$("#pictureFrame").find('img').remove();
	});
	$("#popUpArrowPrevious").click(function(){
		showPrev();
	});
	$("#popUpArrowNext").click(function(){
		showNext();
	});      
});
function blackUp(){
	var blackHeight = $(document).innerHeight();
	var blackWidth = $(document).innerWidth();
	var $div = $('<div />').appendTo('body').css({ 'background': 'black' });
  $div.attr('id', 'blackIt');
	$("#blackIt").css({ "height":blackHeight + 'px', "width":blackWidth + 'px' });
	$("#blackIt").css({ top: 0, left:0});
	$("#blackIt").css({ opacity:0.6 });
	$("#blackIt").css({ "position":"absolute"});
	$("#blackIt").css({ "z-index":99998});
	$("#popUpDiv").css({"z-index":99999});
}
function showNext(){
	var src = $("#pictureFrame").find('img').attr('src');    	
	var arr = arrayHelper();
	var arrLength = arr.length - 1;
	for(var i = 0; i &lt; arr.length;i = i + 1){
		if(arr[i] == src){
			if(i != arrLength){$('#pictureFrame').find('img').attr("src", arr[i+1]);}
			else{startOver();}	
		}     	
	}  		
}
function showPrev(){
	var src = $("#pictureFrame").find('img').attr('src');
	var arr = arrayHelper();
	for(var i = 0; i &lt; arr.length;i = i + 1){    		
		if(arr[i] == src){
			if(i != 0){$('#pictureFrame').find('img').attr("src", arr[i-1]);}
			else{startOver();}
		}    		    	
	}
}
function startOver(){
 	var arr = arrayHelper();
 	var last = arr.length;
 	var arrLength = arr.length - 1;
 	var src = $("#pictureFrame").find('img').attr('src');
 	for(var i = 0; i &lt; arr.length;i = i + 1){    		
 		if(arr[i] == src){
 			if(i == 0){$('#pictureFrame').find('img').attr("src", arr[last-1]);}
 			if(i == arrLength){$('#pictureFrame').find('img').attr("src", arr[0]);}
 		}
 	}    	
}    
function arrayHelper(){
 	var number = $('#count').children().size();
 	var arr = [];
	arr.push($("#someSortOfWrapper").find('img').attr('src'));
	for(var i=0;i &lt; number;i = i + 1){
		arr.push($('#count').children().find('img').attr('src'));
	}
	return arr;
}
$(document).keydown(function(e){
  if($("#popUpDiv").css('display') !='none'){
 	 	if(e.keyCode == 27){$("#popUpDiv").hide();$("#blackIt").remove();$("#pictureFrame").find('img').remove();}
    if(e.keyCode == 37){showPrev();}
    if(e.keyCode == 39){showNext();}
   }
});
</script>
Og, bare for å gi noen pointere på ille kode:
-Jeg teller hvor mange bilder det er utifra en id's children og bruker det tallet til å lage en array av alle elementer som er av en type <img>.
-Denne arrayen brukes også i karusellen til å vite hvilket bilde som skal vises ved trykk/piltaster.(ta en titt på startOver() og hvordan startOver trigges hihihihi)
-Jeg setter click på en div til å trigge en funskjon som "leter etter" et bilde...
-Jeg lager en div-variabel som jeg sort of appender til selve siden i blackUp()-funksjonen... lol. Se på det der da XD. For ikke å snakke om alle css-reglene som settes på denne div'en.
-Tydeligvis har ikke moret hørt om enter-tasten
-Og jeg får pokker ikke sentrert popupen uansett hva jeg finner på. Det har jeg gitt opp
-Inline css er for pyser, jeg trøkker css rett i scripting. Det er mye tøffere og enklere og holde orden på.
sindre@puse.cat:~$
Synderen's Avatar
Sitat av Freddy_fred5 Vis innlegg
Jeg sier bare en ting: "Goto"...


Men skulle gjerne beholdt den første kodesnutten min og poste her, men den er long gone.
Vis hele sitatet...
Bruker goto ofte i C, er ingenting gale med det om det gjøres riktig.

Noe av min verste kode er nok noe jeg skrev i prolog for noe skole greier, første gang jeg la øye på prolog kode var uken før, og jeg var også ny til logisk programmering.

Kode

%Person definition.
%person(
%   name,
%   war_afghanistan,
%   war_iraq,
%   money,
%   rich
%   army
%   tax
%   benefits
%   church
%   pro_life
%   government
%   nuclear_weapons,
%   america
%   immegrants
%   free_health_care
%   CCTV
%   privacy
%   )

% Person template.
%person('name', 'no', 'no', 'no', 'no', 'no', 'no', 'no', 'no', 'no', 'no', 'no','no','no','no','no','no'). 

% Emma is a person that should vote labour.
person('Emma', 'no', 'no', 'no', 'no', 'no', 'yes', 'yes', 'no', 'no', 'yes', 'no','no','yes','yes','yes','no'). 

% Sarah is a ultra-conservative.
person('Sarah', 'yes', 'yes', 'yes', 'yes', 'yes', 'no', 'no', 'yes', 'yes', 'no', 'yes', 'yes','no','no','yes','no'). 

% Sindre should vote libdem
person('Sindre', 'no', 'no', 'yes', 'no', 'no', 'yes', 'yes', 'no', 'no', 'no', 'no','no','yes','yes','no','yes').

% Tom should vote conservative.
person('Tom', 'yes', 'yes', 'yes', 'yes', 'yes', 'no', 'no', 'no', 'no', 'no', 'yes','yes','no','no','yes','no').   

%person(Name,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_)

% predicate to check if a person likes having privacy and freedom.
likes_freedom(Name) :-
    person(Name,_,_,_,_,_,_,_,_,_,Government,_,_,_,_,CCTV,Privacy),
    Government = 'no',
    CCTV = 'no',
    Privacy = 'yes'.

% Check if a person likes that the governments regulate things like economy, and is generally 
% government supportive.
likes_regulation(Name) :-
    person(Name,_,_,_,_,_,Tax,_,_,_,Government,_,_,_,_,CCTV,_),
    Tax = 'yes',
    Government = 'yes',
    CCTV = 'yes'.

% Check if the person is a capitalist, capitalists likes money and rich people.
capitalist(Name) :- 
    person(Name,_,_,Money,Rich,_,_,_,_,_,_,_,_,_,_,_,_),
    Money = 'yes',
    Rich = 'yes'.

% Checks to see if the person is for bombing afghanistan and iraq.
afraid_of_terrorists(Name) :-
    person(Name,War_Afghanistan,War_Iraq,_,_,_,_,_,_,_,_,_,_,_,_,CCTV,_),
    War_Afghanistan = 'yes',
    War_Iraq = 'yes',
    CCTV = 'yes'.

% Check if a person would like more defence spendings.
afraid_of_china_russia(Name) :-
    person(Name,_,_,_,_,Army,_,_,_,_,_,Nuclear_Weapons,_,_,_,_,_),
    Nuclear_Weapons = 'yes',
    Army = 'yes'.

% Check if the person is positive to giving benefits, such as free health care.
social_worrier(Name) :-
    person(Name,_,_,_,_,_,Tax,Benefits,_,_,_,_,_,_,FHC,_,_),
    Tax = 'yes',
    Benefits = 'yes',
    FHC = 'yes'.

% A person is deemed conservative if he or her is a capitalist, for bombing iraq and
% afghanistand, and wants more defence spendings.
conservative(Name) :-
    capitalist(Name),
    afraid_of_terrorists(Name),
    afraid_of_china_russia(Name).

% A ultra-conservative is a person that is conservative, and is for politics influenced by the 
% church, and is pro life.
ultra_conservative(Name) :-
    conservative(Name),
    person(Name,_,_,_,_,_,_,_,Church,Pro_life,_,_,_,_,_,_,_),
    Church = 'yes',
    Pro_life = 'yes'.    

% A libdem voter is a person that likes freedom, has nothing against social benefits like free 
% health care, and is not against immegrants.
libdem(Name) :-
    likes_freedom(Name),
    social_worrier(Name),
    person(Name,_,_,_,_,_,_,_,_,_,_,_,_,Immegrants,_,_,_),
    Immegrants = 'yes'.

% A labour voter is a person that is for social benefits like free health care, and likes
% government regulations of things like economy, and has nothing against immegrants.
labour(Name) :-
    social_worrier(Name),
    likes_regulation(Name),
    person(Name,_,_,_,_,_,_,_,_,_,_,_,_,Immegrants,_,_,_),
    Immegrants = 'yes'.

vote(Name) :-
    ultra_conservative(Name),
    write(Name),write(' is ultra-conservative and should vote conservative.'),nl.

vote(Name) :-
    conservative(Name),
    write(Name),write(' is conservative and should vote conservative.'),nl.

vote(Name) :-
    libdem(Name),
    write(Name),write(' is liberal and should vote libdem.'),nl.

vote(Name) :-
    labour(Name),
    write(Name),write(' is labour and should vote labour.'),nl.
Det er også noe kode jeg skrev for en robot i C++, det endte opp som en suppe av halvveis C og C++ kode, med OO noen steder og ikke andre der det burde være. Samt at jeg aldri klarte å bestemme meg for å bruke cout eller printf, og brukt litt av begge. Denne koden er litt for lang til å poste her dessverre.
Synderen: jeg snakket om slike dårlige looper, feila på å forstå noe i den første guiden så endte vel opp med noe slikt:

1:Var:Ex {System.in("")}
2: If { (Ex == 1): goto 4;
3: Else (): goto 1;};
4: System.out.println("jeg skjønner heller ikke hvorfor jeg ikke bare skrev system.out på linje 2");
bra tråd, hehe. denne commiten er vel en av minde mindre... heldige: <https://github.com/stiell/limbs-off/commit/4c169036ab2ac1bbd3bab992414a6838090f31a9>. den inneholder denne perlen:

Kode

+    // Temporary differentiation of characters.
+    // TODO: Use sprites.
+    static int n = 0;
+    int m = n % 3, d = n / 3, mm = d / 2 % 4, dd = d / 8;
+    for (int i = 0; i < 3; i++)
+        colour_[i] = (3 * ((m == i) ^ d & 1) ^ ((mm == i + 1) ^ dd & 1)) / 4.0;
+    ++n;
kan trøste meg med at det ikke var rent min idé... for så å sukke når jeg kommer på at denne "temporary"-løsninga fortsatt befinner seg i kodebasen. ;-)




på andreplass kommer kanskje <https://github.com/stiell/limbs-off/commit/c69fca19ce1c4ce37f2b98ff2d4c0c2c2bad54b5> fra samme repo, med perlen:

Kode

+    {
+        vector2p p;
+        int f = (parent_->getOrientation() == 'r') ? 1 : -1;
+        Action* i;
+        FixtureSpring* j;
+        for (i = &(parent_->actions_[LPUNCH]),
+                j = f >> 1 ? &(parent_->armFront_) :
+                &(parent_->armBack_);; i = &(parent_->actions_[RPUNCH]),
+                j = j == &(parent_->armFront_) ? &(parent_->armBack_) :
+                &(parent_->armFront_)) {
+            j->setPosition(p(i->intention ? 0.25 * -f : i->power * f, 0));
+            if (i == &(parent_->actions_[RPUNCH]))
+                break;
+        }
+    }
jada. dette er også fortsatt i repoet. :-P
Sist endret av Anonym57965; 18. oktober 2013 kl. 22:20.
Rart med det der hvordan en lager en elendig løsning som en planlegger å erstatte, men så lar en det bare ligge siden det ..virker. Been there done that :P

Forresten, hadde helt glemt om denne tråden. Har gjort mange endringer på siden min, og dette er nå riktig URL: http://mortie.org/blog/?post=my_worst_code
Sist endret av Mort96; 19. oktober 2013 kl. 00:05.
Det er flaut å tenke på nå...
I starten når Nokia hadde SymbianOS så kopierte jeg en viktig fil fra SymbOS systemet og plantet det sammen med et annet virus. Ideen var at når .dll filen ble startet opp i feil tid ville telefonen ende i en uendelig loop dersom telefonen ble startet på nytt.
Jeg brukte da et allerede virus til å tømme batteriet for å forsikre at telefonen ble tom for strøm og dermed måtte startes på nytt igjen.
Det flaue er at jeg allerede brukte en fil skrevet av noen andre for å få telefonen til å klikke for så å bruke et allerede oppfunnet kode/virus for å starte på nytt, så tok jeg kreditten for hele greia. Den eneste ideen min var å se sammenhengen ved å kombinere andre sine verk.

Jeg kunne ikke da eller nå skrive noen ting selv (annet enn CS scripts).

Her er er av dem:
http://www.f-secure.com/v-descs/doomboot_a.shtml

Vil bare legge til at jeg var 16 år da, så jeg var din og ignorant m, om det hjelper hehe
Sist endret av TylerDurden; 19. oktober 2013 kl. 00:45. Grunn: Iphone...