I have a table with 13 entries, but based on a variable (values -1, 0, 1) I would want to return from items 1-11, 2-12, or 3-13 respectively. So the variable value would essentially tell the generator to ignore some entries from the head or tail of the list. Is there a way to accomplish this in Perchance?

  • @wthit56
    link
    English
    12 months ago

    There are a couple of ways… One is using odds to prevent/allow items from being selected.

    But, thinking about this a different way, you can make groups with the name -1, 0, and 1, and grab a group by name–with your variable.

    Each item and group/list is a property of its parent:

    parent
      child1
      child2
    

    You can grab child1 by using the code parent.child1. But also if you have a variable prop_name with the value "child1" you can use that to grab a property of that name using the code parent[prop_name]. Even if the variable’s value is a number like -1, 0, or 1, you can use it the same way.

    I’ve demonstrated both methods here: https://perchance.org/679qmltn63#edit

  • VioneTM
    link
    English
    1
    edit-2
    2 months ago

    If I understand correctly, you have something like:

    val
      -1
      0
      1
    
    entries
      a
      b
      c
      d
      e
      f
      g
      h
      i
      j
      k
      l
      m
    

    Then based on the val, you would have to select: (a) if val = -1, only from a to k, (b) from b to l, © from c to m.

    Here is my solution: https://perchance.org/8horj02y80

    First, we select the val, and then base the range from it. Since it is from 1-11, etc, we can have the base to be 2-12, then add (subtract) the modifier to have 1-11 for -1, 2-12 for 0, and 3-13 for +1, by having a min and max variables:

    modOut
      Modifier: [mod = val.selectOne] | Min: [min = 2 + mod] | Max: [max = 12 + mod]
    

    Then, to create a ‘dynamic’ range, we use JavaScript’s Template Literals, to create a dynamic Perchance Shorthand List:

    random = [`{${min}-${max}}`]
    

    Essentially, the template literal would be evaluated first, so if we have min as 3 and max as 13, then it would be {3-13}, and then Perchance would evaluate that into a random number between that range.

    We can now then use that value to select the item from our list, in which we can do in many ways:

    • Via .selectAll[index-1] since the arrays are accessed with zero-start indexing.
    entryOut
      Selection: [x = random.evaluateItem] | Entry: [entries.selectAll[x-1].upperCase]
    
    • Via Dynamic Odds (What is on the demo generator) For the dynamic odds, we can just add them directly on the entry list:
    entries
      a ^[x == 1]
      b ^[x == 2]
      c ^[x == 3]
      d ^[x == 4]
      e ^[x == 5]
      f ^[x == 6]
      g ^[x == 7]
      h ^[x == 8]
      i ^[x == 9]
      j ^[x == 10]
      k ^[x == 11]
      l ^[x == 12]
      m ^[x == 13]
    

    where x is selected before selecting the entry:

    entryOut
      Selection: [x = random.evaluateItem] | Entry: [entries.upperCase]
    
  • @cwiggins999OP
    link
    English
    1
    edit-2
    2 months ago

    Thanks for these solutions - clearly I have a lot to learn about Perchance, and some of these techniques will be helpful with some things I want to do in the future. I just discovered Perchance within the last week and really finding it useful for some tools for gaming.

    I came up with this solution after posting the question - I created a “showhead” and “showtail” variable and set them to 0 or 1 based on my input field value, then tagged just the first and last list entries with “conditional odds” based on that value - like

    lastitem ^[showtail]