“Kontrol edilme” sayısını gösteren bir kare program yazın.


22

1'den büyük bazı tam sayı N için, N boyunda geniş N karakterli bir kare metin bloğu düşünün.

Örnek olarak N = 5 olsun ve metin olsun:

MLKJI
NWVUH
OXYTG
PQRSF
ABCDE

Bunun, sol alt köşeden saatin tersi yönünde çevrilmiş alfabesinin (Z dışında) olduğuna dikkat edin. Bir tür halı halı gibi.

Spiral Alfabe

Metni saat yönünde bir çeyrek tur döndürerek "kaydırmak", sonuç FGHIolarak aynı seviyededir ABCDE:

     PONM
     QXWL
     RYVK
     STUJ
ABCDEFGHI

Bu açma, metin tek bir satır olana kadar 7 kez daha yapılabilir:

         SRQP
         TYXO
         UVWN
ABCDEFGHIJKLM

             UTS
             VYR
             WXQ
ABCDEFGHIJKLMNOP

                WVU
                XYT
ABCDEFGHIJKLMNOPQRS

                   XW
                   YV
ABCDEFGHIJKLMNOPQRSTU

                     YX
ABCDEFGHIJKLMNOPQRSTUVW

                       Y
ABCDEFGHIJKLMNOPQRSTUVWX

ABCDEFGHIJKLMNOPQRSTUVWXY

Meydan okuma

Buradaki zorluk, unrolling düzenlerine yeniden düzenlendiğinde ve çalıştırıldığında çeyrek tur çevirerek "kontrol edilme" sayısını gösteren bir NxN metin bloğu olan bir program yazmaktır.

Burada gerçekten iki yarışma var: (umarım çok dağınık olmaz)

  1. Bunu en küçük N ile yapın (N = 3 limitine kadar)
  2. Bunu en büyük N ile yapın (sınırsız)

Kabul edilmiş bir cevap olmayacak, ancak bu kategorilerin her birindeki kazanan benden en az 50 ödül temsilcisi alacak. Bağlar halinde en eski cevaplar kazanır.

Örnek

Kod bloğunuz

MyP
rog
ram

çıktı olması gerektiği gibi çalışıyor.

Koşu

   rM
   oy
ramgP

1 çıkmalı.

Koşu

     or
ramgPyM

2 vermeli.

Koşu

       o
ramgPyMr

çıktı 3 olmalıdır.

Son olarak, koşu ramgPyMro4 çıkmalı.

ayrıntılar

  • Çıktı kendi başına stdout'a (veya en yakın alternatife) basılmalıdır. Giriş yok.
  • Kodunuzda yalnızca yazdırılabilir ASCII (altıgen kodlar 20 ila 7E, boşluk içeren) kullanabilirsiniz.
  • Boşluklar boşluğu düzenleme düzenlemelerinde doldurur. (Sola doğru gitmediğiniz sürece.)
  • Yalnızca tamamen kareden tamamen düz olan düzenlemelerin geçerli çıktıya sahip olmaları gerekir. Başka hiçbir düzenleme yapılmayacak.
  • Kendi kaynağınızı okuyamayabilirsiniz.
  • Yorumlarınızı kullanabilirsiniz.
  • N = 1, pek çok dilde programın 0çalışacağından dışlanır .
  • İstenirse, sağdan ziyade sola gidebilirsiniz. Yani

    MyP
    rog
    ram
    

    olur

    Pg
    yo
    Mrram
    

    ve bunun gibi. Bu şekilde yuvarlanırken fazladan boşluk eklenmez. Satırlar bitiyor

(İlgili: Döndürüldüğü Saatlerin Çıktısını Giren Bir Dikdörtgen Program Yaz )


"Meydan okuma" paragrafını okumadan önce, kendisini kontrolsüz çıkaran bir program yazmak için bir meydan okuma bekliyordum
John Dvorak

1
N neden garip olmak zorunda?
John Dvorak

1
@JanDvorak N'nin tuhaf olmadığına inanıyorum, ancak spiralleri daha standart hale getiriyor. Bu şekilde kalıyor, ancak bir tane bulursanız yorum olarak N = 2 göndermek için çekinmeyin.
Calvin'in Hobileri

8
Sadece bir fikir: “Halının” sağa açılması, Python gibi dilleri ortadan kaldırarak beyaz boşluktan başlayarak birçok çizgi oluşturur. Sola doğru kaydırmaya izin verirseniz, ek boşluk için gerek kalmaz ve Python (teorik olarak) mümkün olur.
Falko

5
Sonsuz harika meydan okuma fikirleri olan sihirli bir kitabınız var mı? Böyle ilginç zorluklarla başka nasıl karşılaşmaya devam ediyorsunuz?
Justin,

Yanıtlar:


27

Golfscript, N <- [5,7 ..]

.   .
 . . 
 ..  
.  .#
],9\-

Tamamen kontrolsüz:

],9\-#  .   .  .  . . ...

