Bangun "Halo dunia!"


31

Pekerjaan Anda cukup sederhana, menulis program yang mencetak Hello, world!, bahwa ketika dipelintir membuat program yang mencetak Twister!.

Bagaimana string dipelintir

Algoritma memutar sangat sederhana. Setiap kolom digeser ke bawah oleh indeksnya (col 0 bergerak turun 0, col 1 bergerak 1, ...). Pergeseran kolom terbungkus ke atas. Ini terlihat seperti ini:

a
ba
cba
----
 cba
  cb
   c

Dengan segala sesuatu di bawah garis yang membungkus ke atas. Contoh nyata:

Original:
\\\\\\\\\\\\
............
............
............

Twisted:
\...\...\...
.\...\...\..
..\...\...\.
...\...\...\

(Contoh lebih lanjut dan twister dalam bahasa favorit Anda ada di sini )

Mencetak gol

Program Anda harus persegi panjang empuk. Ini adalah kode-golf sehingga jumlah byte terendah menang!

Aturan

  • Program pertama Anda harus mencetak Hello, world!. Hanya satu baris tambahan yang dibolehkan.
  • Program pertama dan kedua Anda harus dalam bahasa yang sama.
  • Program kedua Anda harus mencetak Twister!. Hanya satu baris tambahan yang dibolehkan.
  • Program Anda harus memiliki setidaknya 2 baris dan 2 kolom.

3
Di halaman kode Jelly , karakter yang sesuai dengan (dan, untuk semua tujuan, bertindak seperti) linefeed memiliki titik kode 127 (ASCII DEL). Karakter dengan kode titik 10 (ASCII linefeed) memiliki mesin terbang ½dan mengambil akar kuadrat dari sebuah angka. Yang mana dari keduanya yang harus dianggap sebagai baris baru untuk tantangan ini?
Dennis

Sial, apakah saya satu-satunya yang berharap "Twisted Hello World" menggunakan "twisted" dalam arti sesat sehingga kami akan mengeluarkan sesuatu seperti "Selamat Tinggal Dunia Kejam" sebagai gantinya ..
DasBeasto

@ Dennis Saya kira yang lebih baik untuk digunakan dalam kasus ini akan menjadi jeli baris baru.
J Atkin

@JAtkin OKE, terima kasih sudah menjelaskan. Saya telah memperbarui jawaban saya sesuai dengan itu.
Dennis

Jawaban:


10

Jelly , 33 31 29 byte

Asli

“ɗ⁻%OḶ$“¡¦ḟṠ»Ṫ
“ɗ⁻%OḶ$“¡¦ḟṠ»Ḣ

Cobalah online.

Bengkok

“ɗ⁻%OḶ$“¡¦ḟṠ»Ḣ
“ɗ⁻%OḶ$“¡¦ḟṠ»Ṫ

Cobalah online!

Bagaimana itu bekerja

Di setiap program, setiap baris mendefinisikan tautan. Yang terakhir adalah tautan utama, dan dieksekusi ketika program dimulai. Karena tidak ada referensi ke tautan pertama, itu hanya diabaikan.

Untuk kedua program, “ɗ⁻%OḶ$“¡¦ḟṠ»buat daftar ['Hello, world!', 'Twister!'], menggunakan kompresi kamus statis Jelly .

Satu-satunya perbedaan antara kode asli dan kode twisted adalah karakter terakhir dari tautan utama. memilih string pertama dari daftar, dan memilih yang terakhir.


2
Sepertinya itu berteriak "Holy Sh * t"
fase

42

Python 2, 59 byte

print "  Hello, world!"[ 2::]
#rint "T w i s t e r !"[ ::2]

Memutar:

print "T weils,twerrd!"[ ::2]
#rint "  H l o   o l !"[ 2::]

Pada dasarnya, letakkan Twister!data dalam indeks ganjil string dan kemudian berubah dari menghapus dua (padding) karakter pertama untuk menghapus setiap karakter lainnya sebagai gantinya.


Ini jauh lebih pintar daripada pendekatan saya
wnnmaw

Ini agak konyol, 40 upvotes?
J Atkin

@ Akin Saya telah memperhatikan bahwa beberapa solusi Python cenderung mendapatkan jumlah besar dari mereka. Bukannya aku mengeluh: ~)
PurkkaKoodari

Cara print " Hello, world!" [2::]
yang lebih keren

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Bekerja, tapi saya akan menyimpannya seperti sekarang.
PurkkaKoodari

17

Fission , 215 162 56 53 50 byte

Inilah awalnya:

