Membaca Kode dalam 8 Cara Menghasilkan 8 Angka


21

Bahasa Inggris dan sebagian besar bahasa pemrograman ditulis dan dibaca dari kiri ke kanan, dari atas ke bawah, tetapi tidak harus demikian .

Bahkan untuk blok teks

ABC
DEF

Saya dapat memikirkan delapan cara terkait yang bisa dibaca:

  1. Kiri-ke-kanan, atas-bawah (LTR-TTB): ABCDEF
  2. Atas-ke-bawah, dari kiri ke kanan (TTB-LTR): ADBECF
  3. Kiri-ke-kanan, bawah-ke-atas (LTR-BTT): DEFABC
  4. Bawah-ke-atas, kiri-ke-kanan (BTT-LTR): DAEBFC
  5. RTL-TTB kanan-ke-kiri, atas-ke-bawah: CBAFED
  6. Atas-ke-bawah, kanan-ke-kiri (TTB-RTL): CFBEAD
  7. RTL-BTT kanan-ke-kiri, bawah-ke-atas: FEDCBA
  8. Bawah-ke-atas, kanan-ke-kiri (BTT-RTL): FCEBDA

Tantangan

Tulis blok teks segi empat yang dapat dibaca di masing-masing dari delapan cara di atas sebagai delapan program baris tunggal dalam bahasa pilihan Anda. Masing-masing program harus menghasilkan bilangan bulat yang berbeda dari satu hingga delapan.

Tidak masalah arah bacaan mana yang menghasilkan angka, mereka tidak harus cocok dengan angka di atas. Misalnya, jika blok teks Anda masih

ABC
DEF

maka program ABCDEFkeluaran kekuatan 5dan FEDCBAkeluaran kekuatan 2, dan enam program lain akan output 1, 3, 4, 6, 7, dan 8dalam beberapa urutan.

Blok teks dapat berisi karakter apa pun kecuali terminator baris .

Output harus pergi ke stdout atau alternatif serupa jika bahasa Anda tidak memiliki stdout yang tepat. Tidak ada input. Anda dapat menganggap program dijalankan dalam lingkungan REPL.

Pietu1998 menulis JSFiddle yang memberikan 8 program baris tunggal yang berbeda ketika diberi satu blok teks. Saya telah membuatnya menjadi potongan stack:

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

Anda masih dapat menemukan versi CJam Martin di sini .

Mencetak gol

Skor Anda adalah area blok teks Anda (lebar dikalikan tinggi). Pengajuan dengan skor terendah akan menang. (Intinya kode terkecil menang, maka tag .) Tiebreak pergi ke kiriman yang diposting sebelumnya.

Contohnya adalah 2 oleh 3 sehingga nilainya adalah 6. Skor kurang dari 4 (2 oleh 2) tidak mungkin karena beberapa dari 8 program akan sama dan tidak dapat menghasilkan dua nilai yang berbeda.


