8 Numaralı Çıktıda 8 Yolda Kod Okuma


21

İngilizce ve çoğu programlama dili, soldan sağa, yukarıdan aşağıya doğru yazılır ve okunur, ancak böyle olması gerekmez .

Aslında metin bloğu için

ABC
DEF

Okunabilecek sekiz ilgili yol düşünebilirim:

  1. Soldan sağa, yukarıdan aşağıya (LTR-TTB): ABCDEF
  2. Yukarıdan aşağıya, soldan sağa (TTB-LTR): ADBECF
  3. Soldan sağa, aşağıdan yukarıya (LTR-BTT): DEFABC
  4. Aşağıdan yukarıya, soldan sağa (BTT-LTR): DAEBFC
  5. Sağdan sola, yukarıdan aşağıya (RTL-TTB): CBAFED
  6. Yukarıdan aşağıya, sağdan sola (TTB-RTL): CFBEAD
  7. Sağdan sola, aşağıdan yukarıya (RTL-BTT): FEDCBA
  8. Aşağıdan yukarıya, sağdan sola (BTT-RTL): FCEBDA

Meydan okuma

Seçtiğiniz dilde sekiz tek satırlık program olarak yukarıdaki sekiz yoldan her birinde okunabilen dikdörtgen bir metin bloğu yazın . Bu programların her biri sekizden farklı bir tam sayı çıkarmalıdır.

Hangi okuma yönünün hangi sayıya çıktığı önemli değildir, yukarıdaki sayıların eşleşmesi gerekmez. Örneğin, metin bloğunuz hala

ABC
DEF

Daha sonra program, ABCDEFkudreti çıkışı 5ve FEDCBAkudreti çıkışı 2ve diğer altı programları çıktılayacaktır 1, 3, 4, 6, 7, ve 8bazı sırayla.

Metin bloğu, satır sonlandırıcılar dışında herhangi bir karakter içerebilir .

Dilinizde uygun bir stdout yoksa, çıktı stdout'a veya benzer bir alternatife gitmelidir. Giriş yok. Programların bir REPL ortamında çalıştırıldığını varsayabilirsiniz.

Pietu1998 , bir metin bloğu verildiğinde 8 farklı tek satırlık programı veren bir JSFiddle yazdı . Bir yığın pasajı haline getirdim:

<script>function f(n){n=n.split("\n");var e=n.map(function(n){return n.length}).sort()[n.length-1];n=n.map(function(n){return(n+Array(e+1).join(" ")).substring(0,e)});var t=n[0].split("").map(function(e,t){return n.map(function(n){return n[t]}).join("")});n=[n.join(""),n.reverse().join(""),t.join(""),t.reverse().join("")],n=n.concat(n.map(function(n){return n.split("").reverse().join("")})),document.getElementById("a").innerHTML=n.map(function(n,e){return document.getElementById("b").checked?n+"   "+"LLTTRRBB"[e]+"T"+"RRBBLLTT"[e]+"-"+"TBLRBTRL"[e]+"T"+"BTRLTBLR"[e]:n}).join("\n")}</script><textarea onkeyup="f(this.value)" id="c" placeholder="Code"></textarea><br/><input type="checkbox" id="b" onchange="f(document.getElementById('c').value)" checked/>&nbsp;<label for="b">Show directions</label><br/><pre id="a"></pre>

Martin'in CJam sürümünü hala burada bulabilirsiniz .

puanlama

Puanınız, metin bloğunuzun alanıdır (genişlik, yüksekliktir). En düşük puanla yapılan gönderim kazanır. (Temel olarak en küçük kod kazanır, bu nedenle etiketi.) Tiebreaker daha önce gönderilen gönderilere gider.

