Figur dan Tanah


32

angka dan dasar
Sumber: Wikipedia

Untuk tantangan ini, Anda harus menulis dua program yang menyerupai gambar dan dasar dari gambar di atas, sehingga salah satunya mencetak figuredan mencetak lainnya ground. Secara khusus:

  1. Tulis program yang tidak mengambil input dan mencetak string figure. Satu-satunya karakter spasi putih yang diperbolehkan dalam program Anda adalah spasi (titik kode 0x20) dan baris baru (carriage return, 0x0D, linefeeds, 0x0A, atau kombinasi keduanya).
  2. Mengabaikan baris baru, jumlah karakter spasi (titik kode 0x20) dan karakter non-spasi harus sama. Misalnya, ini akan menjadi program yang valid (dalam bahasa hipotetis):

    ab c 
       d
    e f
    

    Perhatikan bahwa ada spasi tambahan di baris pertama.

  3. Jika Anda menukar n th karakter spasi dengan n th karakter non-spasi, program harus mencetak groundgantinya. Untuk contoh di atas program akan terlihat seperti ini:

      a b
    cde 
     f 
    

    Perhatikan bahwa ada spasi tambahan di baris kedua dan ketiga.

Baik figur maupun solusi dasar harus berupa program lengkap dalam bahasa yang sama yang mencetak ke STDOUT. Anda dapat mencetak satu baris trailing opsional tunggal dalam kedua kasus. Anda dapat menampilkan apa pun yang Anda inginkan ke STDERR, selama STDOUT benar.

Anda dapat menggunakan bahasa pemrograman apa pun , tetapi perhatikan bahwa celah ini dilarang secara default.

Ini adalah , sehingga jawaban terpendek yang valid - diukur dalam byte - menang.

Skrip Helper

Anda dapat menggunakan skrip CJam ini untuk mengonversi antara program figur dan ground . Cukup tempel salah satu dari keduanya ke dalam kolom Input dan jalankan program. Ini juga akan memberi tahu Anda jika ada jumlah spasi dan non-spasi tidak cocok.

Papan peringkat

Jawaban:


20

Jelly , 20 byte

Angka

“¦ĠȮ“©ụd» Ṃ         

Sembilan spasi tambahan. Cobalah online!

Tanah

         “ ¦ĠȮ“©ụd»Ṃ

Tidak ada spasi tambahan. Cobalah online!

Bagaimana itu bekerja

Pertama, perhatikan bahwa spasi bukan atom, jadi karakter spasi di luar string literal tidak memengaruhi program dengan cara apa pun.

Literal string menggunakan kompresi string berbasis kamus bawaan Jelly untuk menghasilkan kata-kata yang diinginkan. Literal string terkompresi dimulai dengan , diakhiri dengan », dan digunakan secara internal untuk membuat array string.

Dalam program gambar , “¦ĠȮ“©ụd»menghasilkan pasangan string ("gambar", "tanah") , dan atom memilih minimum leksikografis, yaitu, "angka" .

Dalam program ground, gantinya “ ¦ĠȮ“©ụd»pasangan string ("logicallyAbacs", "ground") sebagai gantinya. Minimum lexicographical sekarang "ground" , yang memilih dengan patuh.

Dalam kedua kasus, juru bahasa secara otomatis mencetak nilai pengembalian terakhir - yaitu, minimum yang dipilih - ke STDOUT.


14

Python 2, 53 byte

Ganti ·dengan spasi di kedua jawaban:

····················
print'······figureground'[6:12]#

Cetakan figure.

print'figureground'[
······6:12]#····················

Cetakan ground.


14

05AB1E , 15 14 byte

Angka

 'ŠÂ,'í¶      

Cobalah online!

Tanah

'       ŠÂ,'í¶

Cobalah online!

Menggunakan pengkodean CP-1252 . Perhatikan spasi tambahan. Dalam program Figure , ini adalah program normal tanpa kesalahan. Itu mendekompres kata-kata berikut:

'ŠÂ  ->  figure
'í¶  ->  ground

Koma mencetak muncul dan mencetak figurekata dengan baris baru. Karena sesuatu telah dicetak, bagian atas tumpukan tidak dicetak lagi.

