Намалюйте спіральні слова [закрито]


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 байт завдяки Conor O'Brien

Зверніть увагу, що ваші текстові справи суперечать один одному. Ваш перший тестовий випадок починається посередині спіралі. Ваш другий тестовий випадок починається у верхній середині спіралі. Я поїхав із вашим першим тестовим випадком, тому що це був перший, який я побачив. Ви не редагували своє запитання більше року, так що вибачте за презумпцію.

Перший тестовий випадок:

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 ОП (див. Вище, якщо ви ще цього не зробили):

(якщо хтось із більшим досвідом роботи з фрагментами хоче зафіксувати це у введенні 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);
}

Необов’язаний і пояснення

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");в менш гольф-версії необов'язково); усі крапки з комою, за якими слідує a }, необов’язкові
Conor O'Brien

@ ConorO'Brien дякую :)
Стівен

Який результат ви отримуєте для тестового випадку apples appeal? Я бачу ppa eas aLe, що, безумовно, невірно, тому що lпоруч із ps немає.
Пітер Тейлор

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

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