Örnek 2'ye 3'tür, bu nedenle skoru 6'dır. 4'ten küçük bir skor (2'ye 2) imkansızdır, çünkü o zaman 8 programdan bazıları aynı olacaktır ve iki farklı değer verememiştir.


6
Neden "sadece basılabilir ascii" kuralı? APL'nin bu mücadelede rekabet edemeyeceği anlamına geliyor. :(
Moris Zucca

3
Bir kod bloğunu 8 programa dönüştüren bir keman yaptım . Bir snippet olarak dahil edilebilir, OP'nin bu konuda görüşünü almak ister.
PurkkaKoodari

3
@ MartinBüttner Pekala, tamir ettim. Görünüşe String.prototype.repeat()göre hala yeni. Ayrıca şimdi IE’de çalıştığını doğruladı. yeni keman
PurkkaKoodari 21:15

@MorisZucca Satır sonlandırıcılar dışındaki tüm karakterlere artık izin verilir.
Calvin'in Hobileri

@ Pietu1998 Fiddle için teşekkürler, pasaj olarak ekledim.
Calvin'in Hobileri

Yanıtlar:


21

J, 3 * 3 = 9

1[2
+2+
2+2

Tüm yönleri yerine getirmek:

       ". '1[2+2+2+2','2+2+2+1[2','1+2[2+2+2','2+2[2+1+2','2+2+2+2[1','2[1+2+2+2','2+2+2[2+1',:'2+1+2[2+2'
1 7 3 4 8 2 6 5

Açıklama:

  • J'de yürütme sağdan sola gider ve operatör önceliği yoktur.
  • [( leftAslında bizim ifadesi örneğin bütün sağ taraf iptal böylece) iki işlenen sol tarafını alır 1+2[2+2+2hale 1+2[6ardından ve 1+2.
  • Sol ifadeler, toplam 1, 2, 3 ve 4 operand içeren eklemelerdir. Her bir nişlemden iki tanesi 1ve biri sadece biri de diğeriyle olan ifadeler 2. 1İle yapılan eklemeler tek sayıları ve diğerleri çiftleri oluşturur.

5
Bu gerçekten güzel. Değiştir [ile ;ve en dilde REPL ortamda çalışmalıdır.
Doktor,

18

Befunge-98 ,5x5 = 25 5x3 = 15

1+4+2
$.@.$
3+4+4

Benim için doğru sayıları bulan küçük bir senaryo yazdım. Biraz zaman aldı, ama hey, GolfScript'i yendim! : D

Kullandığım komut dosyaları burada ve burada , ancak kod stili aşırı derecede kanserojen olduğundan, onlara bakmayı önermiyorum.

Alt programlar

1+4+2$.@.$3+4+4   LTR-TTB   5
3+4+4$.@.$1+4+2   LTR-BTT   7
1$3+.+4@4+.+2$4   TTB-LTR   3
2$4+.+4@4+.+1$3   TTB-RTL   4
4+4+3$.@.$2+4+1   RTL-BTT   8
2+4+1$.@.$4+4+3   RTL-TTB   6
4$2+.+4@4+.+3$1   BTT-RTL   2
3$1+.+4@4+.+4$2   BTT-LTR   1

Eski versiyon

 1.6
3 @ 4
.@ @.
8 @ 7
 2.5

Alt programlar

Sırasıyla 1-8 arasında sayıları girin.

 1.6 3 @ 4.@ @.8 @ 7 2.5    LTR-TTB
 2.5 8 @ 7.@ @.3 @ 4 1.6    LTR-BTT
 3.8 1 @ 2.@ @.6 @ 5 4.7    TTB-LTR
 4.7 6 @ 5.@ @.1 @ 2 3.8    TTB-RTL
 5.2 7 @ 8.@ @.4 @ 3 6.1    RTL-BTT
 6.1 4 @ 3.@ @.7 @ 8 5.2    RTL-TTB
 7.4 5 @ 6.@ @.2 @ 1 8.3    BTT-RTL
 8.3 2 @ 1.@ @.5 @ 6 7.4    BTT-LTR

14

Brainfuck $ , 4x3 = 12

Brainfuck $ çok benzer brainfuck , ancak bu meydan okuma için çok faydalı oldu sayısal çıktı olarak geçerli hücre değerine, çıkışa bir komutunu dahil olmak üzere bazı daha komutları vardır.

++:+
  ++
++++

Tek satırlı komutlar:

++:+  ++++++   LTR-TTB, outputs 2
++++  ++++:+   LTR-BTT, outputs 8
+ ++ +:+++++   TTB-LTR, outputs 4
+++:+++ ++ +   TTB-RTL, outputs 3
++++++  +:++   RTL-BTT, outputs 7
+:++++  ++++   RTL-TTB, outputs 1
+++++:+ ++ +   BTT-RTL, outputs 5
+ ++ +++:+++   BTT-LTR, outputs 6

Brainfuck $ 'a ihtiyacın olmadığını iddia ediyorum; Komut. Basitçe kullanmayı düşünürdüm. ve 0x01-0x08 çıktı mükemmel geçerlidir. Brainfuck, beynin iyiliği için. +1.
matega

İkili çıktıyla iyi olurum.
captncraig

7

TECO, 3 * 5 = 15

 +4 5
+2=4 
 +1 \

=son sayısal ifadenin değerini yazdırır. \dizelerden sayıları okumak veya yazmak için kullanılır, ancak onu sadece bir atma olarak kullanırım.

  • +4 5+2=4 +1 \ 7
  • + +2+4=1 4 5 \ 6
  • + +2+1=4 4 \ 5 3
  • +1 \+2=4 +4 5 2
  • \ 1+ 4=2+5 4+ 5
  • \ 5 4 1=4+2+ + 1
  • 5 \ 4 4=1+2+ + 4
  • 5 4+ 4=2+\ 1+ 8

7

piet - 12x12 = 144

görüntü tanımını buraya girin

Tek satırlık bir program hiçbir zaman sonlanamadığından, ilk çıktının ardından sona erdiğini varsayalım.

Tek bir görüntüde 8 alt program:

görüntü tanımını buraya girin


6

GolfScript, 4x4 = 16

1})7
)  }
}  )
3)}5