D1
\\
""
TH
we
il
sl
to
e,
r 
!w
"o
1r
;l
1d
;!
 "

Cobalah online!

Ketika dipelintir:

D"
\1
"\
T"
wH
ie
sl
tl
eo
r,
! 
"w
1o
;r
1l
;d
 !

Cobalah online!

Penjelasan

The Hello, world!kode cukup sederhana:

  • D memunculkan satu atom, turun ke bawah.
  • Dua \(cermin) membelokkannya ke kolom kedua.
  • "Hello, world!" mencetak string yang diperlukan.
  • 1adalah portal. Ini memindahkan atom ke yang berikutnya 1dalam urutan membaca, mempertahankan arahnya (itu yang berikutnya r).
  • Atom masih bergerak ke bawah, ke dalam ;yang menghancurkan atom dan mengakhiri program.

Aliran kontrol untuk Twister!kode sedikit lebih ... terpelintir ...

  • Sekali lagi, Dmenumbuhkan atom.
  • \membelokkannya ke kanan, ke dalam 1.
  • Sekarang portal mengirimkan atom ke yang berikutnya 1. Atom mengenai oyang hanya mengubah massanya, tetapi kita dapat mengabaikannya. Kode membungkus sehingga atom menyentuh sama 1lagi, melompati dua baris. Sekali lagi, kita dapat mengabaikan l, atom membungkus dan mengenai 1lagi. Sekarang tidak ada lagi 1kode sehingga atom melompati semua jalan kembali ke 1atas.
  • Setelah melilit tepi sekali lagi, atom dibelokkan kembali oleh \, sekarang turun lagi.
  • "Twister!" mencetak kode yang diperlukan.
  • 1teleport atom sekali lagi, melewati yang pertama ;, tetapi ada yang lain ;menunggu untuk menghentikan program.

Wow, sangat dekat sekarang! :) Saya yakin ada cara untuk menjadi lebih pendek ...
FryAmTheEggman

Mengapa kalian suka fisi?
J Atkin

@JAtkin Kenapa tidak? :)
Martin Ender

@ MartinBüttner Saya sedang berpikir secara khusus mengapa untuk tantangan ini?
J Atkin

1
@JAtkin bahasa 2D sepertinya cocok, dan Fission tampak sangat sederhana karena Anda dapat memilih satu atau lebih titik masuk sewenang-wenang ke dalam program.
Martin Ender

15

Pembelahan , 35 byte

Pendekatan fisi # 3 (# 4 menghitung yang saya edit dari posting pertama saya).

R"Hello, " \"tri"
T;L"!dlrow"/"es!w

Cobalah online!

R;H"ldor w /"er!"
T"Le!ll,o""\"tsiw

Cobalah online!

Penjelasan

Yang ini sebenarnya adalah solusi Fisi paling sederhana. Di kedua program ada dua titik masuk: Rmembuat atom yang berjalan kanan dan atom yang Lberjalan kiri. Dalam kedua kasus tersebut,; menghancurkan salah satu dari mereka.

Sekarang dalam Hello, world!program, atom pertama mencetak setengah string dengan "Hello, ", lalu \dan /(yang merupakan cermin) membelokkan atom ke baris kedua ke kiri. "world!"(Baca ke arah atom yang bergerak) mencetak sisa string. Lsekarang menjadi no-op dan; menghancurkan atom ini juga, mengakhiri program.

The Twister!Program ini pada dasarnya sama tapi diputar 180 derajat. Kali ini, Latom bertahan, dan mulai mencetak "Twist". The \dan /lagi membelokkan itu ke jalur lain, sekarang akan benar. "er!mencetak sisa string, Radalah no-op dan ;mengakhiri program.


Luar biasa! Saya pikir ini tentang sekecil yang bisa didapat, jumlah penggunaan kembali mengesankan.
FryAmTheEggman


4

Japt, 67 61 57 byte

Disimpan 6 byte berkat @JAtkin, 4 byte berkat @Ian

"Tzwzizsztzezzzzzzrzzzz!"rz;
"Hzezlzlzoz,z zwzorlzdz!"rz;

Memutar:

"Hzezlzlzoz,z zwzorlzdz!"rz;
"Tzwzizsztzezzzzzzrzzzz!"rz;

Uji online: Asli , Twisted

Bagaimana itu bekerja

"Tzwzizsztzezzzzzzrzzzz!"rz;  // Take this string and remove all "z"s.
"Hzezlzlzoz,z zwzorlzdz!"rz;  // Take this string and remove all "z"s.
                              // Implicit: output *last* expression