Dalam program Ground , ada beberapa kesalahan yang sesuai untuk kasus ini. Bagian berikut:

'<space>

mendorong karakter spasi di atas tumpukan. The Šberputar stack, yang memiliki arity 3 . Hanya ada satu elemen pada stack dan tidak ada input, jadi ini memberikan pengecualian, membersihkan stack. The Âbifurkasio bagian atas tumpukan, tapi ini memiliki cerita yang sama sebagai operator rotate. Jadi pada dasarnya ,perintah tidak mencetak apa pun.

Itu berarti bahwa program masih akan menampilkan bagian atas tumpukan yang ada 'í¶. Menghasilkan ground.


9

Retina , 31 byte

Angka:

|       
angka
 | tanah
      

Tanah:

 | gambar

|       
tanah

Figur dan Tanah . Kedua program mensyaratkan bahwa STDIN dibiarkan kosong untuk menjadi figur atau program dasar yang valid.


9

Pyth, 30 byte

Angka

"figure" "ground              

14 spasi tambahan.

Uji

Tanah

Tidak ada spasi tambahan

        "       figure""ground

Uji

Bagaimana itu bekerja

Agak membantu, ruang menekan pencetakan dalam Pyth, sementara string literal tanpa penutup "secara implisit ditutup.

Oleh karena itu program pertama terdiri dari dua string, "figure"dan "ground ". String pertama dicetak secara implisit, dan pencetakan yang kedua ditekan, artinya hanya figuredicetak.

Program kedua terdiri dari dua string, " figure"dan "ground". Pencetakan yang pertama ditekan, dan yang kedua dicetak secara implisit, artinya hanya grounddicetak.


6

MATL , 37 byte

Program pertama

'figure'         
%x'ground'         

Setiap baris memiliki 9 spasi tambahan.

Cobalah online!

Program kedua

    'figure'%
      x'ground'

Tidak ada ruang traling di sini.

Cobalah online!

Penjelasan

Tidak ada yang sangat mewah ...

  • Ruang dan baris baru di antara pernyataan diabaikan oleh MATL.
  • % adalah simbol komentar, yang mengabaikan sisa baris.
  • x menghapus bagian atas tumpukan.
  • Tumpukan dicetak secara implisit di akhir program.

6

Java, 180 byte

Ganti .dengan ruang.

Mencetak "gambar":

class
A{public
static
void
main(String[]a){System.out.println(
//"ground"
//
.....
........
......
....
...................................
..
........
..........
....
"figure");}}

Cetakan "tanah":

.....
........
......
....
...................................
..........
..
class
A{public
static
void
main(String[]a){System.out.println(
//
"ground"
//"figure"
);}}
............

5

Befunge, 54 byte

Figur ( Coba online! )

#v "erugif" v>
      : #, _ @>         
"dnuorg"

Sepuluh spasi tambahan di baris kedua.

Ground ( Coba online! )

  # v "erugif" v 
>: #, _ @> "dnuorg"
        

Satu spasi tambahan di baris pertama dan delapan spasi di baris ketiga.


4

Mathematica, 50 34 byte

Menggunakan lingkungan REPL. (Menambahkan Print[]pembungkus dengan jumlah spasi yang sama akan meningkatkan jumlah byte sebesar 14.) Kedua program tersebut

01figure+0 1ground                

(dengan 16 spasi tambahan) dan

          0       1figure+01ground

Kuncinya di sini adalah bahwa Mathematica memperlakukan digit concatentation tanpa spasi sebagai angka tunggal, tetapi ruang intervening ditafsirkan sebagai perkalian yang bertetangga, seperti gabungan angka dan nama variabel yang berubah-ubah. Jadi ekspresi pertama dievaluasi 1*figure+0*1*ground, yaitu figure; ekspresi kedua dievaluasi menjadi 0*1*figure+1*ground, yaitu ground.


4

PHP, 44 42 byte

gambar: (16 spasi tambahan, 5 spasi antara gambar &;)

echo''?ground:figure     ;                 

tanah: (20 ruang utama)

                     echo' '?ground:figure;

Cukup sederhana sebenarnya, bekerja karena ''itu palsu dan jujur ' '. Gunakan seperti:

php -r "echo''?ground:figure     ;                "
php -r "                    echo' '?ground:figure;"