Eski güzel "süper yorumu" kullanır: Eşsiz bir }kodun geri kalanını yok sayar (aslında, bu durumda, normal bir yorum #da tüm kod tek bir satır olarak çalıştırıldığından işe yarayabilirdi). Böylece, her köşeden sadece bir sayı veya (diğer yönde) bu sayı 1 ile artar, çünkü uygulama sonlandırılır ve yığın içeriği yazdırılır. 8 program

1})7)  }}  )3)}5  # LTR-TTB
1)}3}  ))  }7})5  # TTB-LTR
3})1)  }}  )5)}7  # BTT-LTR
3)}5}  ))  }1})7  # LTR-BTT
5})3)  }}  )7)}1  # RTL-BTT
5)}7}  ))  }3})1  # BTT-RTL
7})5)  }}  )1)}3  # TTB-RTL
7)}1}  ))  }5})3  # RTL-BTT

5

Haskell, 26x26 = 676

--Geriye ve yana doğru olan bitleri gizlemek için comment ( ) kullanır . Bu çok uzun sürüyor

main=print 1--2 tnirp=niam
a                        a
i                        i
n                        n
=                        =
p                        p
r                        r
i                        i
n                        n
t                        t

3                        4
-                        -
-                        -
5                        6

t                        t
n                        n
i                        i
r                        r
p                        p
=                        =
n                        n
i                        i
a                        a
main=print 7--8 tnirp=niam

2
Bana öyle geliyor ki bunun çoğu inline yorumu ile dile getirilebileceğini düşünüyorum
Sp3000

4

Başlangıç , 5x3 = 15

12 34
  !  
56 78

Bu , değerleri karakter kodları yerine sayılar olarak basan Python yorumlayıcısını varsayar .

Bu Befunge $ 'ı geçmiyor, ama GolfScript gönderimi yeniyor ve sadeliği seviyorum. Ayrıca, şu ana kadar 9 diğer karakterden daha az olan 9 boşluksuz karakter kullandığını unutmayın (J tekrar grev yapar :)). Prelude'da, her bir hane tek tek istifin üzerine itilir ve yola bağlı olarak, hemen önce !üst yığın öğesini basan farklı bir hane vardır . 8 program:

12 34  !  56 78   LTR-TTB   4
56 78  !  12 34   LTR-BTT   8
1 52 6 ! 3 74 8   TTB-LTR   6
4 83 7 ! 2 61 5   TTB-RTL   7
87 65  !  43 21   RTL-BTT   5
43 21  !  87 65   RTL-TTB   1
8 47 3 ! 6 25 1   BTT-RTL   3
5 16 2 ! 7 38 4   BTT-LTR   2

