Split string: Difference between revisions

From Kolmafia
Jump to navigation Jump to search
imported>Bale
mNo edit summary
imported>Fredg1
No edit summary
 
(6 intermediate revisions by 4 users not shown)
Line 23: Line 23:
parameter2={{Param|string|delimiter}}|
parameter2={{Param|string|delimiter}}|
p1desc={{Pspan|source}} is the string to split|
p1desc={{Pspan|source}} is the string to split|
p2desc={{Pspan|delimiter}} is the (optional) string to split at|
p2desc={{Pspan|delimiter}} is the (optional) [[Regular Expressions|regular expression]] to split with|
}}|
}}|


function_description=Returns an array of your {{pspan|source}}, split by either {{pspan|delimiter}} or by line-breaks if not supplied.|
function_description=Returns an array of your {{pspan|source}}, split by either {{pspan|delimiter}} or by line-breaks if not supplied.|


needscode=yes|
code1={{CodeSample|
title=Code Samples|
description=The following example shows how split string can easily convert comma separated strings into useful data.|
code=
<syntaxhighlight>
string items, numbers, total_string;
int total;
item thing;
string[int] split_map;
numbers = "1, 203, 20002, 450, 194, 92992, 9000, 1";
items = "mae west, asshat, hell ramen, bird, batblade";


special=This function technically returns an array, not an aggregate. The information in both is accessed in the same way. However, you cannot add new key-value pairs to an array (it's length is static once set).|
split_map = split_string(numbers, ",");
print("You have a total of "+count(split_map)+" numbers.", "blue");
print("They are the following:", "blue");
foreach it in split_map {
  print(split_map[it]);
  total+=to_int(split_map[it]);
}
total_string = to_string(total, "%,d");
print("Their total is: "+total_string+".", "blue");
print("");
//Items
clear(split_map);
split_map = split_string(items, ",");
print("You have a total of "+count(split_map)+" items.", "blue");
print("They are the following:", "blue");
foreach it in split_map {
  thing = to_item(split_map[it]);
  if (thing == $item[none])
      print(split_map[it]+" is not a valid item", "red");
  else
      print(thing);
}
</syntaxhighlight>|
moreinfo=
}}
 
{{CodeSample|
description=The following example uses KoLMafia's proxy record of an consumable to return the min-max values of the consumable's moxie/muscle/mysticality/adventure gains. Using split string, it finds the average of each gain and returns it in a record. |
code=
<syntaxhighlight>
record item_range {
  float mox;
  float mus;
  float mys;
  float adv;
  item thing;
};
item_range stats;
 
item_range item_avg(item consumable) { //Input food/drink/spleen             
  item_range attributes;
  string[int] avgmap;     
  float realavg;
  string range_string;
  attributes.thing = consumable;
  if (consumable.fullness == 0 && consumable.inebriety == 0 && consumable.spleen == 0){
      print(consumable+" is not a valid consumable.", "red");
      return attributes;
  }
 
  //Moxie
  range_string = consumable.moxie;
  avgmap = split_string(range_string, "-");
  if (count(avgmap) == 1)
      attributes.mox = to_int(range_string);
  else {
      foreach it in avgmap
        realavg += to_int(avgmap[it]);
      attributes.mox = (realavg/2);
  }
  realavg = 0;
  clear(avgmap);
 
  //Muscle
  range_string = consumable.muscle;
  avgmap = split_string(range_string, "-");
  if (count(avgmap) == 1)
      attributes.mus = to_int(range_string);
  else {
      foreach it in avgmap
        realavg += to_int(avgmap[it]);
      attributes.mus = (realavg/2);
  }
  realavg = 0;
  clear(avgmap);
 
  //Mysticality
  range_string = consumable.mysticality;
  avgmap = split_string(range_string, "-");
  if (count(avgmap) == 1)
      attributes.mys = to_int(range_string);
  else {
      foreach it in avgmap
        realavg += to_int(avgmap[it]);
      attributes.mys = (realavg/2);
  }
  realavg = 0;
  clear(avgmap);
 
  //Adventures
  range_string = consumable.adventures;
  avgmap = split_string(range_string, "-");
  if (count(avgmap) == 1)
      attributes.adv = to_int(range_string);
  else {
      foreach it in avgmap
        realavg += to_int(avgmap[it]);
      attributes.adv = (realavg/2);
  }
  realavg = 0;
  clear(avgmap);
return attributes; 
}
 
stats = item_avg($item[mae west]);
print("Item "+stats.thing+" is a "+item_type(stats.thing)+" which gives the following averages:", "green");
print("Moxie--"+stats.mox+", Muscle--"+stats.mus+", Mysticality--"+stats.mys+", and Adventures--"+stats.adv+".", "blue");
</syntaxhighlight>|
moreinfo=
}}|
 
special=This function technically returns an array, not a map. The information in both is accessed in the same way. However, you cannot add new key-value pairs to an array (its length is static once set).<br></p>
{{CodeSample|
description=This also means that the array will always contain at least 1 key (0), even if it was supplied an empty string. As such, using [[count]] on the result is not a fully reliable way to know how many items were in a list.|
code=
<syntaxhighlight>
print( split_string("", ",").count() );
print( split_string("a", ",").count() );
print( split_string("a,b", ",").count() );
print( split_string("a,b,c", ",").count() );
print( split_string("a,b,c,d,e,f,g", ",").count() );
</syntaxhighlight>|
moreinfo=Will return: 1, 1, 2, 3, 7
}}<p>
|
}}
}}