sunting: 2 byte yang jelas secara retrospektif disimpan berkat Martin Ender


3

Haskell, 96 94 88 82 77 byte

Program pertama, mencetak "figure":

main              =          putStr$idid"ground"
idid    _          ="figure"

Program kedua, mencetak "ground":

    main=putStr$id id"ground"                   
    idid _="figure"         

Memanggil salah satu dari dua fungsi konstan dengan nama berbeda


3

Haskell, 88 65 byte

main=putStr
...........--
.."figure"..........
--"ground"........

dan

...........
main=putStr..
--........"figure"--
.........."ground"

.menunjukkan spasi. Hanya beberapa baris komentar (-> --) juggling.


3

Python 2, 52 byte

........................
print"figure"
an
d
"ground"

.s menunjukkan spasi. Tiga baris terakhir dibagi menjadi kesalahan tanpa memiliki SyntaxErroryang akan mencegah kode berjalan di tempat pertama.

Versi dasar hanya digunakan anduntuk membuat string kedua dicetak.


Upaya alternatif (lebih lama):

.......
print(#"ground")#
"figure")...................


print"figure"""and"ground"
.............
.............

3

JavaScript (ES6), 56 byte

alert('figure'
                //&&'ground'
           )
              
alert('figure'//            
&&'ground') 

Sosok itu tidak memiliki spasi tambahan.


Saya menghitung 56 byte untuk setiap program, kecuali baris baru tidak masuk hitungan. Saya ragu itu akan menjadi lebih pendek.
ETHproductions

@ ETHproductions Ugh, itulah yang terjadi ketika Anda menghitung byte secara manual :-(
Neil

2

Rel , 56 byte

Angka

$'main'
 -[figure]o                
-          [ground]o

Ada 16 spasi tambahan di baris kedua. Program berakhir dengan kesalahan.

Cobalah online!

Tanah

       
$ 'main' - [gambar] o
 - [tanah] o         

Ada 7 spasi di baris pertama dan 9 spasi di baris terakhir. Program ini juga berakhir dengan kesalahan.

Cobalah online!

Penjelasan

Rail mencari garis yang dimulai dengan (notasi regex) \$.*'main'untuk menemukan titik masuk. Kereta (penunjuk instruksi) kemudian mulai dari $arah tenggara. Hal-hal yang tidak dapat dijangkau oleh kereta dapat diabaikan sepenuhnya untuk program ini. Ini termasuk apa pun pada baris yang sama dengan titik masuk. Karena, -tenggara dari $segera belok ke timur kereta, kedua program hanya mengurangi menjadi:

 -[figure]o
 -[ground]o

[...]menunjukkan string literal dan omencetaknya. Biasanya, Anda perlu #mengakhiri rel, tetapi jika Anda mengabaikannya, program akan berakhir (tetapi mengeluh pada STDERR bahwa kereta itu mogok).


2

> <> , 39 byte

Menggunakan ·untuk mewakili spasi.

Angka

v·
"·dnuo
e·
r·
u·
g··
i··
f···
"·
>·o·

Cobalah online!

Tanah

·v
·"····
·d
·n
·u
·oe
·ru
·gif
·"
·>·o

Cobalah online!

Kedua program berakhir dengan kesalahan.

Penjelasan

Dengan menulis kode secara vertikal, saya dapat menggunakan kembali gdan di rantara kedua solusi, serta kutipan dan >dan ountuk loop keluaran.

Dalam kedua kasus, satu-satunya bit yang dieksekusi adalah kolom di bawah v, yang mendorong huruf-huruf kata yang diperlukan ke tumpukan dalam urutan terbalik. Kemudian >arahkan kembali pointer instruksi ke kanan, di mana loop melewati o, mencetak karakter sampai tumpukan kosong.


Saya baru saja mulai mengerjakan versi>> saya sendiri, lalu saya menemukan milik Anda. Saya sangat suka ide Anda bekerja secara vertikal (milik saya sangat 'normal').
Teal pelican

@Tealpelican Saya tidak datang dengan ini sampai mengerjakan jawaban Fission. Sebelum itu solusi>>> terbaik saya adalah 42 byte: !__|"druong">o<"figure"(di mana _spasi, dan spasi yang tersisa cukup di akhir baris).
Martin Ender

Versi terpendek saya saat ini adalah ini; ## "de nr uu og ri GF"> o! ~ ~! <## Yang cukup lucu adalah 42 byte juga! Versi saya sebelumnya memiliki pengecekan kesalahan tetapi hanya bisa berkurang menjadi 53 byte.
Teal pelican

2

Fission , 37 byte

Menggunakan ·untuk mewakili spasi.

Angka

D·
"···
f··
i··
g·
u·
r·
e·ound
"·
;·

Cobalah online!

Tanah

·D
·"fi
·gu
·re
·o
·u
·n
·d····
·"
·;

Cobalah online!

Penjelasan

Bekerja pada dasarnya sama dengan jawaban saya> <> (walaupun saya benar-benar menemukan ini dulu). Satu-satunya perbedaan adalah bahwa "mencetak karakter segera di Fission, itulah sebabnya kata-kata tidak ditulis terbalik dan mengapa kita hanya perlu mengakhiri program dengan ;di akhir.


1

reticular, 46 byte

                      "ground""figure"" "?$$o;

Cobalah online! Ini mencetak ground.

"ground""figure"""?$$o                 ;      

Cobalah online! Ini mencetak figure.

tanah

Kode yang relevan:

"ground""figure"" "?$$o;
................          push these two strings
                " "?$     pop " " off (since " " is truthy, `?` executes `$`)
                     $    pop TOS ("figure")
                      o;  output and terminate

angka

Kode yang relevan:

"ground""figure"""?$$o;
................         push these two strings
                ""?$     doesn't activate
                    $    pop ""
                     o;  output and terminate

1

Brian & Chuck , 55 53 byte

Angka

erugif?dnuorg             
}<.<.<.<.<.<.             

