Spiral Kelimeler Çiz [kapalı]


11

Senaryo

ASCII küçük harf ve boşluk girdisi verildiğinde, boşluklar hariç orijinal karakter girişini izleyen bir karakter spirali çizin.

Kurallar

1) Karakterler dışa doğru saat yönünün tersine sola sarılmalıdır. Sola dönüş mümkün değilse, düz hareket edin.

Given: abcdefg
Output:
  g
baf   
cde   

Resim izleme ilk örneği

2) Kurallar, # 1 kuralı ihlal edilmediği sürece önceki karakterlere girebilir. Ayrıca, bu karakter içine sarılırsa, o karakter büyük harfle yazılır. Bir karakter büyük harfle yazıldığında, tekrar kullanım sayısına bakılmaksızın büyük harf olarak kalacaktır.

Given: apples appeal
Output:
PAs
PLe
ea

Resim izleme ikinci örneği


1
Eğer kelime sarmal içine girer, ancak bir sonraki karakteri ihlal ederse, o zaman program durur?
Matt

Bu iyi bir meydan okuma yapan şey, kural 1'i her zaman işe yarayan bir noktada konuşmak ve devam etmek için "yığını geri sarmanız" gerekeceğini düşünüyorum.
Tim Reddy

5
Mevcut ifade, kural 2'nin tamamen isteğe bağlı görünmesini sağlar. Zorunlu olması durumunda çok daha kapsamlı bir test paketinin gerekli olduğunu düşünüyorum.
Peter Taylor

1
Girdi için çıktı ne olmalıdır abcdefghab?
Peter Taylor

Yanıtlar:


2

JavaScript, 225 221 212 bayt

Conor O'Brien sayesinde -9 bayt

Lütfen metin durumlarınızın birbiriyle çakıştığını unutmayın. İlk test durumunuz spiralin ortasında başlar. İkinci test durumunuz spiralin üst ortasında başlar. İlk test durumunuzla gittim, çünkü ilk gördüğüm durum buydu. Sorunuzu bir yıldan uzun bir süredir düzenlemediniz, varsayım için çok üzgünüm.

İlk Test Durumu:

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

İkinci Test Durumu:

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

Başka bir şey olmadan, burada golf kodu. Ben topluluk cips eğer bu önemli ölçüde kesilebilir% 100 eminim. Bu, çok satırlı bir dizi döndürür.

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

Öncelik snippet'i (çok satırlı bir dizeyi konsola yazdırır). Lütfen test durumum # 2 ve OP'nin test durumum # 2'deki farklı notlara dikkat edin (henüz yapmadıysanız yukarıya bakın):

(snippet'lerle daha fazla deneyimi olan biri bunu HTML girişine düzeltmek istiyorsa, bunu düzenlemek için çekinmeyin, yatağa gitmem gerekiyor).

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

Açıklanmamış ve Açıklama

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("")eşittir [...a]; s=>{...;return a;}eşdeğerdir s=>eval("...;a")(ve ;daha az golf edilmiş versiyonda isteğe bağlıdır); a'nın ardından gelen tüm noktalı virgüller }isteğe bağlıdır
Conor O'Brien

@ ConorO'Brien teşekkür ederim :)
Stephen

Test senaryosu için hangi çıktıyı alıyorsunuz apples appeal? Görüyorum ppa eas aLeki bu kesinlikle doğru değil çünkü s'nin lyanında yok p.
Peter Taylor

@PeterTaylor, programımı dayandırdığım ilk test vakasının spiral sırasına göre çıktı doğru. İkinci test durumu farklı bir spiral düzen kullanır (üstten başlar). Snippet'in her yinelemesi için bir günlük ekledim. Şuna bak - daha mantıklı olabilir.
Stephen

İlk test senaryosunun mantığı ile çıktı olur eppa apas lple s.
Peter Taylor
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.