Нарисуйте спиральные слова [закрыто]


11

Сценарий

Учитывая ввод строчных букв и пробелов ASCII, нарисуйте спираль символов, которая отслеживает исходный ввод символов, исключая пробелы.

Правила

1) Персонажи должны вращаться наружу против часовой стрелки влево. Если поворот налево невозможен, двигайтесь прямо.

Given: abcdefg
Output:
  g
baf   
cde   

Первый пример трассировки изображения

2) Символы могут переходить в предыдущие символы, если правило № 1 не нарушено. Кроме того, если этот символ находится в спирали, то этот символ в верхнем регистре. После того, как символ в верхнем регистре, он останется в верхнем регистре, независимо от того, сколько раз он используется повторно.

Given: apples appeal
Output:
PAs
PLe
ea

Второй пример трассировки изображения


1
Так что, если слово остается в спирали, но нарушает следующий символ, то программа останавливается?
Мэтт

Я думаю, что делает это хорошим вызовом, так это то, что вам придется «перематывать стек», так сказать, и возобновлять в точке, которая заставляет правило № 1 всегда работать.
Тим Редди

5
Текущая формулировка делает правило 2 совершенно необязательным. Если это будет обязательным, то я думаю, что необходим гораздо более полный набор тестов.
Питер Тейлор

1
Каким должен быть вывод для ввода abcdefghab?
Питер Тейлор

Ответы:


2

JavaScript, 225 221 212 байт

-9 байтов благодаря Конору О'Брайену

Обратите внимание, что ваши текстовые случаи конфликтуют друг с другом. Ваш первый контрольный пример начинается с середины спирали. Ваш второй контрольный пример начинается с верхней середины спирали. Я пошел с твоим первым тестовым примером, потому что это был первый, который я видел. Вы не редактировали свой вопрос более года, поэтому извините за презумпцию.

Первый тестовый пример:

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

Второй контрольный пример:

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

Без лишних слов, вот код для игры в гольф. Я на 100% уверен, что если сообщество сделает это, это может быть значительно сокращено. Это возвращает многострочный массив.

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")

Фрагмент преттификации (выводит многострочную строку на консоль). Обратите внимание на различия в моем тестовом примере № 2 и тестовом сценарии № 2 OP (см. Выше, если вы этого еще не сделали):

(если кто-то с большим опытом работы с фрагментами кода хочет исправить это в HTML-вводе, не стесняйтесь редактировать это, мне нужно идти спать).

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);
}

Ungolfed и объяснение

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;
}

1
a.split("")эквивалентно [...a]; s=>{...;return a;}эквивалентно s=>eval("...;a");является необязательным в менее гольфовой версии); все точки с запятой, за которыми следует знак «а» }, необязательны
Конор О'Брайен,

@ ConorO'Brien спасибо :)
Стивен

Какой вывод вы получите для теста apples appeal? Я вижу ppa eas aLe, что, безусловно, не правильно, потому что нет lрядом с pс.
Питер Тейлор

@PeterTaylor вывод правильный, в соответствии со спиральным порядком первого контрольного примера, на котором я основывал свою программу. Во втором тестовом примере используется другой порядок спирали (начинается сверху). Я добавил журнал для каждой итерации фрагмента. Посмотрите на это - это может иметь больше смысла.
Стивен

По логике первого контрольного примера результат будет eppa apas lple s.
Питер Тейлор
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.