Rysuj spiralne słowa [zamknięte]

11

Scenariusz

Biorąc pod uwagę wprowadzanie małych liter i spacji ASCII, narysuj spiralę znaków, która śledzi oryginalne wprowadzanie znaków bez spacji.

Zasady

1) Postacie będą spiralnie skierowane w lewo, w lewo, na zewnątrz. Jeśli skręt w lewo nie jest możliwy, idź prosto.

Given: abcdefg
Output:
  g
baf   
cde   

Pierwszy przykład śledzenia obrazu

2) Postacie mogą przechodzić w spiralę do poprzednich postaci, o ile zasada nr 1 nie zostanie naruszona. Ponadto, jeśli postać jest spiralna, to ta postać jest pisana wielkimi literami. Gdy postać zostanie zapisana wielkimi literami, pozostanie wielka, niezależnie od tego, ile razy zostanie ponownie użyta.

Given: apples appeal
Output:
PAs
PLe
ea

Drugi przykład śledzenia obrazu

Tim Reddy
źródło
1
Więc jeśli słowo trzyma się spirali, ale narusza następny znak, to program się zatrzymuje?
Matt
Myślę, że to, co sprawia, że ​​jest to dobre wyzwanie, polega na tym, że trzeba „przewinąć stos”, żeby tak rzec i wznowić w punkcie, w którym reguła nr 1 zawsze działa.
Tim Reddy,
5
Obecne sformułowanie sprawia, że ​​reguła 2 wydaje się całkowicie opcjonalna. Jeśli powinno to być obowiązkowe, to uważam, że konieczny jest o wiele bardziej kompleksowy zestaw testów.
Peter Taylor
1
Jakie powinny być dane wyjściowe dla danych wejściowych abcdefghab?
Peter Taylor

Odpowiedzi:

2

JavaScript, 225 221 212 bajtów

-9 bajtów dzięki Conorowi O'Brienowi

Pamiętaj, że Twoje przypadki tekstowe są ze sobą sprzeczne. Twój pierwszy przypadek testowy zaczyna się na środku spirali. Drugi przypadek testowy rozpoczyna się w górnej środkowej części spirali. Poszedłem z twoim pierwszym przypadkiem testowym, ponieważ był to pierwszy, który widziałem. Nie edytowałeś swojego pytania od ponad roku, przepraszam za domniemanie.

Pierwszy przypadek testowy:

9<-8<-7
|     |
2<-1  6
|     |
3->4->5

Drugi przypadek testowy:

2<-1<-6
|     |
3->4->5
|     |
7->8->9

Bez dalszego adiuu, oto kod do gry w golfa. Jestem w 100% pewien, że jeśli społeczność to zepsuje, można to znacznie zmniejszyć. Zwraca tablicę multilinii.

s=>eval("s=[...s.replace(/ /g,'')];i=0;k=j=1;a=[[],[],[]];b='00122210';c=b*100+'';for(;;){for(l=0;l<8;l++){if(!s[i])break;if(a[k][j]==s[i])s[i]=s[i].toUpperCase();a[k][j]=s[i];k=b[l];j=c[l];i++}if(!s[i])break}a")

Fragment wstępnego oczyszczania (drukuje ciąg konsoli wielowierszowej na konsoli). Proszę zwrócić uwagę na inne w moim przypadku testowym nr 2 i przypadku testowym OP nr 2 (patrz wyżej, jeśli jeszcze tego nie zrobiłeś):

(jeśli ktoś z większym doświadczeniem z fragmentami chce to naprawić w danych HTML, możesz go edytować, muszę iść spać).

f=
s=>eval("s=[...s.replace(/ /g,'')];i=0;k=j=1;a=[[],[],[]];b='00122210';c=b*100+'';for(;;){for(l=0;l<8;l++){if(!s[i])break;if(a[k][j]==s[i])s[i]=s[i].toUpperCase();a[k][j]=s[i];k=b[l];j=c[l];i++;g(a)}if(!s[i])break}a")

//replace argument here to change output
var arr = f("apples appeal");

function g(ar) {
  var str = "";

  for (x = 0; x < 3; x++) {
    for (y = 0; y < 3; y++) {
      str += ar[y][x] || " ";
    }
    str += "\n";
  }
  console.log(str);
}

Niegolfowane i wyjaśnienie

f=(input)=>{
    //remove spaces
    input = input.replace(/ /g, "");

    //convert to array (so I can uppercase individual letters)
    input = input.split("");

    //position in input
    var pos = 0;

    //positions inside output
    var xPos = 1;
    var yPos = 1;

    //output container (3 rows, 3 columns)
    var arr = [[],[],[]];

    //counterclockwise indexes for x
    var xOrder = "00122210";

    //counterclockwise indexes for y
    //var yOrder = "12221000"
    var yOrder = xOrder * 100 + "";

    //loop infinitely (breaks when input[pos] is undefined)
    for (;;) {
        //loop around circle
        for (var i = 0; i < 8; i++) {
            if (!input[pos]) {
                break;
            }

            //if item already in array equal next item in input, set next item in input to caps before
            if (arr[xPos][yPos] == input[pos]) {
                input[pos] = input[pos].toUpperCase(); 
            }

            //write or overwrite in array with current from input
            arr[xPos][yPos] = input[pos];

            //increment last because we do not prime our loops
            xPos = xOrder[i];
            yPos = yOrder[i];
            pos++;
        }
        if(!input[pos]) {
            break;
        }
    }
    return arr;
}
Stephen
źródło
1
a.split("")jest równoważne z [...a]; s=>{...;return a;}jest równoważne s=>eval("...;a")(i ;jest opcjonalne w wersji mniej golfowej); wszystkie średniki, po których następuje znak, }są opcjonalne
Conor O'Brien
@ ConorO'Brien dziękuję :)
Stephen
Jakie wyniki otrzymujesz dla przypadku testowego apples appeal? Rozumiem ppa eas aLe, co zdecydowanie nie jest poprawne, ponieważ nie ma lobok niego p.
Peter Taylor
@PeterTaylor wyjście jest poprawne, zgodnie ze kolejnością spiralną pierwszego przypadku testowego, na którym oparłem swój program. Drugi przypadek testowy wykorzystuje inną kolejność spirali (zaczyna się u góry). Dodałem dziennik dla każdej iteracji fragmentu. Spójrz na to - może to mieć więcej sensu.
Stephen
Zgodnie z logiką pierwszego przypadku testowego wynik byłby następujący eppa apas lple s.
Peter Taylor