Ada 13 spasi tambahan di setiap baris.

Cobalah online!

Tanah

             erugif?dnuorg
             }<.<.<.<.<.<.

Cobalah online!

Penjelasan

Ah, sudah lama sejak terakhir kali saya menggunakan Brian & Chuck. Sebagai pengingat singkat, Brian dan Chuck adalah dua contoh seperti Brainfuck, yang menggunakan kode sumber masing-masing sebagai rekaman mereka. Hanya Chuck yang dapat menggunakan perintah pencetakan ., ?beralih di antara kedua instance secara kondisional, dan }semacamnya[>] di Brainfuck. Perintah yang tidak dikenal diabaikan begitu saja.

Karena ruang di awal program diabaikan, kedua program hampir identik. Satu-satunya perbedaan berasal dari fakta bahwa setelah perintah switching ?, penunjuk instruksi bergerak sebelum mengeksekusi perintah berikutnya. Oleh karena itu, perintah pertama pada rekaman Chuck selalu dilewati. Jadi satu-satunya perbedaan nyata adalah bahwa program dasar mengeksekusi }sedangkan program angka tidak. Jadi, inilah cara kerjanya:

?   Switch control to Chuck.
}   GROUND PROGRAM ONLY: Move the tape head on Brian to the end of the tape.
<.  Move the tape head left and print the character there.
... Do the same another five times to print the remainder of the string.

0

WinDbg, 74 byte

Tanah

                      ea2000000"      groundfigure";;;da       2000006  L6

Angka

ea2000000"groundfigure          ";;;da                  2000006       L6  

Gambar memiliki 2 spasi tambahan. Saya merasa setidaknya 2 atau 4 byte seharusnya golfable ...

It works by writing a string to memory and showing 6 chars from it. The chars in the string are re-arranged so the shown chars change between the programs:

* Ground:
ea 2000000 "      groundfigure";     * Write string "      groundfigure" starting at 2000000
;                                    * No-op
;                                    * No-op
da 2000006 L6                        * Print 6 ascii chars, from 2000006, ie- ground

* Figure:
ea 2000000 "groundfigure          "; * Write string "groundfigure          " to memory
;                                    * No-op
;                                    * No-op
da 2000006 L6                        * Print 6 ascii chars, ie- figure

Output:

0:000>                       ea2000000"      groundfigure";;;da       2000006  L6
02000006  "ground"
0:000> ea2000000"groundfigure          ";;;da                  2000006       L6  
02000006  "figure"
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.