Alternatif olarak, orada da var

 1 3 
1+!+1
 5 7 

Tek sayıları dikey yollarda iter ve bunları 1yatay yollarda artırır :

 1 3 1+!+1 5 7    LTR-TTB   4
 5 7 1+!+1 1 3    LTR-BTT   8
 1 1+5 ! 3+7 1    TTB-LTR   5
 1 3+7 ! 1+5 1    TTB-RTL   7
 7 5 1+!+1 3 1    RTL-BTT   6
 3 1 1+!+1 7 5    RTL-TTB   2
 1 7+3 ! 5+1 1    BTT-RTL   3
 1 5+1 ! 7+3 1    BTT-LTR   1

2

CJam - 7 × 7

Etkileyici değil, ancak CJam cevabı yoktu ve görünüşünü beğeniyorum :)

 8;];1 
7     2
;  0  ;
] 0 0 ]
;  0  ;
6     3
 5;];4 

Temel olarak ];yığını temizleyen gerçeğini kullanır .

Çevrimiçi deneyin


1

Yakut - 7x7

Etkileyici değil, Haskell'in cevabıyla aynı taktik.

p 1#2 p

3     7
#     #
4     8

p 5#6 p

1

R, 9x9

Boş yer yok, yorum yok.

75%%99299
99%%99699
%%299%%41
%%699%%06
995999997
11%%999%%
99%%799%%
39719%%99
59519%%16

Sanırım bu istediğiniz boyutta genişletilebilir. Modulo operatörünün mevcut operatörlerin en esnek olduğunu düşündüm, çünkü değerlerin veri boyutuna bakılmaksızın çok büyük olmasını önlüyordu ve aralarında çok büyük sayıların bulunmasının bir etkisi yoktu.

75%%9929999%%99699%%299%%41%%699%%0699599999711%%999%%99%%799%%39719%%9959519%%16   LTR-TTB  2
59519%%1639719%%9999%%799%%11%%999%%995999997%%699%%06%%299%%4199%%9969975%%99299   LTR-BTT  3
79%%9193559%%91999%%265%%75%%999%%1199999979999%%999%%26%%999%%99409%%9199167%%96   TTB-LTR  4
99167%%9699409%%9126%%999%%99%%999%%999999799%%999%%11%%265%%7559%%9199979%%91935   TTB-RTL  1
61%%9159599%%91793%%997%%99%%999%%1179999959960%%996%%14%%992%%99699%%9999299%%57   RTL-BTT  5
99299%%5799699%%9914%%992%%60%%996%%799999599%%999%%11%%997%%9999%%9179361%%91595   RTL-TTB  6
69%%7619919%%90499%%999%%62%%999%%9999799999911%%999%%57%%562%%99919%%9553919%%97   BTT-RTL  7
53919%%9799919%%9557%%562%%11%%999%%997999999%%999%%99%%999%%6219%%9049969%%76199   BTT-LTR  8

1

Bu Programlama Dili, 5 * 9 = 45

1i;i2
2   2
+   +
i   i
;   ;
i   i
+   +
2   2
5i;i6

Bu çeviren:

1i;i22   2+   +i   i;   ;i   i+   +2   25i;i6
5i;i62   2+   +i   i;   ;i   i+   +2   21i;i2
12+i;i+25i       i;       ;i       i22+i;i+26
22+i;i+26i       i;       ;i       i12+i;i+25
6i;i52   2+   +i   i;   ;i   i+   +2   22i;i1
2i;i12   2+   +i   i;   ;i   i+   +2   26i;i5
62+i;i+22i       i;       ;i       i52+i;i+21
52+i;i+21i       i;       ;i       i62+i;i+22

Yana ;programı bu yukarıdaki çevirir sonlandırır:

1i;   - outputs 1
5i;   - outputs 5
12+i; - outputs 3
22+i; - outputs 4
6i;   - outputs 6
2i;   - outputs 2
62+i; - outputs 8
52+i; - outputs 7

Açıklama: den herhangi bir sayı 0için 9yığın üzerine gelen rakam iter. +En üstteki iki değeri xve yistifin x + yüzerinden çıkar ve istifin üzerine doğru iter . iyığını bir tamsayı olarak çıkarır.

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.