Alice'in sıra formatı


9

Giriş

Alice , Martin Ender'in kardinal ve ordinal olmak üzere iki farklı yürütme moduna sahip 2-d dilidir . Kullanıcı işaretçi geçtiğinde yoluyla (bir ayna /ya da \), diğer bir moddan diğerine geçer.

Bu meydan okumada , komutların dizelerde çalıştığı ve komut işaretçisinin kodun kenarlarına zıplayarak çapraz olarak hareket ettiği sıralı moda odaklanacağız .

Yalnızca sıralı modda çalışan basit programlar, aşağıdaki örnekte olduğu gibi oldukça kompakt bir tarzda yazılabilir:

/fbd/
@aec\

İşte IP ilk hücre doğu gitmekten kardinal modunda başlar ilk aynanın içinden geçer ve çapraz hareket ve zıplayan, komutları yürütmeye başlar a, bve c. Daha sonra diğer aynaya doğru güneye gidip, batıya doğru geri sıçrayan komutları karşılaşma başlamak yapar kuzey doğu ayna karşılaştığında d, e, fve son olarak @, programı sonlandırır hangi.

Bu tür bir yapı oldukça kompakttır, ancak yazması ve bakımı kolay değildir (tek bir komut eklemek bizi kodun çoğunu yeniden sıralamaya zorlayabilir!), Bu yüzden biçimlendirme konusunda bana yardımcı olmanızı istiyorum.

Görev

Her komutun tek bir yazdırılabilir ASCII karakteri olduğu bir komut dizisi verildiğinde, dizinin ilk yarısının ikinci satırın ilk karakterinden başlayıp her zaman çapraz olarak sağa doğru hareket edebilmesi için bunları iki satırda yeniden sıralayın, ikinci yarı ise kalan karakterleri sağdan sola alarak okunabilir. Aynalar ve sonlandırma sembolü hakkında endişelenme, kendim ekleyeceğim.

Yani, örneğin, giriş verilen abcdefçıkış gerektiğini

fbd
aec