6
Mengapa aturan "hanya ascii yang dapat dicetak"? Ini berarti APL tidak dapat bersaing dalam tantangan ini. :(
Moris Zucca

3
Saya membuat biola yang mengubah blok kode ke 8 program. Bisa dimasukkan sebagai cuplikan, ingin pendapat OP tentang ini.
PurkkaKoodari

3
@ MartinBüttner Baiklah, saya memperbaikinya. Sepertinya String.prototype.repeat()masih agak baru. Juga dikonfirmasi untuk bekerja di IE sekarang. biola baru
PurkkaKoodari

@MorisZucca Semua karakter selain terminator garis sekarang diizinkan.
Hobi Calvin

@ Pietu1998 Terima kasih untuk Fiddle, saya telah menambahkannya sebagai cuplikan.
Hobi Calvin

Jawaban:


21

J, 3 * 3 = 9

1[2
+2+
2+2

Menjalankan semua arah:

       ". '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

Penjelasan:

  • Dalam eksekusi J berjalan dari kanan ke kiri dan tidak ada operator diutamakan.
  • The [( left) mengambil sisi kiri dari dua operan sehingga pada dasarnya membatalkan seluruh sisi kanan dari ekspresi kita misalnya 1+2[2+2+2menjadi 1+2[6dan kemudian 1+2.
  • Ekspresi kiri adalah tambahan dengan total 1, 2, 3 dan 4 operan. Ada dua nekspresi masing-masing- operasi satu dengan nomor 1dan satu dengan hanya 2s. Penambahan dengan 1menghasilkan angka ganjil dan yang lainnya menghasilkan yang genap.

5
Ini sangat bagus. Ganti [dengan ;dan itu harus bekerja di lingkungan REPL sebagian besar bahasa.
Pengoptimal

18

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

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

Saya menulis naskah kecil yang menemukan angka yang benar untuk saya. Butuh beberapa saat, tapi hei, saya baru saja mengalahkan GolfScript! : D

Skrip yang saya gunakan ada di sini dan di sini , tetapi saya tidak menyarankan untuk melihatnya karena gaya kode sangat karsinogenik.

Subprogram

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

Versi lama

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

Subprogram

Keluarkan angka masing-masing 1-8.

 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 $ sangat mirip dengan Brainfuck , tetapi memiliki beberapa perintah lagi, termasuk perintah untuk menampilkan nilai sel saat ini sebagai keluaran numerik, yang sangat berguna untuk tantangan ini.

++:+
  ++
++++

Perintah satu baris:

++:+  ++++++   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

Saya berpendapat Anda tidak perlu Brainfuck $; perintah. Saya akan mempertimbangkan menggunakan sederhana. dan menghasilkan 0x01-0x08 sangat valid. Ini Brainfuck, demi (otak). +1.
matega

Saya akan baik-baik saja dengan output biner.
captncraig

7

TECO, 3 * 5 = 15

 +4 5
+2=4 
 +1 \

=mencetak nilai ekspresi numerik terakhir. \digunakan untuk membaca atau menulis angka dari string, tetapi saya hanya menggunakannya sebagai discard di sini.

  • +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

masukkan deskripsi gambar di sini

Karena program satu baris tidak pernah dapat berakhir, anggap ia berakhir setelah output pertama.

8 subprogram dalam satu gambar:

masukkan deskripsi gambar di sini


6

GolfScript, 4x4 = 16

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

Memanfaatkan "komentar super" yang baik: sebuah komentar yang tak tertandingi }mengabaikan sisa kode (pada kenyataannya, dalam hal ini komentar normal #akan bekerja dengan baik, karena semua kode dijalankan sebagai satu baris). Jadi dari setiap sudut hanya ada satu nomor, atau (ke arah lain) angka itu bertambah 1, karena eksekusi berakhir dan isi tumpukan dicetak. 8 program tersebut adalah

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

Menggunakan komentar ( --) untuk menyembunyikan bit mundur dan ke samping. Ini membuatnya sangat lama

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
Tampaknya bagi saya bahwa ini dapat diperluas ke sebagian besar bahasa dengan komentar inline
Sp3000

4

Pendahuluan , 5x3 = 15

12 34
  !  
56 78

Ini mengasumsikan interpreter Python , yang mencetak nilai sebagai angka, bukan kode karakter.

Ini tidak mengalahkan Befunge $, tapi itu mengalahkan pengiriman GolfScript saya, dan saya suka kesederhanaannya. Perhatikan juga bahwa ia hanya menggunakan 9 karakter non-spasi, yang kurang dari pengiriman lainnya sejauh ini (J menyerang lagi :)). Di Prelude, setiap digit didorong ke tumpukan secara individual, dan tergantung pada jalurnya, ada angka yang berbeda tepat sebelum !, yang hanya mencetak elemen tumpukan teratas. 8 program tersebut adalah:

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

Atau, ada juga

 1 3 
1+!+1
 5 7 

Yang mendorong bilangan ganjil di jalur vertikal, dan menambahnya dengan 1di jalur horizontal:

 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

Tidak mengesankan, tetapi tidak ada jawaban CJam dan saya suka tampilannya :)

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

Ini terutama menggunakan fakta yang ];membersihkan tumpukan.

Cobalah online


1

Ruby - 7x7

Juga tidak mengesankan, taktik yang sama dengan jawaban Haskell.

p 1#2 p

3     7
#     #
4     8

p 5#6 p

1

R, 9x9

Tidak ada ruang putih, tidak ada komentar.

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

Saya kira ini bisa diperluas ke ukuran apa pun yang Anda inginkan. Saya pikir operator modulo adalah yang paling fleksibel dari operator yang tersedia, karena mencegah nilai menjadi terlalu besar terlepas dari ukuran data, dan tidak ada efek dari memiliki angka yang sangat besar di antaranya.

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

Bahasa Pemrograman Ini , 5 * 9 = 45

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

Yang diterjemahkan menjadi ini:

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

Sejak ;mengakhiri program, yang di atas diterjemahkan menjadi ini:

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

Penjelasan: angka apa saja dari 0untuk 9mendorong angka yang sesuai ke tumpukan. +muncul dua nilai teratas xdan ydari tumpukan dan mendorong x + yke tumpukan. imenampilkan tumpukan sebagai bilangan bulat.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.