Açıklama:

  • . (birden çok kez) - girişi çoğalt
  • ] - yığını tek bir dizide toplamak
  • , - uzunluğunu almak
  • 9\- - 9'dan çıkar
  • # - satır yorumu

Boşluk bir NOP'dir, ancak diğer herhangi bir NOP da aynı şekilde işe yarayabilirdi.

Tamamen sarılmış, girişin dokuz kopyasını (yok sayılan içerik) yığın olarak kullanır; 9 - 9 = 0; kontrol edilmedi.

Her açma, yorumun arkasında bir nokta daha (gizler) gizler, yığını bir kez daraltarak çıktıyı artırır.

Tamamen kontrolsüz, sadece girdi (yok sayılan içerik) yığını olarak kullanır; 9 - 1 = 8; 8 kez açıldı.

Aynı yaklaşım, herhangi bir N> 4 için de geçerlidir: 92 * N + 1 değerine uygun değere değiştirin , ardından her bir kaydırma sırasında tam olarak bir noktanın kaydırılmasını sağlayan aynı spiral deseni kullanarak nokta desenini (yinelenen) genişletin.


Biri N = 3 bulamazsa, bu her iki kategoride de kazanan cevap olacaktır.
Calvin'in Hobileri

3
@ Calvin's Hobbies toplam bir alet olmalı ve soldan açılmayan bir çözüm yollamalı mıyım? :-)
John Dvorak

Neden olmasın. Başka bir cevap pek mümkün görünmüyor: P
Calvin'in Hobileri

1
Neden her iki yöne açılabilen birini seçmiyorsun? :)
Beta Decay

@BetaDecay hmm ... :-)
John Dvorak

13

GolfScript, N = 4

Bu bir sağ, orijinal özellik olarak yuvarlanır.

.. . 
...# 
.#.~
],8-

İşte açmalar:

    ...
    #..
    ..
],8-~#.

       .#.
       ...
],8-~#. ..

          ..
          .#
],8-~#. ....

            ..
],8-~#. ....#.

              .
],8-~#. ....#..

],8-~#. ....#...

Burada dene


Bu düzenleme hakkında ne düşünüyorsunuz?
Gurur haskeller 18:14

3
@proudhaskeller Bilmiyorsanız daha iyi olur ...
Optimizer

8
Bir çözüm için kaba arama yaptınız mı?
Gurur haskeller 18:14

Özel zorluk: .s ve #s lerden birini yapabilir misiniz ?
John Dvorak

İzleri severim ~. Belki N = 3 için çalabilirim?
John Dvorak

9

APL, N = 3

201
340
5|0

unrolled:

   32
   40
5|001

     43
5|00102

       4
5|001023

5|0010234

Çevrimiçi deneyin.

Bu sayının kalanını 5'e bölünerek hesaplar. Sadece son satırın sonucu yazdırılır.

APL, N = 2

⍬∞
≡0

unrolled:

  ⍬
≡0∞

≡0∞⍬

Çevrimiçi deneyin.

bir dizinin derinliğini (boyut veya uzunlukla karıştırılmaması) döndürür:

  • 0bir dizi değil. Yani derinlik 0.
  • 0∞İki öğeli bir dizi 0ve (sonsuz). 1 derinliğine sahiptir.
  • 0∞⍬derinliği 1 olan boş bir dizi olan başka bir öğeye 0∞⍬sahiptir.

Bu iki program aynı zamanda çevrimiçi tercümanda da çalışır. Sonrakinin sözdizimsel olarak doğru olup olmadığından emin değilim.

⍬0
≡∞


⍬¯
≡0

APL, herhangi bir N> = 4 için

N = 4 için:

∞  ∞
 ∞∞
∞ ∞
⍴1↓∞

Tamamen kontrolsüz:

⍴1↓∞  ∞  ∞ ∞ ∞∞∞

N = 5 için:

∞   ∞
 ∞ ∞
 ∞∞
∞  ∞
⍴1↓ ∞

Tamamen kontrolsüz:

⍴1↓ ∞   ∞   ∞  ∞  ∞ ∞ ∞∞∞

1↓dizideki bir öğeyi kaldırır. Argüman skaler ise boş diziyi de döndürür. dizi uzunluğunu alır.


Herhangi bir açıklama var mı?
Gurur haskeller 20:14

@proudhaskeller Düzenlendi.
jimmy23013

Herhangi bir N için aynı derinlik mantığını ideal olarak kullanabilirsiniz. APL sayesinde
Doktor

@Optimizer O kadar kolay değil. Son satırdan önceki şeyler sözdizimsel olarak doğru olmak zorunda. Bu nedenle ()[], bazı istenmeyen yerlerde görünecekleri gibi işlevlerin veya noktalama işaretlerinin çoğunu kullanamıyorum .
jimmy23013

Şöyle demek istedim: `⍬ \ n⍬⍬0 \ n≡ ∞` (Tam olarak değil, ama sen anladın)
Doktoru
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.