Girişin tek uzunlukta olması durumunda, karşılaşılan komutların dizisi aynı kaldığı sürece, herhangi bir yere tek bir boşluk (Alice'de bir noop) eklemelisiniz. Ayrıca, uzunluğu bir karakter farklı olan iki satırın çıktısını almayı da seçebilirsiniz, bu durumda daha kısa olanın sonunda tek bir boşluk olduğu düşünülür.

kurallar

Bu , en kısa cevap bayt cinsinden kazanır!

  • Varsayılan giriş / çıkış yöntemlerinden herhangi biriyle giriş / çıkış yapabilirsiniz
  • Giriş, yazdırılabilir ASCII karakterlerinden oluşan tek bir satırdan oluşur
  • Çıktıda tek bir sondaki yeni satıra izin verilir
  • Alice programları olarak çalıştırıldığında programınızın bazı çıktıları tamamen doğru bir davranış göstermeyebilir (örn. Dolgu alanı bir dize değişmezinin içine eklenmişse). Bu durumlarla ilgilenmenize gerek yok
  • Standart boşluklar yasaktır

Test senaryoları

--Input
abcdef
--Output
fbd
aec

--Input
123
--Output
 2
13
OR
31
 2
OR
3
12
OR
32
1

--Input
O
--Output
O

OR

O

--Input
"Hello, World!"o
--Output
oH!lloo 
""edlr,W

--Input
i.szR.szno
--Output
o.zz.
inssR

--Input
"  ^^} .~[}.~~[}{~~{}[^^^^.""!}"r.h~;a*y'~i.*So
--Output
o *^i}'.*[;.h~r}}~"{.[^
"S .^~ y~a}~~.["{!~"}^^^
(Odd length, your solution may be different)

Yanıtlar:


1

Jöle , 15 bayt

œs2U2¦ṚZUJḤ$¦ZY

Çevrimiçi deneyin!

Alıntılanan girişi alır.

Açıklama:

œs2U2¦ṚZUJḤ$¦ZY Main link, monadic
œs2             Split into 2 chunks of similar lengths, last might be shorter
   U2¦          Reverse the 2nd chunk
      Ṛ         Swap the chunks
       Z        Transpose into chunks of length 2
        UJḤ$¦   Reverse the chunks at even indices (1-indexed)
             Z  Transpose into 2 chunks again
              Y Join by a newline

12

Alice , 28 bayt

/mY. zm~wZ.k;
\I;'!*?RR.OY@/

Çevrimiçi deneyin!

Giriş uzunluğu tuhafsa, dolgu alanını doğrusallaştırılmış programın sonuna koyar ve bu da çıktının ilk karakteri olur.

Leo birkaç gün önce Alice'te bir Ordinal formatlayıcı yazdı . Tek uzunluktaki girişler için destek ekledikten ve bu zorluk için gerekli olmayan bazı şeyleri kaldırdıktan sonra 28 bayta ulaştık . Biraz farklı bir yaklaşım denemek istedim, bu da bu cevap. Ne yazık ki, sadece 28 bayt bağladı, ama en azından bu şekilde kendi çözümümü gönderebilir ve Leo'nun orijinal algoritmasını yayınlamasına izin verebilirim.

Bu, Leo'nun bir ipi ikiye bölmek için gerçekten akıllıca bir fikir kullanır ..Y;m;.!z?~.

açıklama

Girdinin eşit uzunluğa sahip olduğunu varsayalım (çünkü eğer girmezse boşlukla doldururuz). 0123456789Kod olarak kullanıp kullanmadığımızı görmek biraz daha kolaydır . Gerekli çıktı:

91735
08264

Böylece ilk satır girişin tüm tek konumlarını ve ikinci satır tüm çift girişleri içerir. Ayrıca, garip pozisyonları tersine çevirirsek, çizgilerin kendisi hem ilk yarının (muhtemelen daha uzun) ikinci yarının tersi ile serpiştirilir.

Yani temel fikir:

  • Tek ve çift konumlara ayrı giriş.
  • Gerekirse garip konumları bir boşlukla doldurun.
  • Tek pozisyonları ters çevirin.
  • Sonra iki kez: geçerli dizeyi ikiye bölün, ikinci yarıyı tersine çevirin, her iki yarıyı da serpiştirin, sondaki satır besleme ile yazdırın.

Kod gelince, bu meydan okumada ürettiğimiz düzen türüne çok benziyor, ancak ince bir şekilde farklı: IP /, kodun sonuna geldiğinde güneye değil doğuya yansıtılıyor . Daha sonra, Kardinal moddayken, IP ilk sütuna sarılacaktır. \Orada yeniden girer Sıra modunu, yani kodun ikinci yarısında sağdan gitmez burada bıraktı, ama sağ yanı kalmadı. İade adresi yığını ile çalışırken faydalıdır, çünkü IP'nin yönü hakkında bilgi depolamaz. Bu, birkaç bayt tasarruf etmemizi sağlar, çünkü IP her ikisinde de aynı (yatay) yönde hareket eder wve k.

Doğrusallaştırılmış kod şudur:

IY' *mRw..Y;m;.!z?~RZOk@

Hadi bunun üzerinden geçelim:

I       Read one line of input.
Y       Unzip. Separates the string into even and odd positions.
' *     Append a space to the odd half.
m       Truncate: discards characters from the longer of the two
        strings until they're the same length. So if the input
        length was even, appending a space will make the odd half
        longer and this discards the space again. Otherwise, the
        space just padded the odd half to the same length as the
        even half and this does nothing.
R       Reverse the odd half.
w       Push the current IP address to the return address stack.
        The purpose of this is to run the following section
        exactly twice.

          This first part splits the current line in half, based
          on an idea of Leo's:
  ..        Make two copies of the current half.
  Y         Unzip one of the copies. The actual strings are irrelevant
            but the important part is that the first string's length
            will be exactly half the original string's length (rounded up).
  ;         Discard the potentially shorter half.
  m         Truncate on the original string and its even half. This shortens
            the original string to the first half of its characters.
  ;         Discard the even half, because we only needed its length.
  .!        Store a copy of the first half on the tape.
  z         Drop. Use the first half to discard it from the original string.
            This gives us the the second (potentially shorter half).
  ?         Retrieve the first half from the tape.
  ~         Swap it so that the second half is on top.
          The string has now been split in half.
  R       Reverse the second half.
  Z       Zip. Interleave the two halves.
  O       Print the result with a trailing linefeed.

k       Pop an address from the return address stack and jump back there.
        The second time we reach this, the return address stack is empty,
        and this does nothing.
@       Terminate the program.

1
Bu yeni düzen için yeni bir meydan okuma göndermem gerekecek! : D Çok hoş, dönüş yığınını kullanmasam bile kullanmaya başlayacağımı düşünüyorum, kodun her iki yarısını da soldan sağa okumak daha kolay
Leo

4

Jöle , 23 22 bayt

Leo sayesinde -1 bayt (sol alt dolgu olabilir)

LḂ⁶ẋ;µṚ,µm2œs2U0¦ż/µ€Y

Sonucu yazdıran tam bir program (monadic link karakter listelerinin listesini döndürür).

Çevrimiçi deneyin! veya bir test takımına bakın .

Nasıl?

LḂ⁶ẋ;µṚ,µm2œs2U0¦ż/µ€Y - Main link: list of characters
L                      - length
 Ḃ                     - modulo 2
  ⁶                    - literal space character
   ẋ                   - repeat
    ;@                 - concatenate (swap @rguments) (appends a space if the input's length is odd)
      µ                - monadic chain separation, call that s
       Ṛ               - reverse s
        ,              - pair with s
         µ         µ€  - for €ach:
          m2           -   modulo 2 slice (take every other character)
            œs2        -   split into two "equal" chunks (first half longer if odd)
               U0¦     -   upend index 0 (reverse the second chunk)
                   /   -   reduce by:
                  ż    -     zip
                     Y - join with newlines (well just the one in this case)
                       - implicit print (mushes the sublists together)

1

JavaScript (ES6), 104 bayt

f=
s=>s.replace(/./g,(c,i)=>a[1&~i][i+i>l?l-i:i]=c,a=[[` `],[]],l=s.length-1|1)&&a.map(a=>a.join``).join`
`
<input oninput=o.textContent=f(this.value)><pre id=o>

Yürütme yolunu taklit ederek ve komutları giderken çalışır.


Güzel bir fikir gibi görünüyor, ama kullandığınız algoritmayı anlamak için javascript hakkında yeterince bilgim yok ... Biraz açıklama ekleyebilir misiniz?
Leo

@Leo Ne kadar açıklayabileceğimi bilmiyorum. Bildiğiniz gibi, komutlar soldan sağa ve tekrar soldan bir zig-zag çizgisi izler. 1&~iİse, dikey zikzaklı elde i+i>l?l-i:iyarım ayna elde edilir. Tüm komutlar istenen yürütme konumlarına girildikten sonra dizi daha sonra istenen sonucu elde etmek için toplanır.
Neil
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.