Jika ini berfungsi seperti yang saya kira berhasil, Anda dapat menghapus spasi tambahan Twister!dengan mengganti spasi dengan ..
J Atkin

@ Aytkin Sebenarnya tidak berfungsi seperti itu, tapi saya bisa menghemat banyak byte dengan cara itu. Terima kasih!
ETHproduksi

"T.w.i.s.t.e.r.!. . . . . "k".(newline)"H.e.l.l.o.,. .w.o.r.l.d.!"k".
J Atkin

Bisa jadi lebih mudah dibaca dengan karakter pengisi yang berbeda ...
mbomb007

4
@ mbomb007 Sejak kapan "mudah dibaca" sebuah prestasi? : D
yo '

4

Python, 398 414 380 456 byte *

Berhasil memperbarui sehingga sesuai dengan aturan, tapi saya masih ragu untuk menyebut ini kompetitif. Karena baris yang dikomentari diperlukan untuk menjalankannya, saya telah memasukkannya dalam jumlah byte

Solusi ini tidak mengikuti aturan, karena akan mencetak pesan kesalahan selain output yang diizinkan.

Saya hanya ingin melihat apakah ini bisa dilakukan dengan python. Bisa, tetapi tidak cantik.

print'Hello, world!'
#rint'Twister!'     
#rint'Twister!'     
#rint'Twister!'     
#rint'Twister!'     
#rint'Twister!'     
#rint'Twister!'     
#rint'Twister!'     
#rint'Twister!'     
#rint'Twister!'     
#rint'Twister!'     
#rint'Twister!'     
#rint'Twister!'     
#rint'Twister!'     
#rint'Twister!'     
#rint'Twister!'     
#rint'Twister!'     
#rint'Twister!'     
#rint'Twister!'     

Saat dipelintir menjadi

print'Twister!'
#rint'Twister!'
#rint'Twister!'
#rint'Twister!'
#rint'Twister!'
#rint'Twister!'
#rint'Hwister!'
#rint'Teister!'
#rint'Twlster!'
#rint'Twilter!'
#rint'Twisoer!'
#rint'Twist,r!'
#rint'Twiste !'
#rint'Twisterw'
#rint'Twister!o
#rint'Twister!'r
#rint'Twister!' l
#rint'Twister!'  d
#rint'Twister!'   !

Saya pikir Anda bisa menghapus spasi di setiap baris, lalu menghapus baris terakhir sama sekali.
ETHproduk

Saya tidak berpikir untuk melakukan itu karena itu melanggar aturan tantangan memutar awal, tapi terima kasih!
wnnmaw

Anda lupa memperbarui kode;)
ETHproduk

Saya pikir itu tidak terlalu penting, tapi saya melakukannya untuk ukuran yang baik
wnnmaw

1
Saya pikir Anda salah paham. Kode ini harus berbentuk persegi panjang empuk, tetapi Anda dapat menghapus spasi dari rint 'setiap baris.
ETHproduk


1

Brainfuck, 467 367 285 byte

Terpilin

 +[  [[-->-[>>+>-----<<]<--<---]>-.>>>+.>>..+++[.>]<<<<.+++.------.<<-.>>>>+.>>] [[--[<++++>--->+<]>-]<<<<.<<<-.<<+.>-.+.<----.>--.>>---.[-]]]
  [ -[[-->-[>>+>-----<<]<--<---]>-.>>>+.>>..+++[.>]<<<<.+++.------.<<-.>>>>+.>>]+[[--[<++++>--->+<]>-]<<<<.<<<-.<<+.>-.+.<----.>--.>>---.[-]]]

Cobalah online!

Bengkok

  [  [[-->-[>>+>-----<<]<--<---]>-.>>>+.>>..+++[.>]<<<<.+++.------.<<-.>>>>+.>>] [[--[<++++>--->+<]>-]<<<<.<<<-.<<+.>-.+.<----.>--.>>---.[-]]]
 +[ -[[-->-[>>+>-----<<]<--<---]>-.>>>+.>>..+++[.>]<<<<.+++.------.<<-.>>>>+.>>]+[[--[<++++>--->+<]>-]<<<<.<<<-.<<+.>-.+.<----.>--.>>---.[-]]]

Cobalah online!


1
Anda dapat menyimpan byte dengan menggunakan "Hello, world!" program
Jo King

@JoKing Terima kasih atas sarannya! Ada ide bagaimana menemukan "Twister!" program juga?
orthoplex

1
Menggunakan bf-crunch saya bisa mendapatkan 56 byte "Twister!" program
Jo King
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.