スパイラルワードの描画[終了]


11

シナリオ

ASCIIの小文字とスペースの入力が与えられた場合、スペースを除く文字の元の入力をトレースする文字のスパイラルを描きます。

ルール

1)キャラクターは、反時計回りに左回りに外側に向かって渦巻くものとする。左折できない場合は、まっすぐに進みます。

Given: abcdefg
Output:
  g
baf   
cde   

画像トレースの最初の例

2)ルール#1に違反しない限り、キャラクターは前のキャラクターにスパイラルできます。また、その文字がらせん形になっている場合、その文字は大文字になります。文字が大文字になると、再利用の回数に関係なく大文字のままになります。

Given: apples appeal
Output:
PAs
PLe
ea

イメージトレースの2番目の例


1
単語がスパイラルのままで、次の文字に違反する場合、プログラムは停止しますか?
マット

これが良い挑戦となるのは、ルール#1が常に機能するポイントで話して再開するために「スタックを巻き戻す」必要があることだと思います。
ティムレディ

5
現在の文言では、ルール2は完全にオプションのように見えます。必須の場合は、より包括的なテストスイートが必要だと思います。
ピーターテイラー

1
入力用の出力は何abcdefghabですか?
ピーターテイラー

回答:


2

JavaScript、225 221 212バイト

コナー・オブライエンのおかげで-9バイト

テキストケースが互いに競合することに注意してください。最初のテストケースは、スパイラルの途中から始まります。2番目のテストケースは、スパイラルの上部中央から始まります。私が見た最初のテストケースだったので、私はあなたの最初のテストケースを使いました。質問を1年以上編集していないため、推定にごめんなさい。

最初のテストケース:

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

2番目のテストケース:

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

これ以上何もせずに、ここにゴルフのコードがあります。コミュニティがそれをチップ化すれば、これを大幅に削減できると確信しています。これは複数行の配列を返します。

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とOPのテストケース#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 }が後に続くすべてのセミコロンはオプションです
コナーオブライエン

@ ConorO'Brienありがとう:)
スティーブン

このテストケースではどのような出力が得られapples appealますか?が表示されてppa eas aLeいますが、これは間違いです。これはのl隣にないためpです。
ピーターテイラー

@PeterTaylor出力は、プログラムの基になった最初のテストケースのスパイラル順に従って正しいです。2番目のテストケースでは、異なるスパイラル順序を使用します(先頭から開始)。スニペットの反復ごとにログを追加しました。それを見てください-それはもっと理にかなっているかもしれません。
スティーブン

最初のテストケースのロジックでは、出力はになりますeppa apas lple s
ピーターテイラー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.