"Halo Dunia!" (Utas perampok)


11

Ini adalah utas perampok. Utas polisi ada di sini .

Tantangan Anda adalah mengambil kiriman yang tidak terputus dari utas polisi dan menemukan, untuk input atau input apa, program akan dicetak Hello, World!dan baris baru. Kapitalisasi, spasi, dan tanda baca harus tepat.

Berikan komentar tentang pengiriman polisi ketika Anda telah memecahkan kode mereka.

Jawaban:


12

Bash oleh Sisyphus

Kode asli:

[[ ! "${1////x}" =~ [[:alnum:]] ]]&&[[ $# = 1 ]]&&bash -c "$1"

Memasukkan:

__=; (( __++, __-- ));
(( ___        = __,        ___++));
(( ____       = ___,       ____++));
(( _____      = ____,      _____++));
(( ______     = _____,     ______++));
(( _______    = ______,    _______++));
(( ________   = _______,   ________++));
(( _________  = ________,  _________++));

${!__##-} <<<\$\'\\$___$______$_______\\$___$______$_____\\$___$_______$__\\$___$_______$_________\'\ \$\'\\$___$___$__\\$___$______$_______\\$___$_______$______\\$___$_______$______\\$___$_______$_________,\ \\$___$____$_________\\$___$_______$_________\\$___$________$____\\$___$_______$______\\$___$______$______\\$__$______$___\'

Penjelasan:

Ini mengkodekan "gema Halo, Dunia!" sebagai urutan pelepasan oktal (\ xxx).

Kecuali Anda juga tidak dapat menggunakan angka, jadi bagian pertama membangun variabel untuk angka 0-7. Anda bisa menggunakannya untuk membangun string dengan urutan oktal yang akan dievaluasi untuk memberi Anda perintah yang sebenarnya.

Tetapi evaljuga alfanumerik. Jadi, bukannya ini pipa yang string sebagai input ke contoh lain dari bash. $0berisi nama perintah yang digunakan untuk memanggil Bash, yang biasanya hanya bash(atau -bashuntuk shell login) jika Anda menjalankannya secara normal (melalui TIO atau dengan menempelkannya di terminal). (Ini kebetulan berarti bahwa jika Anda mencoba menjalankan ini dengan menempelkannya ke dalam skrip, hal-hal yang salah akan terjadi ketika mencoba untuk garpu sendiri beberapa kali.)

Tapi bagaimanapun, Anda tidak bisa mengatakannya $0secara langsung. Sebaliknya, $__berisi nama dari $0( "0"), dan Anda dapat menggunakan ekspansi langsung ke mengaksesnya ( ${!__}mengacu pada isi $0).

Dan itu, akhirnya, memberi Anda semua bagian yang Anda butuhkan.


Selamat Datang di Programming Puzzles & Code Golf! Saya telah meninggalkan komentar pada jawaban polisi. TIO link untuk yang tertarik: tio.run/##jc/…
Dennis

Bagus! Solusi saya terlihat berbeda, tetapi menggunakan ide yang sama - membangun string oktal dan menggunakan sintaks kutipan dolar tunggal, dan menggunakan tipuan. Bagus =)
Sisyphus

4

05AB1E , Adnan

•GG∍Mñ¡÷dÖéZ•2ô¹βƵ6B

-107

Cobalah online!

Bagaimana?

•GG∍Mñ¡÷dÖéZ•        - big number
             2ô      - split into twos (base-10-digit-wise)
               ¹β    - to base of input
                   B - convert to base (using 012...ABC...abc...):
                 Ƶ6  -   107 (ToBase10(FromBase255(6))+101 = 6+101 = 107)

Basis negatif ... cantik ...
Erik the Outgolfer



3

Jelly: EriktheOutgolfer

〡㋄ⶐ✐сᑀ⟙ⶐⶐ〡ސЀᶑ〡㋄ⶐ✐сᑀ⟙ⶐⶐ〡ސЀᶑ〡㋄ⶐ✐сᑀ⟙ⶐⶐ〡ސЀᶑ〡㋄ⶐ✐сᑀ⟙ⶐⶐ〡ސЀᶑ〡㋄ⶐ✐сᑀ⟙ⶐⶐ〡ސЀᶑ〡㋄ⶐ✐сᑀ⟙ⶐⶐ〡ސЀᶑ〡㋄ⶐ✐сᑀ⟙ⶐⶐ〡ސЀᶑ〡㋄ⶐ✐сᑀ⟙ⶐⶐ〡ސЀᶑ〡㋄ⶐ✐сᑀ⟙ⶐⶐ〡ސЀᶑ〡㋄ⶐ✐сᑀ⟙ⶐⶐ〡ސЀᶑ〡㋄ⶐ✐сᑀ⟙ⶐⶐ〡ސЀᶑ〡㋄ⶐ✐сᑀ⟙ⶐⶐ〡ސЀᶑ〡㋄ⶐ✐сᑀ⟙ⶐⶐ〡ސЀᶑ

Jelly , 11 byte

sLƽ$Xṙ5O½Ọ

Cobalah online!

Penjelasan

Kode asli dapat dijelaskan sebagai berikut:

sLƽ$Xṙ5O½Ọ  Main link; argument is z
s            Split z into n slices, where n is:
    $
  ƽ         The integer square root of
 L                                      the length of z
     X       Random of a list. Returns a random row of the input put into a square
      ṙ5     Rotate the list left 5 times
        O    Get codepoints
         ½   Floating-point square root
          Ọ  From codepoints

Jadi, ambil saja "Halo, Dunia!" dan dapatkan codepoint, kuadratkan, kembalikan ke codepoints, putar 5 kali dengan benar, lalu kuadratkan dan ratakan hasilnya.


3

Oktaf oleh Stewie Griffin

Tidak yakin apakah ini solusi yang tepat (di TIO mencetak \00karakter), tetapi di octave-clishell saya tampilannya seperti ini:

Kulit oktaf

Juga dalam tantangan aslinya dikatakan mencetak apa-apa (atau karakter nol) , jadi jika tidak ada yang sama \00maka ini harus baik-baik saja.

[72, 101, 108, 108, 111, 44, 32, 87, 111, 114, 108, 100, 33, 0]

Cobalah online!



Tapi bukan itu tantangannya, jika demikian ini akan membuat saya lebih mudah (ganti yang terakhir 0dengan a 10).
ბიმო

@BruceForte Itu adalah apa tantangannya bertanya: "Tantangan Anda adalah untuk menulis sebuah program atau fungsi yang, dengan masukan tertentu, mencetak string yang tepat Hello, World!dan baris baru." adalah kutipan tepat dari tantangan. Dan memang, itu membuat jawabannya sepele.
hvd

@ DVD Ya, tetapi jika Anda melihat gambar OP solusinya tidak, di situlah kebingungan utama berasal.
ბიმო

1
@HyperNeutrino FWIW inilah yang saya pikirkan gaya solusi yang dimaksud.
Jonathan Allan


3

JavaScript (ES6) Oleh Ephellon Dantzler

{length:1, charCodeAt:()=>(e='Hello, World!', String.fromCharCode=()=>'')}

Cobalah online!

Itu sangat mudah.

Saya perhatikan bahwa setiap input string tidak mungkin dihasilkan Hello, World!karena keseluruhan isinya String.fromCharCodehanya akan mengembalikan kelipatan 4, dan !memiliki kode char 33. Jadi jelas kita hanya perlu meretas keseluruhan program. Meretas bawaan dalam JavaScript adalah sepele jika seseorang tidak mencoba menghentikannya (dan bahkan jika seseorang melakukannya, biasanya ada banyak solusi ...).


3

JavaScript (ES6), Voile

Proxy sederhana yang hanya mengembalikan karakter yang diinginkan setiap kali dipanggil.

var i = 0;
var string = "Hello, World!";
var proxy = new Proxy([], {
  get: function(target, property) {
    if (!(++i%3)) {
      return string[property];
    }
    return [1];
  }
});

Cobalah online!


2
Ya, ini adalah solusi yang dimaksudkan :) Proxy membutuhkan lebih banyak cinta.
Voile

3

Ruby, oleh Histocrat

Input ajaib adalah: 1767707618171221 30191World!

Cobalah online.

Penjelasan:

  • angkanya 1767707618171221adalah bilangan prima, dan, yang ditulis dalam basis 36, bilangan prima "hello". Ketika dikapitalisasi, ini menghasilkan "Hello", yang dicetak menggunakan$><<
  • baris $><<", #$'"if/30191/mencari nomor 30191dalam input dan menulis ke stdout string yang terdiri dari koma, spasi, dan apa pun yang ada di input setelah 30191(menggunakan $POSTMATCH, yang disebut di sini oleh varian pendeknya, $').

3

Lua 5.1 oleh tehtmi

Lewati ini sebagai argumen pertama:

C=("").char;_G[C(112,114,105,110,116)](C(72,101,108,108,111,44,32,87,111,114,108,100,33))

Dengan asumsi kode asli ada dalam file tehtmi.lua, jalankan (dalam bash atau shell serupa):

lua tehtmi.lua 'C=("").char;_G[C(112,114,105,110,116)](C(72,101,108,108,111,44,32,87,111,114,108,100,33))'

Ini juga bekerja pada Lua 5.3, yang digunakan TIO, jadi mengapa Anda tidak mencobanya secara online ? Saya belum menguji implementasi yang menggunakan inti "PUC-Rio's Lua 5.1" (karena saya tidak dapat menemukan informasi), tetapi solusi saya mungkin juga bekerja di sana.

Bagaimana?

Ini menjalankan argumen pertama sebagai kode, tetapi hanya jika mengandung kurang dari 5 karakter huruf kecil.

Triknya adalah berlari print("Hello, World!"). Cara lain yang bisa dijalankan adalah menggunakan _G["print"]("Hello, World!"), yang hanya menggunakan string.

Tetapi kita tidak dapat menggunakan string secara langsung karena pembatasan jumlah huruf kecil, namun, Anda dapat menjalankan ("").charuntuk mendapatkan fungsi string.char, yang dapat mengkonversi dari serangkaian byte ke string. Saya menugaskannya ke variabel huruf besar (jadi kami tidak mencapai batas) sehingga kami dapat menggunakannya untuk membangun kedua printdan Hello, World!string yang dapat digunakan seperti di atas.


Ah, bagus sekali! Saya berpikir untuk menggunakan nextbukannya charyang tidak bekerja pada Lua 5.3 karena pengacakan urutan iterasi.
tehtmi

3

JavaScript (ES6) oleh Voile

Input harus berupa string yang mengandung ini:

e(
`\
_\
=\
>\
"\
H\
e\
l\
l\
o\
,\
 \
W\
o\
r\
l\
d\
!\
"\
+\
\`
\`
`)

Coba gunakan ini:

const e=eval,p=''.split,c=''.slice,v=[].every,f=s=>(t=c.call(s),typeof s=='string'&&t.length<81&&v.call(p.call(t,`\n`),l=>l.length<3)&&e(t)(t))

input='e(\n`\\\n_\\\n=\\\n>\\\n\"\\\nH\\\ne\\\nl\\\nl\\\no\\\n,\\\n \\\nW\\\no\\\nr\\\nl\\\nd\\\n!\\\n\"\\\n+\\\n\\`\n\\`\n`)'
console.log(f(input))

Jika Anda tidak peduli tentang persyaratan baris tambahan untuk output, Anda dapat mengganti 6 baris terakhir dengan ini sebagai gantinya:

!"
`)

Bagaimana saya melakukannya

Batasan pada input adalah string, setiap baris panjangnya dua byte atau kurang, dan panjang totalnya 80 byte atau kurang. Upaya pertama saya setelah memahami itu dengan benar adalah ini:

_
=>
`\
H\
e\
l\
l\
o\
,\
 \
W\
o\
r\
l\
d\
!
`

Catatan: \s adalah untuk mengabaikan baris baru dalam string pada input. Ini sangat penting untuk jawabannya, dan saya tidak percaya bahwa saya sengaja menemukannya. (Saya sudah terbiasa dengan itu tetapi lupa tentang hal itu)

Tetapi ini tidak berhasil, karena =>harus pada baris yang sama dengan argumen. Untungnya, saya memiliki ide untuk membungkus sesuatu yang serupa dalam sebuah string dan memasukkan eval pada input saya untuk menguranginya menjadi satu baris, menghasilkan jawaban akhir saya. Setelah eval dalam input terjadi, berikut ini dihasilkan sebagai string (yang kemudian dievaluasi ke suatu fungsi dan kemudian jalankan):

_=>"Hello, World!"+`
`

Ini sangat sulit untuk dipecahkan, tetapi pada akhirnya saya berhasil.

Juga, retak pertama!


3

Secara kubik oleh MD XF

Saya membayangkan ini selalu berbahaya, tetapi saya pikir saya memiliki celah, sambil menunggu bahwa saya benar karena ada bug pada juru bahasa (yang baru saja saya susun).

Masukan saya

0 1 0 1 0 1 0 1 1 0 1 0 0

Output Hello, World!\n\n\n\n\n\n\n\n\n\n.....dengan baris baru tanpa akhir.

Tapi saya perhatikan bagian terakhir dari kode:

:1/1+1$(@6)7

mengatur notepad ke 0x0A(baris baru) dengan cara yang menakutkan, membaca input ke wajah 7 (wajah input), dan kemudian mencetak 6 wajah (wajah notepad) berulang kali hingga 7 wajah adalah nol. Jika Anda mengatur wajah 7 ke nol, Anda hanya akan mendapatkan satu baris baru. Namun, saya mendapat baris baru tanpa batas dan input ke-13 saya nol, dan saya dapat memverifikasi bahwa 7 wajah selalu nol dengan memasukkan "nomor cetak dari 7 wajah" di loop:

:1/1+1$(@6%7)7

kemudian mencetak \n0pasangan yang tak berujung .

Saya melihat spesifikasi pada halaman cubith github dan perilaku ini sangat mirip bug. Mengubah karakter terakhir dari program asli dari 7menjadi 0hasil dalam perilaku yang diharapkan. Penerjemah TIO menunjukkan perilaku salah yang sama.


Harus diperbaiki sekarang, segera setelah Dennis menarik Cubically itu akan diperbaiki pada TIO.
MD XF


2

C # (.NET Core) , Grzegorz Puławski

Solusi yang saya temukan sangat memanfaatkan karakter yang tidak patut dicetak, jadi upaya menempelkannya di sini tidak berfungsi dengan baik. Nilai byte untuk input adalah:

109, 89, 4, 121, 3, 11, 8, 29, 37, 38, 27, 25, 72, 4, 4, 4, 3, 3, 3, 4, 4, 37, 3, 27, 4, 3

Atau versi string tersedia di bidang input dari tautan TIO.

Cobalah online!

Program asli akan mengambil karakter yang berbeda dalam input, lalu membalikkan input dan mengalikan elemen dari dua daftar. Jadi saya membuat string sepanjang 26 karakter di mana 13 karakter pertama berbeda, 13 karakter terakhir semuanya juga muncul di 13 karakter pertama, dan setiap pasangan indeks [i, 26-i]dikalikan dengan nilai byte dari karakter ke-i di Hello, World!.


Kerja bagus! Anda berhasil menghilangkan jebakan Take (a.First () - 33). Itu juga membuat saya sadar bahwa saya lupa Disctinct on the Reverse, tapi oh well, saya tetap membuat tantangan yang bagus. Juga memiliki% 255 sehingga Anda dapat menggunakan angka yang lebih tinggi, dalam ASCII yang dapat dicetak.
Grzegorz Puławski

2

Ly , LyricLy

n[>n]<[8+o<]

2 25 92 100 106 103 79 24 36 103 100 100 93 64

Coba di sini (walaupun halaman tidak membuat baris baru).

nmengambil input, mencoba untuk membagi spasi dan melemparkan ke int, ini bisa diletakkan di stack. omencetak poin ordinal, dan 8+melakukan apa yang dipikirkan orang. Jadi input harus 8 lebih sedikit dari codepoint dalam urutan terbalik dengan spasi.


Ini tidak mencetak baris baru, bukan?
LyricLy

Ah oops, mudah diperbaiki!
Jonathan Allan

... sebenarnya itu? Saya akan berpikir 2akan berhasil - apakah itu hanya halaman herokuapp yang tidak merendernya?
Jonathan Allan

1
Ya, menambahkan 2 karya. Halaman itu tidak membuat garis akhir baris.
LyricLy

2

C (gcc), oleh Felix Palmen

Kode asli:

#define O(c)(((char**)v)+c)
#define W(c)*(O(c)-**O(2)+x)
main(x,v){puts(W(42));}

Argumen:

"Hello, World!" ","

Cobalah online!

Penjelasan:

W(c)menghitung alamat string dari daftar argumen untuk dicetak. Dimulai dengan alamat argumen cth ( O(c)), yang merupakan argumen ke-42 dalam kasus ini, dan kemudian kurangi karakter pertama dari argumen kedua ( **O(2)) sebagai offset bilangan bulat, dan kemudian menambahkan x, yang merupakan jumlah argumen.

W(c)menggunakan argumen kedua, jadi Anda tahu harus ada setidaknya 3 dari mereka (0, 1, 2). Lalu "Halo, Dunia!" bisa masuk dalam argumen pertama, dan kemudian untuk mengatasi argumen itu Anda memerlukan karakter yang nilai ASCII-nya sesuai dengan persamaan "42-x + 3 = 1". Itu kebetulan ",".


Penjelasan hebat, saya akan mengedit posting saya segera setelah saya menggunakan PC :)
Felix Palmen

2

JavaScript: ThePirateBay

Saya menimpa valueOf()dan toString()metode objek diurai sehingga paksaan gagal dengan a TypeError.

{"valueOf": 7, "toString": 7}

12
Umm, sepertinya aku tidak mengerti. Tolong jelaskan atau sesuatu? Terutama bagian dalksdjalkdjaS djalksdjalksdja , agak membingungkan saya.
Erik the Outgolfer

@EriktheOutgolfer Saya mengedit bagian spam, tapi saya tidak tahu mengapa itu ada di sana.
NoOneIsHere

@EriktheOutgolfer oh lol. Itu berlalu untuk menghentikan jawaban saya dari konversi otomatis ke komentar.
Maltysen

1
@Maltysen Yah ada tombol edit di sana yang dapat berguna lain kali;)
Erik the Outgolfer

2

6502 Assembly (C64) - Felix Palmen

Jawaban yang benar adalah, 52768,23

Penjelasannya sedikit terlibat.

00 c0                          ;load address
20 fd ae      jsr $aefd        ; checks for comma
20 eb b7      jsr $b7eb        ; reads arguments

Kode pertama memeriksa koma (keharusan sintaksis) dan kemudian membaca dalam dua argumen, yang pertama adalah KATA, disimpan little-endian di lokasi memori 0014 dan 0015, yang terakhir disimpan dalam register X.

8a              TXA            ;Store second argument into A (default register)
0a              ASL            ; bitshifts the second argument left (doubles it)
45 14           EOR $14        ; XOR that with the low byte of first argument
8d 21 c0        STA $c021      ; Drop that later in the program

Itu cukup pintar, menggunakan input kami untuk menulis ulang program. Ini akhirnya menulis ulang penghitung untuk loop keluaran di akhir program.

45 15           EOR $15        ; XOR that with the high byte of the first argument
85 15           STA $15        ; Put the result in $15
49 e5           EOR #$e5       ; XOR that with the number $e5
85 14           STA $14        ; Put that in $14

Inilah bagian yang licik:

8e 18 d0        STX $d018      ; stores the original second argument in d018

pada C64, d018 adalah byte yang sangat penting. Ini menyimpan titik referensi untuk hal-hal yang melibatkan keluaran layar. Lihat di sini untuk info lebih lanjut. Jika ini mendapatkan nilai yang salah, itu akan merusak C64 Anda. Untuk mencetak campuran huruf besar dan kecil yang diperlukan, ini harus $ 17.

Sekarang kita mulai loop output kami:

a0 00               ldy #$00       ; zeroes out the Y register
b1 14               lda ($14),y    ; puts the memory referenced by the byte
                                   ;   starting at $14 (remember that byte?)
                                   ;   into the default register
20 d2 ff            jsr $ffd2      ; calls the kernal routine to print the char stored in A
c8                  iny            ; increment Y
c0 0e               cpy #$0e       ; test for equality with the constant $0e

Konstanta itulah yang ditulis sebelumnya. Ini dengan jelas menentukan berapa lama loop berjalan. Itu sudah merupakan nilai yang tepat, tetapi kita perlu tetap 0e di sana lagi.

d0 f6                   bne *-8        ; jump back 8 bytes if y and that constant weren't equal
60                      rts            ; ends the program

Sisanya hanyalah informasi yang perlu kita cetak, mulai dari alamat memori c025.

Jadi hanya mengikuti matematika dari sana.


Benar sekali, selamat. Mungkin perlu waktu beberapa saat untuk mengedit posting saya dengan benar, saya sekarang di ponsel.
Felix Palmen

D018 sangat pintar, dan saya suka bagaimana Anda mengirim petunjuk secara diam-diam.
Seorang Pria Emas

d018 adalah pembuka pintu yang dimaksudkan ... isyarat itu tidak disengaja, maksudku di $FFsana, tetapi kemudian memutuskan untuk meninggalkannya.
Felix Palmen

2

6502 Kode Mesin (C64) - Felix Palmen

Jawaban yang benar adalah

8bahkan cukup

Kode ini agak rumit, melibatkan banyak modifikasi diri. Jadi, alih-alih merekayasa balik sepenuhnya, Anda bisa menggunakannya untuk memecahkannya sendiri.

Berikut ini adalah pembongkaran kode yang sedikit lebih membantu, untuk membantu memahami apa yang terjadi. Sintaksnya adalah untuk KickAssembler.

*=$c000       // LOAD ADDRESS
jsr $aefd     //checks for a comma
jsr $ad9e     /*Reads in an argument. Stores length of it into
                $61, with the address of the stored arg in $62-3*/
jsr $b6a3     /*Evaluates the string, leaving the pointer on $22-3
                and the length on A*/ //I think

ldy #$00
loop: lda thedata,y   
cpy #$01
beq shuffle
cpy #$07
beq shuffle
cpy #$0b
beq shuffle
tricks: jsr output
iny
bne loop
output: eor ($22),y      //XOR's A with the y-eth letter of our input
jmp $ffd2               //good old CHROUT, returns to tricks above
thedata: .byte $f0,$48,$fa,$a2, $1c,$6d,$72,$30
.byte $06,$a9,$03,$48,$7c,$a3
shuffle: sta $c048      //drops A in mystery+4, over the constant
lda $c026,y
sta $c045               //overwrites the low byte of mystery
lda $c027,y
sta $c046               //overwrites the high byte of mystery
ldx #$00
mystery: lda $aefd,x              
eor #$23
jsr output
iny
inx
cpx #$03
bne mystery
cpy #$0e
bne loop
eor #$1a
sta $d018                
rts

Memberi label seperti ini sudah cukup bagi saya untuk melihat bahwa kode XOR adalah sekelompok konstanta yang disembunyikan untuk mencetak apa yang kita butuhkan. Karena XOR adalah reversibel, jika Anda memasukkan output yang diinginkan, itu akan memberi tahu Anda apa kuncinya.

Jadi saya mengganti baris terakhir

/*from sta $d018 
to*/ jsr $ffd2

jadi itu akan mencetak input yang diperlukan terakhir alih-alih menabrak input yang salah.

Dan itu dia!

Jika ada minat, saya akan memecahkan kode lagi.


Wow, ini sebenarnya jalan pintas yang sangat besar, saya mungkin seharusnya memaksa crash pada input yang salah sebelumnya dalam pemrosesan. Ada cara pintas lain yang mungkin dilakukan dengan menggunakan debugger dari vice. Tapi apapun itu, itu solusi yang tepat.
Felix Palmen

Saya tidak tahu bahwa wakil memiliki debugger. Inilah yang saya dapatkan untuk belajar bahasa hanya untuk memecahkan jawaban.
Seorang Pria Emas

Mengedit posting saya, dengan beberapa penjelasan. Kerja bagus, hanya memodifikasi program agar tidak crash tentu saja merupakan cara yang cukup jelas, saya tidak memikirkan hal ini.
Felix Palmen

Nitpick: " drops A in mystery+1, over the constant" <- itu sebenarnya mystery+4dengan label Anda. Offests berada dalam byte :) dan FWIW, modifikasi diri cukup umum bahkan dalam kode 6502 yang serius , selama kode tersebut berjalan dari RAM.
Felix Palmen

1

Meledak , Langkah Hen

@_?&4_-j>5&f^~c>&6\|4>7

Rh / qi?, Wcr + du

Cobalah online!

  • Mencoba mencari tahu apa yang sebenarnya dilakukan oleh semua "penjelajah" terlalu menyakitkan kepala, jadi saya hanya merekayasa baliknya (secara harfiah: p - mulai dari karakter paling kanan saya mengimbangi masing-masing secara bergantian [dan sekitar] rentang karakter yang dapat dicetak) .

Kerja bagus :) Saya akan menambahkan penjelasan dalam beberapa jam ketika saya kembali ke PC saya
Stephen

1

C (tcc) oleh Joshua

int puts(const char *s)
{
    printf("Hello, World!%s", s);
}

Cobalah online!


Menisik. Saya memiliki celah yang tepat ini tetapi tidak bisa membuatnya bekerja di TIO. +1
MD XF

Maaf soal itu. Fwiw sudah diperbaiki sekarang.
Dennis

Apakah Anda tahu apa masalahnya?
MD XF

Saya tahu bagaimana saya memperbaikinya (tcc harus dibangun dengan dukungan SELinux), tetapi saya tidak yakin apa yang dilakukannya atau mengapa itu diperlukan.
Dennis


1

Jelly oleh Jonathan Allan

Kode asli:

œ?“¥ĊɲṢŻ;^»œ?@€⁸ḊFmṪ⁷

Cobalah online!

Memasukkan:

1,2586391,2949273,3312154,3312154,1134001,362881,2223505,766081,1134001,1497601,3312154,1860601.140

Penjelasan:

Terutama, perlu untuk memahami apa yang dilakukan kode. Hal pertama yang dilakukan adalah mengambil string"!,Word Hel"(dengan semua karakter yang diperlukan kecuali baris baru) dan membuat banyak permutasi dari mereka. Input menentukan nomor permutasi, dan setiap pasangan permutasi dari input diterapkan ke string yang tidak termasuk pasangan di mana permutasi pertama diterapkan pertama kali. Pada dasarnya, P2 (P1 (S)), P2 (P2 (S), P2 (P3 (S)), ..., P2 (PN (S)), P3 (P1 (S)), ..., P3 (PN (S)), ... ..., PN (P1 (S)), ..., PN (PN (S)) Semua ini disatukan, lalu input terakhir digunakan kembali untuk mengambil setiap PN karakter dari string besar ini. Jadi, saya mengambil PN = len (S) * N = 10 * N. Ini berarti kita akan mengambil karakter pertama dari P2 (P1 (S)), karakter pertama dari P3 (P1 (S) )), sepanjang jalan hingga karakter pertama PN (P1 (S)) .Untuk menyederhanakan lebih lanjut, saya membiarkan P1 = 1 yang merupakan permutasi identitas. Kemudian cukup untuk memilih P2 yang memungkinkan "H" menjadi yang pertama posisi, P3 yang memungkinkan "e" ke posisi pertama dan seterusnya. Untungnya, angka permutasi kecil seperti yang sudah dipilih untuk PN tidak mempengaruhi karakter sebelumnya dalam string, jadi PN meninggalkan "!" di awal string. (Jika ini tidak benar, itu masih mungkin untuk diselesaikan dengan memilih P1 yang berbeda.)


Dibutuhkan 14 permutasi dari daftar 14 permutasi, meratakan, dequeues dan kemudian mengambil setiap 140 karakter.
Jonathan Allan

1

C (GCC pada TIO) oleh MD XF

4195875

Cobalah online!

Bagaimana?

Mencoba mencetak argumen kedua sebagai string, yang merupakan pointer yang dapat kita tentukan pada input. Kebetulan di memori lokasi 4195875dimulai "Hello, World!\n"string.

Angka ditentukan dengan menambahkan print("%p", "Hello, World!");sebelum printf, mengubah angka heksadesimal menjadi desimal dan mencobanya pada TIO asli. Namun, itu menunjukkan saya printfformat string. Dengan mencoba beberapa angka, saya menemukan bahwa string terletak sebelum format string.

Jadi dalam memori, akan terlihat seperti ini (sebagai string C):

Hello, World!\n\0%2$s\0

Ini juga berarti bahwa setiap pembaruan ke kompiler dapat merusak solusi.






1

JavaScript (ES6), Voile

Mengingat batas 81 karakter, ini mungkin bukan solusi yang dimaksudkan

global.g = ()=>"Hello, World!";
var str = "g";

Cobalah online!


Genious. melewati satu string char dengan manipulasi global. Tampaknya, itu dimaksudkan solusi
Евгений Новиков

Itu bukan solusi yang dimaksudkan :(
Voile

Sekarang saya berpikir tentang hal itu, saya tidak berpikir itu diperbolehkan untuk melakukan banyak hal seperti ini sebelum melewati input dalam suatu fungsi, kecuali hal-hal tersebut juga dapat dikomposisikan sebagai bagian dari input (misalnya di dalam fungsi yang akan menjadi dievaluasi di dalam), karena tantangan mengharuskan Anda untuk membuat input yang akan menghasilkan 'Halo, Dunia!', bukan program lengkap. Kalau tidak, tidak ada yang bisa aman. Jadi saya pikir celah ini mungkin tidak valid?
Voile

@ Voile Sangat mungkin. Saya pikir itu adil untuk membaca tugas seolah-olah input harus berdiri sendiri (yaitu tanpa perubahan pada sistem eksternal) - terutama jika ini bukan solusi yang dimaksudkan :) Tidak perlu menandai polisi Anda sebagai crack.
Birjolaxew

1
Saya telah membuat posting meta yang membahas tentang ini. Jangan ragu untuk meninggalkan beberapa diskusi di sana.
Voile
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.