Allereerst, sorry voor de wazige titel, maar kon niets beters bedenken.


Ik heb een string met een variabele lengte tussen de 1 en de 9, die ik split in een losse array (per teken). so far so good.

Vervolgens moeten deze gesplits worden in maximaal 3 groepen waarbij elke groep tenminste 1 waarde bevat. als er maar 2 tekens in de string staan worden het maximaal 2 groepen.

Nu ben ik op zoek naar een manier om alle mogelijke verdeel combinaties te krijgen.

Voorbeeld
string : 1234

Opties :
[123,4]
[12,34]
[1,234]

Voorbeeld 2
string : 123456

Opties :
[123,456]
[12,345,6]
[1,234,56]
[12,34,56]
[12,3,456]
enz. het idee lijkt me duidelijk (nee bovenstaand zijn niet alle mogelijke combinaties, ben ik me van bewust.

De volgorde hoeft niet te veranderen, en in de daadwerkelijke code zijn het binaire getallen, maar heb nu even 1 t/m 9 gebruikt voor de duidelijkheid.

Hopelijk heeft iemand een suggestie want kan even niets bedenken

Mvg,
Jacco
Heb je hier misschien iets aan?


<?php

$string = "654321";

for ($i = 1; $i < strlen($string); $i++) {
    $restult[] = substr($string, 0, $i) . ',' . substr($string, $i);
}

echo '<pre>';
var_dump($restult);

/*

array(5) {
  [0]=>
  string(7) "6,54321"
  [1]=>
  string(7) "65,4321"
  [2]=>
  string(7) "654,321"
  [3]=>
  string(7) "6543,21"
  [4]=>
  string(7) "65432,1"
}

*/

?>
Sorry, was 1 specificatie vergeten, een groep mag niet meer dan 3 waarden bevatten. Excuus :)

En ja dat is mogelijk wel een begin, maar verder dan dat ben ik niet gekomen :). Ik ga er nog verder over nadenken, verdere input zou gewardeerd worden :),

Maar dank je wel voor het meedenken
Mn werk, meer kan ik er niet over roepen helaas :)
Nu ja, je hebt zelf al min of meer een spec he. Die kun je gebruiken om randvoorwaarden te programmeren.

Je hebt een lengte: minimaal 1, maximaal 9.
Je hebt het maximaal aantal groepen, afhankelijk van lengte: 1 (lengte 1), 2 (lengte 2), 3 (lengte 3-9).
Je hebt de maximale lengte van een groep, mogelijk beperkt door de lengte van de invoer: 1 (lengte 1), 2 (lengte 2), 3 (lengte 3-9).

De laatste twee zaken impliceren elkaar min of meer.

Waar je eigenlijk naar op zoek bent zijn "lengtecombinaties". Invoer ter lengte 1 heeft maar één combinatie: 1. Invoer ter lengte 2 heeft meerdere combinaties:
11
2

Invoer ter lengte 3 heeft meerdere combinaties:
111
12
21
3

Invoer ter lengte 4 heeft meerdere combinaties:
112 (max 3 groepen restrictie)
121
13
211
22
31

Deze kun je lexicografish ordenen.

Aangezien je invoer maximum lengte 9 heeft en groepen niet groter dan 3 zijn zullen de combinaties dus altijd tussen 1 en 333 liggen. De cijfersom dient dan hetzelfde te zijn als de lengte van de invoer. Deze combinaties zou je dus eenmalig kunnen berekenen op deze manier.

<?php
for ($i=1; $i < 10; $i++) {
    ?><h2>combinations for length <?php echo $i; ?></h2><?php
    $combinations = array(); // to filter out doubles
    for ($j=1; $j < 334; $j++) {
        // note: 0 is allowed, the 0 just needs to be filtered out afterwards
        // note: second part is expensive, but is only executed if first part is true due to lazy evaluation
        if (array_sum(str_split($j)) == $i && preg_match('#^[0-3]*$#', $j) === 1) {
            // strip zeroes
            $match = str_replace('0', '', $j);
            // store as key so duplicates are removed
            $combinations[$match] = true;
        }
    }
    ?><ul><?php
        foreach (array_keys($combinations) as $v) {
            ?><li><?php echo $v; ?></li><?php
        }
    ?></ul><?php
}
?>

De rest lijkt mij makkelijk als je deze combinaties hebt?

En sinds het je werk betreft - had je hier niet zelf uit kunnen/moeten komen? :p
Thomas, jij loopt op je werk/opleiding nooit tegen iets aan waar je even geen oplossing voor ziet ;)?
Continu, maar ik start meestal met een soort van strategie en/of probeer iets abstracts concreet te maken en gaandeweg door gewoon eerst wat testjes in klad uit te voeren kom je vaak al een heel eind.
Thomas van den Heuvel op 23/01/2019 10:22:27

Continu, maar ik start meestal met een soort van strategie en/of probeer iets abstracts concreet te maken en gaandeweg door gewoon eerst wat testjes in klad uit te voeren kom je vaak al een heel eind.


En je denkt dat ik dat niet gedaan heb :)? Verder intressante dicussie maar niet voor dit topic
Thomas van den Heuvel op 23/01/2019 10:09:21

En sinds het je werk betreft - had je hier niet zelf uit kunnen/moeten komen? :p

Als de vraag was geweest "hoe include ik een bestand" dan had ik je zowaar gelijk gegeven, maar ook jij ziet toch dat dit een wat complexer gevalletje is?

Misschien is het voor jou gesneden koek, maar dat wil niet zeggen dat het dat voor iemand anders ook is. Iedereen heeft zijn/haar eigen kwaliteiten en interessegebieden. Van de zijlijn roepen dat iemand 'iets had moeten weten' omdat het z'n werk is (hoe onschuldig wellicht bedoeld ook) komt een beetje betweterig over en bovendien doe je daarmee iemands kwaliteiten tekort. Het voegt mijns inziens weinig toe. Ik ken je inmiddels langer en daardoor weet ik dat je het niet verkeerd bedoelt, maar zeggen dat iemand z'n werk niet goed doet (zo komt het nu een beetje over) is niet echt heel tof ;)

Reageren