[[Category:String Handling Routines]]
[[Category:String Handling Routines]]

Latest revision as of 00:41, 21 August 2020

Function Syntax

string [int] split_string(string source )

string [int] split_string(string source ,string delimiter )

  • source is the string to split
  • delimiter is the (optional) regular expression to split with

Returns an array of your source, split by either delimiter or by line-breaks if not supplied.

Code Samples

The following example shows how split string can easily convert comma separated strings into useful data.

string items, numbers, total_string;
int total;
item thing;
string[int] split_map;
numbers = "1, 203, 20002, 450, 194, 92992, 9000, 1";
items = "mae west, asshat, hell ramen, bird, batblade";

split_map = split_string(numbers, ",");
print("You have a total of "+count(split_map)+" numbers.", "blue");
print("They are the following:", "blue");
foreach it in split_map {
   print(split_map[it]);
   total+=to_int(split_map[it]);
}
total_string = to_string(total, "%,d");
print("Their total is: "+total_string+".", "blue");
print("");
//Items
clear(split_map);
split_map = split_string(items, ",");
print("You have a total of "+count(split_map)+" items.", "blue");
print("They are the following:", "blue");
foreach it in split_map {
   thing = to_item(split_map[it]);
   if (thing == $item[none])
      print(split_map[it]+" is not a valid item", "red");
   else
      print(thing);
}


The following example uses KoLMafia's proxy record of an consumable to return the min-max values of the consumable's moxie/muscle/mysticality/adventure gains. Using split string, it finds the average of each gain and returns it in a record.

record item_range {
   float mox;
   float mus;
   float mys;
   float adv;
   item thing;
};
item_range stats;

item_range item_avg(item consumable) { //Input food/drink/spleen               
   item_range attributes;
   string[int] avgmap;       
   float realavg;
   string range_string;
   attributes.thing = consumable;
   if (consumable.fullness == 0 && consumable.inebriety == 0 && consumable.spleen == 0){
      print(consumable+" is not a valid consumable.", "red");
      return attributes;
   }
   
   //Moxie
   range_string = consumable.moxie;
   avgmap = split_string(range_string, "-");
   if (count(avgmap) == 1)
      attributes.mox = to_int(range_string);
   else {
      foreach it in avgmap
         realavg += to_int(avgmap[it]);
      attributes.mox = (realavg/2);
   }
   realavg = 0;
   clear(avgmap);
   
   //Muscle
   range_string = consumable.muscle;
   avgmap = split_string(range_string, "-");
   if (count(avgmap) == 1)
      attributes.mus = to_int(range_string);
   else {
      foreach it in avgmap
         realavg += to_int(avgmap[it]);
      attributes.mus = (realavg/2);
   }
   realavg = 0;
   clear(avgmap);
   
   //Mysticality
   range_string = consumable.mysticality;
   avgmap = split_string(range_string, "-");
   if (count(avgmap) == 1)
      attributes.mys = to_int(range_string);
   else {
      foreach it in avgmap
         realavg += to_int(avgmap[it]);
      attributes.mys = (realavg/2);
   }
   realavg = 0;
   clear(avgmap);
   
   //Adventures
   range_string = consumable.adventures;
   avgmap = split_string(range_string, "-");
   if (count(avgmap) == 1)
      attributes.adv = to_int(range_string);
   else {
      foreach it in avgmap
         realavg += to_int(avgmap[it]);
      attributes.adv = (realavg/2);
   }
   realavg = 0;
   clear(avgmap);
return attributes;   
}

stats = item_avg($item[mae west]);
print("Item "+stats.thing+" is a "+item_type(stats.thing)+" which gives the following averages:", "green");
print("Moxie--"+stats.mox+", Muscle--"+stats.mus+", Mysticality--"+stats.mys+", and Adventures--"+stats.adv+".", "blue");

Special

This function technically returns an array, not a map. The information in both is accessed in the same way. However, you cannot add new key-value pairs to an array (its length is static once set).

This also means that the array will always contain at least 1 key (0), even if it was supplied an empty string. As such, using count on the result is not a fully reliable way to know how many items were in a list.

print( split_string("", ",").count() );
print( split_string("a", ",").count() );
print( split_string("a,b", ",").count() );
print( split_string("a,b,c", ",").count() );
print( split_string("a,b,c,d,e,f,g", ",").count() );

Will return: 1, 1, 2, 3, 7