cinpush
main:
gte Hans 1s Leopold
jnz Leopold done
mov 1s Hans
gte Gertrude Hans Leopold
jnz Leopold done
mov Gertrude ShabbySam
mov Hans Gertrude
mov ShabbySam Hans
gte Alberto Gertrude Leopold
jnz Leopold done
mov Alberto ShabbySam
mov Gertrude Alberto
mov ShabbySam Gertrude
done:
mov 10 ShabbySam
gte 1s ShabbySam Leopold
jz Leopold undo_u
mov 30 ShabbySam
gte 1s ShabbySam Leopold
jz Leopold undo_d
undo_r:
POP!! 1
"shuffle" f
"shuffle" f
"shuffle" b
"shuffle" b
"shuffle" l
"shuffle" f
"shuffle" f
"shuffle" b
"shuffle" b
jmp end
undo_u:
POP!! 1
"shuffle" f
"shuffle" f
"shuffle" f
"shuffle" b
"shuffle" b
"shuffle" b
"shuffle" l
"shuffle" l
"shuffle" l
"shuffle" f
"shuffle" b
jmp end
undo_d:
POP!! 1
"shuffle" f
"shuffle" b
"shuffle" l
"shuffle" f
"shuffle" f
"shuffle" f
"shuffle" b
"shuffle" b
"shuffle" b
end:
jnz 1s main
print Hans
done!
Ini sangat menyenangkan, terima kasih Liam! :)
Terima kasih kepada Sp3000 untuk dorongan ringan tapi perlu ke arah yang benar.
Bagaimana?
Dua kata: Pocket Cube .
Ternyata tumpukan tersebut sesuai dengan wajah kubus Rubik 2x2x2 sebagai berikut:
____ ____
| | |
| 19 | 17 |
|____U____|
| | |
| 20 | 18 |
_________|____|____|____ ____ ____ ____
| | | | | | | | |
| 13 | 14 | 1 | 2 | 9 | 10 | 6 | 5 |
|____L____|____F____|____R____|____B____|
| | | | | | | | |
| 15 | 16 | 3 | 4 | 11 | 12 | 8 | 7 |
|____|____|____|____|____|____|____|____|
| | |
| 22 | 24 |
|____D____|
| | |
| 21 | 23 |
|____|____|
Di mana ULFRBD
menunjukkan wajah mana yang sesuai dengan atas, kiri, depan, kanan, belakang, bawah ketika kubus dilipat dengan benar.
Permutasi sesuai dengan merotasi salah satu sisi dengan 90 derajat (di mana nama-nama tersebut untungnya cocok). Ternyata itu f
, r
dan d
merupakan rotasi searah jarum jam (saat melihat wajah) dan r
, l
dan u
merupakan rotasi berlawanan arah jarum jam (saat melihat wajah).
Sekarang cinpush
perintah beroperasi sedemikian rupa sehingga berlaku salah satu rotasi u
, d
atau r
(tergantung pada nilai yang diberikan) dan kemudian mendorong nilai input ke tumpukan di posisi 1
. (Dan kemudian mengulangi melakukan ini untuk setiap elemen dalam input.) Itu berarti kita dapat membalikkan proses ini (untuk memastikan kita berakhir dengan urutan tumpukan yang benar tanpa harus menyelesaikan kubus Rubik yang sewenang-wenang) dengan berulang kali melihat tumpukan di posisi 1
, membatalkan permutasi yang sesuai dan muncul nilai tumpukan itu (sehingga saat kita melihat tumpukan, kita mendapatkan nilai di bawah).
Bagaimana cara membatalkan rotasi? Untungnya, kami memiliki keduanya f
dan b
siap membantu kami. Jika kami menerapkan keduanya, kami memutar seluruh kubus sebesar 90 derajat. Ini berarti kita dapat memindahkan sisi yang terpengaruh ( U
, R
atau D
) ke L
, membatalkan rotasi menggunakan satu atau tiga l
s (tergantung pada arah relatif l
dan rotasi yang dilakukan selama input), dan kemudian memutar kubus kembali ke orientasi sebelumnya menggunakan f
dan b
lagi.
Secara khusus, setiap rotasi yang dilakukan selama input dapat dibatalkan sebagai berikut:
u --> fffbbblllfb
r --> ffbblffbb
d --> fblfffbbb
Saya akan melihat apakah saya dapat membuat beberapa animasi untuk menunjukkan bahwa ini berfungsi.
Sekarang ini memberi kita cara untuk mengulangi seluruh input sekali. Tetapi dengan 5 register, itu saja yang kita butuhkan:
Alberto
adalah nilai maksimum yang ditemui sejauh ini.
Gertrude
adalah nilai terbesar ke-2 yang ditemukan sejauh ini.
Hans
adalah nilai terbesar ke-3 yang ditemukan sejauh ini.
Ketika kami menemukan nilai baru, kami menggelembungkannya tiga sejauh yang diperlukan, di mana kami dapat digunakan ShabbySam
sebagai register sementara untuk swap. Itu masih menyisakan Leopold
yang bisa kita gunakan untuk bersyarat saat membuat perbandingan yang diperlukan.
Pada akhir proses, kami cukup mencetak konten Hans
, yang sudah akan memegang nilai terbesar ke-3.
TKDYNS oleh Sam Cappleman-Lynes
Ini mungkin tidak optimal, tapi saya pikir itu berhasil ...
Ini mungkin mengejutkan, tetapi saya tidak menulis ini dengan tangan ... kode ini dihasilkan oleh program Mathematica berikut:
Saya benar-benar menulis semua
safetyCheck
baris itu dengan tangan. Tapi baris pertama dari kode Mathematica itu sebenarnya sekitar 28.000 karakter dan itu sendiri dihasilkan oleh kode CJam berikut:(Yang mengambil 10 tata letak yang dimasukkan dengan hardcode ke dalam interpreter. Anda dapat menjalankan kode secara online. )
Kode-generasi-konsepsi!
Penjelasan
Sebagai permulaan, lihat skrip CJam ini untuk melihat seperti apa labirin itu.
Solusi saya didasarkan pada satu pengamatan penting: selama kita mengambil item di sepanjang satu kolom, kita tidak akan berubah di antara tata letak, terlepas dari apakah sel diisi atau tidak. Khususnya, selama kita bergerak di sepanjang kolom paling kiri kita akan tetap dalam tata letak
0
. Selama kita bergerak di sepanjang kolom berikutnya, kita akan tetap dalam tata letak1
.Bagian yang sulit adalah bagaimana memastikan bahwa kami telah berubah di antara tata letak, karena kami tidak tahu sel mana dalam kolom yang
1
memiliki item padanya (jika ada!).Jadi, inilah algoritmenya (dimulai dari sel
0
dalam tata letak0
):Sekarang untuk setiap sel di sebelah kanan kolom saat ini (coba mereka dalam urutan kolom-utama), coba pindah ke sana dalam tata letak saat ini, ambil item di sana, lalu pindah ke baris atas di kolom baru itu menggunakan tata letak baru.
Jika sel yang dicoba berisi item, tata letak akan berubah dan kami akan berhasil mencapai kolom dan tata letak baru. Karena posisi (aman) yang baru ada di baris atas, tetapi semua upaya untuk menemukan kolom berikutnya mencakup 10 gerakan ke atas net, semua upaya lain akan gagal, sehingga kita dapat mengabaikannya.
Jika sel yang dicoba tidak mengandung item, dalam kebanyakan kasus, antek akan mati selama upaya untuk mencapai baris atas menggunakan tata letak yang salah, maka membuang upaya ini. Namun, ini tidak selalu terjadi. Misalnya, sel yang dicoba mungkin sudah ada di baris atas, jadi tidak ada gerakan yang dilakukan pada tata letak baru. Demikian juga, dalam beberapa kasus, jalur dari sel yang dicoba ke baris atas cukup pendek untuk valid pada kedua tata letak. Saya telah mengumpulkan semua kasus di mana ini merupakan masalah dengan tangan, dan menentukan serangkaian gerakan yang hanya valid pada tata letak baru (tetapi yang memindahkan antek kembali ke sel target, sehingga secara efektif no-op pada tata letak baru). Setelah setiap upaya di mana ini bisa menjadi masalah, saya melakukan serangkaian gerakan ini untuk membunuh setiap antek yang tidak
Kami sekarang telah berhasil pindah ke bagian atas kolom berikutnya yang berisi setidaknya satu item. Kembali ke langkah 1.
Anda mungkin memperhatikan bahwa struktur solusi adalah sebagai berikut:
Sedangkan untuk kode Mathematica,
safetyCheck
string adalah gerakan yang dipilih sendiri yang memastikan bahwa kami telah mencapai tata letak baru. Parameter pertama untuk pencarian adalah tata letak tempat kami mulai dan yang kedua adalah sel yang kami coba. Kombinasi apa pun yang tidak disebutkan secara eksplisit hanya memberikan pemeriksaan keamanan kosong (karena tidak diperlukan).Selain itu, saya hanya mengatur 10 labirin sebagai
Graph
objek, di mana ada dua tepi terarah antara setiap sel yang berdekatan (dan terhubung), di mana setiap tepi dijelaskan dengan gerakan yang diperlukan untuk melintasi tepi. Dengan itu di tempat, saya hanya dapat menemukan jalur menggunakanFindShortestPath
dan kemudian ekstrak label tepi yang sesuai dengannyaPropertyValue[..., EdgeLabels]
.Sisa kode hanya memanfaatkannya untuk mengimplementasikan algoritma di atas secara langsung.
Data grafik aktual disimpan dalam
layouts
dan dihasilkan dengan skrip CJam, yang menerjemahkan angka-angka seperti yang dijelaskan dalam pos polisi dan mengubahnya menjadi daftar Mathematica, yang dapat dengan mudah diubah menjadi grafik.sumber
HPR, oleh Zgarb
Kode:
Pertama-tama ... kode dihasilkan, bukan tulisan tangan (atau diketik).
Fakta tentang bahasa:
Program ini menggunakan psuedocode berikut:
Lingkungan hampir selalu berisi hanya 1 daftar dan 1 integer.
Untuk mengatasi ini, saya membuat mesin makro kecil untuk bahasa ini. Itu juga memungkinkan komentar. Inilah mesin makro:
Setelah saya membangun mesin makro, saya perlahan membangun fungsi yang berguna untuk bahasa ini. Berikut adalah kode yang diproses oleh mesin untuk membuat program:
sumber
Brian & Chuck oleh Martin Büttner
Program Python 2.7 berikut menampilkan program Brian & Chuck saya, dengan menerjemahkan program brainfuck ke Brian & Chuck (dengan pengecualian yang
.
selalu dicetak1
, karena hanya karakter yang perlu kita tampilkan).Alur kontrol bekerja dengan
sihirmeminta Brian menulis pada perintah Chuck untuk mengirim Brian ke posisi yang benar dalam kode.Perhatikan bahwa spasi putih dan
[]
yang ditambahkan ke program B&C hanya bersifat dekoratif.sumber
Firetype, oleh kirbyfan64sos
Bekerja, kode yang dikomentari:
Ini bergantung pada juru bahasa yang saat ini disediakan dalam jawaban polisi, yang sedikit bertentangan dengan dokumentasi mengenai
%
dan!
.Tantangan utama di sini adalah mengurai input, karena
\
membuat mencari nilai terbesar ketiga cukup sederhana.sumber
Acc !, oleh DLosc
Bahasa ini memiliki dukungan perbandingan yang mengerikan .
The
count [varname] while 0
pernyataan di awal adalah untuk mendeklarasikan variabel memegang jumlah terbesar, jumlah terbesar kedua, jumlah terbesar ketiga, dan seterusnya. Perbandingan dilakukan dengan mengurangi dua angka kemudian memeriksa apakah hasilnya negatif dengan memeriksa apakah angka itu kurang dari itu10^6
.sumber
Seng, oleh kirbyfan64sos
Ini tidak terlalu sulit, begitu saya mengerti bagaimana bahasa itu bekerja. Bagian yang sulit adalah untuk mendapatkan kesalahan parser, tetapi menambahkan beberapa tanda kurung berlebihan tampaknya memperbaikinya. Inilah solusinya:
Penjelasan
Di baris pertama dan kedua, saya definisikan
+
sebagaicut
operasi. Selebihnya adalah mengatur pemahaman. Mari kita ambil input101011101100
sebagai contoh, dan mulai dari yang paling dalam:Ini mengambil elemen-elemen
a
dari set inputS = {1,0,1,0,1,1,1,0,1,1,0,0}
yang indeksnya tidaklen(S)-1
, jadi semuanya kecuali yang terakhir. Saya perhatikan bahwa ini juga membalik set, jadi hasilnyaA = {0,1,1,0,1,1,1,0,1,0,1}
. Selanjutnya, pemahamanmengambil semua elemen
A
kecuali yang pertama dan membalikkannya lagi, menghasilkanB = {1,0,1,0,1,1,1,0,1,1}
. Kemudian, kami membagiB
pada0
s (ini menghasilkan{1,1,{1,1,1},{1,1}}
atau pembalikannya, saya tidak memeriksa yang mana), dan mengurutkan hasilnya berdasarkan panjangnya. Set singleton diratakan, tetapi semuanya1
s sehingga panjangnya masih 1. Berikut kodenya:Hasilnya adalah
C = {{1,1,1},{1,1},1,1}
. Akhirnya, kami memfilter semuanya kecuali elemen pada indeks 2 olehIni menghasilkan set
D = {1}
pada kasus kami. Secara umum, ini dapat memiliki formulir{{1,1,..,1}}
, tetapi ini tidak masalah karena hanya1
huruf s yang dicetak.sumber
Sup Kompas, oleh BMac
Ini sangat menyenangkan.
Sunting: program ini harus diawali dengan baris baru untuk dapat bekerja dengan penerjemah BMac. Sepertinya saya tidak bisa mendapatkan baris baru muncul di blok kode.
Program ini dibagi menjadi 4 bagian eksekusi.
Yang pertama, pada baris 1, menambahkan a
#
ke akhir input dengan menemukan00
dan mengganti ke-20
dengan#
. Itu juga mengubah semua1
s menjadiA
, karena saya ingin memiliki sesedikit mungkin1
dalam kode sumber.Bagian kedua, pada baris 5, mengambil angka kedua dalam input, dan meletakkannya di bawah angka pertama sebagai string
+
s. Misalnya, jika inputnya adalah11011101100
, maka akan menghasilkan yang berikut:Bagian ketiga, pada baris 12, menggabungkan string
+
s dengan angka pertama: masing0
- masing di atas a+
menjadiA
,A
menjadiB
,B
menjadiC
, danC
tetap tidak berubah. Setelah itu, kita kembali ke bagian ke-2 untuk mengambil nomor berikutnya.Setelah semua angka digabungkan dengan cara ini, kita mencapai bagian akhir di baris 18. Jumlah
C
s adalah output yang kita inginkan, jadi kita ubah ini menjadi1
s, lewati duluC
karena ada satu1
di kode sumber yang dicetak bersama dengan output.sumber