WebHU - Programozási kérdések és válaszok

Perl Morgan és egy húr?

Megpróbálom megoldani ezt a problémát a hackerranken :

Tehát a probléma:

Jack és Daniel barátok. Mindketten szeretik a betűket, különösen a nagybetűket. Nagybetűket vágnak ki újságokból, és mindegyiküknek külön kötegben van a betűgyűjteménye. Egy szép napon Morgan meglátogatta Jacket és Danielt. Látta a gyűjteményeiket. Morgan kíváncsi volt, mi az a lexikográfiailag minimális zsinór, amely ebből a két gyűjteményből áll. El tud venni egy levelet egy gyűjteményből, ha az a verem tetején van. Ezenkívül Morgan a fiúk gyűjteményében lévő összes betűt fel akarja használni.

Ez a próbálkozásom Perlben:

#!/usr/bin/perl
use strict;
use warnings;
chomp(my $n=<>);
while($n>0){
    chomp(my $string1=<>);
    chomp(my $string2=<>);
    lexi($string1,$string2);
    $n--;
}
sub lexi{
   my($str1,$str2)=@_;
   my @str1=split(//,$str1);
   my @str2=split(//,$str2);
   my $final_string="";

   while(@str2 && @str1){
       my $st2=$str2[0];
       my $st1=$str1[0];
       if($st1 le $st2){
         $final_string.=$st1;
         shift @str1;
       }
       else{
          $final_string.=$st2;
          shift @str2;
       }
  }
  if(@str1){
       $final_string=$final_string.join('',@str1);
  }
  else{
       $final_string=$final_string.join('',@str2);
  }
  print $final_string,"\n";
}

Mintabevitel:

2
JACK
DANIEL
ABACABA
ABACABA

Az első sor a tesztesetek számát tartalmazza, T. Minden következő két sor ilyen formátumú: az első sorban az A karakterlánc, a másodikban a B karakterlánc található.

Minta kimenet:

DAJACKNIEL
AABABACABACABA

De a teszteset minta esetében megfelelő eredményeket ad, míg rossz eredményeket egyéb teszteseteknél . Az egyik olyan eset, amelynél helytelen eredményt ad

1
AABAC
AACAB

AAAABACABC helyett AAAABACCAB-t ad ki.

Nem tudom, mi a baj az algoritmussal, és miért nem működik más teszteseteknél?

Frissítés:

@squeamishossifrage megjegyzések szerint Ha hozzáteszem

($str1,$str2)=sort{$a cmp $b}($str1,$str2);

Az eredmények a felhasználói beviteltől függetlenül ugyanazok, de a teszteset továbbra is sikertelen.

09.11.2015

  • Célszerűbb egy összefoglalót mellékelnie a megoldani kívánt dologról – különben válasza erre a linkre támaszkodik, ami rossz hír, ha eltűnik. 09.11.2015
  • @Sobrique hozzáadta az összefoglalót és az Input/Output. 09.11.2015
  • Nincs időm rájönni, mi a probléma, de nagyon könnyű találni olyan teszteseteket, amelyeknél a kód sikertelen. Például a AABAC és AACAB karakterláncok eltérő eredményeket adnak a megjelenítési sorrendtől függően. 09.11.2015
  • Nem ismerem Perlt. A teljes fennmaradó karakterláncot hasonlítja össze, vagy csak az aktuális karaktert? Mindenképpen az előbbit kell csinálni. 09.11.2015
  • @squeamishossifrage Meghiúsul, ha a karakterláncok mindkét karaktere egyenlő, és Sikertelen, mert eltávolítja a karaktereket a különböző karakterláncokból a felhasználói beviteltől függően, és nem vagyok benne biztos, hogy melyik karakterláncból vegyem el a karaktert, ha egyenlőek 09.11.2015
  • Az @ikegami tesztesetek túl nagyok ahhoz, hogy manuálisan elemezzük. mindenesetre ez nem sikerül. bevitel és 09.11.2015

Válaszok:


1

A probléma az egyenlő karakterek kezelésében van. Vegyük a következő példát:

ACBA
BCAB

Amikor két azonos karakterrel állsz szemben (a példámban C), naivan az első karakterláncból választottad ki, de ez nem mindig helyes. Előre kell nézni, hogy megszakíthassa a kapcsolatokat. Lehet, hogy sok karaktert előre kell néznie. Ebben az esetben a második karakterlánc C után következő karaktere alacsonyabb, mint az első karakterlánc következő karaktere, ezért először a második karakterlánc C-jét kell átvennie.

Ha a karakterláncokat karakterláncként hagyja, egy egyszerű karakterlánc-összehasonlítás annyi karaktert hasonlít össze, amennyi szükséges annak meghatározásához, hogy melyik karaktert használja.

sub lexi {
   my ($str1, $str2) = @_;

   utf8::downgrade($str1);  # Makes sure length() will be fast
   utf8::downgrade($str2);  # since we only have ASCII letters.

   my $final_string = "";
   while (length($str2) && length($str1)) {
      $final_string .= substr($str1 le $str2 ? $str1 : $str2, 0, 1, '');
   }

   $final_string .= $str1;
   $final_string .= $str2;
   print $final_string, "\n";
}
09.11.2015
  • rendezésük után ellenőrizze az általam kiválasztott frissítést smaller string lexicographically. 09.11.2015
  • Köszönöm szépen @ikegami Megértem Köszönöm milliószor. 09.11.2015
  • Valójában a feltételekben korlátaink vannak. El tud venni egy levelet egy gyűjteményből, ha az a verem tetején van. Tehát a Solution ne használjon gyorsítótárat. Ellenkező esetben rossz a feladatbeállításunk!!! A $str1 le $str2 használatával egész karakterláncokat hasonlít össze, nem csak az utolsó karaktert, mint például a STACK-ban 20.11.2015
  • @Jevgen Kulik, ez szándékos. Ha csak a ‹strike›last‹/strike›next karaktert hasonlítjuk össze, az rossz lenne. Ez az, amit az OP csinált, és ezért nem kapott rossz eredményt. Addig kell összehasonlítania a karaktereket, amíg az egyik el nem tér. Ezt válaszomban részletesen kifejtettem. 20.11.2015

  • 2

    Túl kevés válasz a hozzászóláshoz, így a válasz:

    Amit tennie kell, az az, hogy előre tekintsen, ha a két karakter egyezik. Jelenleg egy egyszerű le egyezést végez, és abban az esetben

    ZABB
    ZAAA
    

    ZABBZAA-t kapsz, mivel az első Z egyezés le Z lesz. Tehát azt kell tenned (egy naiv megoldás, ami valószínűleg nem lesz túl hatékony), hogy addig nézel, amíg a karakterláncok/karakterek egyeznek, így:

    Z eq Z
    ZA eq ZA
    ZAB gt ZAA
    

    és ezen a ponton tudni fogja, hogy a második karakterlánc az, amelyből az első karaktert ki akarja állítani.

    Szerkesztés Frissítettél a karakterláncok rendezésével, de ahogy írtam, továbbra is előre kell nézned. A rendezés megoldja a fenti két karakterláncot, de ezzel a kettővel sikertelen lesz:

    ZABAZA
    ZAAAZB
    ZAAAZBZABAZA
    

    Mert itt a helyes válasz a ZAAAZABAZAZB, és nem találja meg ezt a karakterenkénti összehasonlításnál.

    09.11.2015
  • since the first match Z will be le Z. elmagyaráznád bővebben? 09.11.2015
  • Biztosan tudom kommentálni a saját bejegyzéseimet: a kódodban benne van az első két karakter, és mindkettő Z. A le-t csinálod (a ‹= alfa megfelelője), így mindig az elsőt választja a két karakterlánc közül. mint a preferált. Azonban csak ez az oka annak, hogy különböző sorrendben eltérő eredményt kap. Az igazi probléma az, hogy nem nézel előre. Szükséged lesz if ($str1 eq $str2) { folytassa az alstringek összehasonlítását, amíg meg nem látja, melyik útvonal a legrövidebb }, a jelenlegi if/else nem elég 09.11.2015
  • Köszönöm @jon Egy egész napba telt mire megértettem ezt. 09.11.2015
  • Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..