"Привіт Світ!" (Розбійнича нитка)


11

Це нитка розбійників. Поліцейські нитки тут .

Ваша задача полягає в тому, щоб зняти незавершене подання з нитки копів і знайти, на які входи чи входи програма надрукує Hello, World!і новий рядок. Великі літери, пробіли та пунктуація повинні бути точними.

Будь ласка, прокоментуйте подання поліції, коли ви зламали їх код.

Відповіді:


12

Баш від Сизіфа

Оригінальний код:

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

Вхід:

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

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

Пояснення:

Це кодує "Ехо Привіт, світ!" як восьмеричні послідовності втечі (\ xxx).

Крім того, що ви також не можете використовувати числа, тому перша частина створює змінні для чисел 0-7. Ви можете використовувати їх для створення рядка з восьмеричними послідовностями, які будуть оцінені, щоб дати вам фактичну команду.

Але evalтакож буквено-цифровий. Отже, замість цього, це рядки, що рядок як вхід до іншого примірника bash. $0містить ім'я команди, яка використовується для виклику Bash, яка зазвичай є просто bash(або -bashдля оболонки для входу), якщо ви її запускаєте нормально (через TIO або вставляючи її в термінал). (Це, до речі, означає, що якщо ви спробуєте запустити це, вставивши його в сценарій, все піде жахливо неправильно, оскільки він намагається розщедрити купу разів.)

Але все одно сказати $0прямо не можна . Замість цього, $__містить ім'я з $0( «0»), і ви можете використовувати непряме розширення для доступу до нього ( ${!__}відноситься до змісту $0).

І це, нарешті, дає всі необхідні вам шматки.


Ласкаво просимо до головоломки програмування та коду для гольфу! Я залишив коментар до відповіді поліцейського. TIO посилання для зацікавлених: tio.run/##jc/…
Денніс

Приємно! Моє рішення виглядало по-іншому, але використовував ту саму ідею - побудувати восьмеричний рядок і використовувати синтаксис єдиної цитати в доларі та використовувати непряму. Молодці =)
Сизіф




3

Желе: EriktheOutgolfer

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

Желе , 11 байт

sLƽ$Xṙ5O½Ọ

Спробуйте в Інтернеті!

Пояснення

Вихідний код можна пояснити як такий:

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

Отже, просто візьміть "Привіт, світ!" і отримайте кодові точки, покладіть їх на квадрат, поверніть до кодових точок, 5 разів обертайте їх, а потім вирівнюйте результат і вирівнюйте результат.


3

Октава Стюі Гріффін

Не впевнений, чи це правильне рішення (на TIO він друкує \00символ), але в моїй octave-cliоболонці це виглядає так:

Октавна оболонка

Також в оригінальному виклику написано нічого не друкувати (або нульового символу) , тож якщо нічого не є таким, як \00тоді, це має бути добре.

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

Спробуйте в Інтернеті!



Але це не те, як виглядає виклик, якщо так, то мені було б набагато простіше (замінити останнє 0на а 10).
ბიმო

@BruceForte Те є те , що просить виклик: «Ваше завдання полягає в тому, щоб написати програму або функцію , яка, з певним входом, друкує точну рядок Hello, World!і символ нового рядка.» - точна цитата виклику. І справді, це робить відповідь тривіальною.
hvd

@hvd Так, але якщо ви подивитесь на зображення ОП, його рішення не відповідає, саме звідси випливає головна плутанина.
ბიმო

1
@HyperNeutrino FWIW - це те, на що я думаю, призначений стиль рішення.
Джонатан Аллан


3

JavaScript (ES6) Ефелон Данцлер

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

Спробуйте в Інтернеті!

Це було досить просто.

Я помітив, що будь-які введення рядків неможливо буде вивести, Hello, World!тому що все, що знаходиться всередині, String.fromCharCodeповерне лише кратні 4, і !має char код 33. Тож явно нам просто потрібно зламати всю програму. Зловмисні вбудовані в JavaScript тривіальні, якщо їх не намагаються зупинити (і навіть якщо це робиться, зазвичай існує багато обхідних шляхів ...).


3

JavaScript (ES6), Voile

Простий проксі-сервер, який повертає шуканий символ лише кожен 3-й раз, коли він викликається.

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

Спробуйте в Інтернеті!


2
Так, це призначене рішення :) Проксі потрібно більше любові.
Voile

3

Рубі, Гістократ

Магічний вхід: 1767707618171221 30191World!

Спробуйте в Інтернеті.

Пояснення:

  • число 1767707618171221є простим, і, написане в базі 36, це "hello". При великій літери це створює "Hello", що друкується за допомогою$><<
  • рядок $><<", #$'"if/30191/шукає число 30191у введенні та пише для викреслення рядка, що складається з коми, пробілу та всього, що є у введенні після 30191(використовуючи $POSTMATCH, що тут посилається на його короткий варіант $').

3

Lua 5.1 від tehtmi

Передайте це як перший аргумент:

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

Припустимо, що початковий код знаходиться у файлі tehtmi.lua, запустіть (у bash чи подібній оболонці):

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

Він також працює на Lua 5.3, для чого використовується TIO, тож чому б не спробувати його в Інтернеті ? Я не пройшов тестування на застосуванні, яке використовує ядро ​​"LUCA 5.1" PUC-Rio (тому що я не можу реально знайти будь-яку інформацію), але моє рішення, ймовірно, також працює там.

Як?

Він запускає перший аргумент у вигляді коду, але лише якщо він містить менше 5 малих символів.

Хитрість - бігти print("Hello, World!"). Інший спосіб, яким це можна запустити, - це використання _G["print"]("Hello, World!"), яке використовує лише рядки.

Але ми не можемо використовувати рядок безпосередньо через обмеження в малому регістрі, проте ви можете запустити ("").charфункцію string.char, яка може перетворити з ряду байтів у рядок. Я призначив її для великої великої величини (щоб ми не досягли межі), щоб ми могли використовувати її для побудови printі Hello, World!рядків, і рядків, які можна використовувати як вище.


Ах, молодець! Я думав використовувати, nextзамість charякого не працює Lua 5.3 через рандомізацію порядку ітерації.
tehtmi

3

JavaScript (ES6) від Voile

Введіть рядок, що містить:

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

Спробуйте це:

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

Якщо ви не переймаєтесь вимогою до нового рядка для виводу, ви можете замінити останні 6 рядків цим:

!"
`)

Як я це зробив

Обмеженнями на вході є те, що це рядок, кожен рядок має два байти або менше, а також загальна довжина становить 80 байт або менше. Моя перша спроба, зрозумівши, що правильно, була така:

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

Примітка: \s повинні ігнорувати нові рядки в рядку на вході. Це надзвичайно важливо для відповіді, і я не можу повірити, що я натрапив на неї випадково. (Я був із цим знайомий, але забув про це)

Але це не спрацювало, оскільки =>повинно бути на тій же лінії, що і аргументи. На щастя, у мене виникла ідея загортати щось подібне в рядок і додавати eval у моєму вкладі, щоб зменшити його до одного рядка, в результаті чого я отримав остаточну відповідь. Після того, як відбувається eval на вході, створюється наступне як рядок (який потім eval'd до функції, а потім запускається):

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

Це було справді важко зламати, але мені це вдалося врешті-решт.

Крім того, перша тріщина коли-небудь!


3

Кубічно MD XF

Я думаю, що це завжди небезпечно, але я думаю, що у мене є тріщина, до того, як я маю рацію в тому, що в інтерпретаторі є помилка (яку я тільки що склав).

Мій внесок

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

Вихід має Hello, World!\n\n\n\n\n\n\n\n\n\n.....нескінченні нові рядки.

Але я помітив останній розділ коду:

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

жахливо встановлює блокнот 0x0A(новий рядок), читає введення на обличчя 7 (обличчя вводу), а потім друкує 6 обличчя (обличчя блокнота), поки 7 обличчя не дорівнює нулю. Якщо ви встановите обличчя 7 на нуль, вам слід отримати лише один новий рядок. Однак я отримав нескінченні нові рядки і мій 13-й вхід був нульовим, і я можу перевірити, що 7 грань завжди дорівнює нулю, вставивши в циклі "номер друку з 7 обличчя":

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

тоді він друкує нескінченні \n0пари.

Я дивлюся на характеристики на кубічно github сторінці, і така поведінка виглядає дуже жахливо, як помилка. Зміна останнього символу початкової програми з " 7на" на 0результат у очікуваній поведінці. Інтерпретатор TIO виявляє таку ж неправильну поведінку.


Потрібно виправити зараз, як тільки Денніс витягне кубічно, він буде закріплений на TIO.
MD XF


2

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

Я знайшов рішення, яке дуже істотно використовує недруковані символи, тому спроба вставити його тут не вдалася. Значення байтів для введення:

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

Або версія рядка доступна у полі введення посилання TIO.

Спробуйте в Інтернеті!

Оригінальна програма прийме різні символи у вводі, потім переверне введення та помножить елементи двох списків. Таким чином, я створив рядок довжиною в 26 символів, де перші 13 символів були різними, останні 13 символів також з'явилися в перші 13, і кожна пара індексів [i, 26-i]помножена на значення байтів i-го символу в Hello, World!.


Чудова робота! Вам вдалося опустити пастку Take (a.First () - 33). Це також змусило мене зрозуміти, що я забув Discinct on the Reverse, але о, ну все ж таки зроблений для приємного виклику, я думаю. Також він мав% 255, щоб ви могли використовувати більш високі цифри, для друку ASCII.
Grzegorz Puławski

2

Ly , LyricLy

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

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

Спробуйте тут (хоча на сторінці не відображається новий рядок).

nбере введення, намагається розділити на пробіли та передати на ints, вони ставляться на стек. oдрукує порядкові точки і 8+робить те, що можна було б подумати. Отже, введення має бути на 8 менше, ніж кодових точок у зворотному порядку, розділених пробілами.


Це не друкує останній новий рядок, чи не так?
LyricLy

Ах, ой, легко піддається виправленню!
Джонатан Аллан

... насправді це? Я б міг подумати, що 2це спрацює - це просто сторінка herokuapp не відображає її?
Джонатан Аллан

1
Так, додавши 2 роботи. На цій сторінці просто не відображаються нові рядки.
LyricLy

2

C (gcc), Фелікс Палмен

Оригінальний код:

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

Аргументи:

"Hello, World!" ","

Спробуйте в Інтернеті!

Пояснення:

W(c)обчислює адресу рядка зі списку аргументів для друку. Він починається з адреси cth аргументу ( O(c)), який в даному випадку є 42-м аргументом, а потім віднімає перший символ другого аргументу ( **O(2)) як ціле зміщення, а потім додає x, яка є кількістю аргументів.

W(c)використовує другий аргумент, тож ви знаєте, що їх має бути принаймні 3 (0, 1, 2). Тоді "Привіт, світ!" можна перейти в перший аргумент, а потім для вирішення цього аргументу потрібен символ, значення якого ASCII вписується в рівняння "42-x + 3 = 1". Це трапляється ",".


Чудове пояснення, я відредагую свій пост, як тільки я буду на ПК :)
Фелікс Палмен

2

JavaScript: ThePirateBay

Я переосмислюю valueOf()і toString()методи проаналізованих об'єктів, щоб примус не спрацьовував із a TypeError.

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

12
Гм, я, здається, не розумію. Будь ласка, докладно чи щось? Особливо частина dalksdjalkdjaS djalksdjalksdja , це мене дещо бентежить.
Erik the Outgolfer

@EriktheOutgolfer Я відредагував спам-частину, але поняття не маю, чому це було саме там.
NoOneIsHere

@EriktheOutgolfer о, хаха. Це минуло, щоб зупинити мою відповідь від автоматичного перетворення на коментар.
Мальтісен

1
@Maltysen Ну там є кнопка редагування, яка може бути корисна наступного разу;)
Ерік the Outgolfer

2

6502 Асамблея (C64) - Фелікс Палмен

Правильна відповідь - 52768,23

Пояснення трохи пов'язане.

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

Код спочатку перевіряє наявність коми (необхідність синтаксису), а потім читає у двох аргументах, перший з яких є СЛОВО, що зберігається малопомітним у місцях пам'яті 0014 та 0015, останній з яких зберігається в реєстрі 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

Це досить розумно, використовуючи наш вклад для перезапису програми. Врешті-решт переписує лічильник вихідного циклу в кінці програми.

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

Ось приходить хитра частина:

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

на C64, d018 - це дуже важливий байт. Він зберігає опорні точки для речей, що стосуються виводу екрана. Дивіться тут для отримання додаткової інформації. Якщо це отримає неправильне значення, воно зірве ваш C64. Щоб надрукувати необхідні змішані великі та малі літери, це потрібно 17 доларів.

Тепер ми починаємо наш вихідний цикл:

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

Ця константа - це те, про що писали раніше. Це чітко визначає, як довго проходить цикл. Це вже є правильним значенням, але нам потрібно знову вставити 0e.

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

Решта - це лише інформація, яку нам потрібно роздрукувати, починаючи з адреси пам'яті c025.

Тож це лише слідування математиці звідти.


Абсолютно правильно, вітаю. Може зайняти трохи часу, щоб правильно відредагувати свою публікацію, я зараз на мобільному телефоні.
Фелікс Палмен

D018 був дуже розумним, і мені подобається, як ви таємно розміщували підказку.
Золота людина

d018 був призначеним відкривачем дверей ... натяк був випадковим, я мав на увазі $FFтам, але потім вирішив залишити його.
Фелікс Палмен

2

6502 Код машини (C64) - Фелікс Палмен

Правильна відповідь

8bitsareenough

Код є досить складним, він включає багато змін, що змінюються. Тож замість повністю реверсивної інженерії це можна просто використовувати, щоб зламати себе.

Ось трохи корисніше розбирання коду, щоб зрозуміти, що сталося. Синтаксис призначений для 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

Позначивши це так, мені було достатньо, щоб я побачив, що код XOR містить купу констант, які ховаються навколо, щоб роздрукувати те, що нам потрібно. Оскільки XOR є оборотним, якщо ви введете потрібний вихід, він підкаже, що є ключем.

Тому я переключив останній рядок

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

тож він би надрукував останній необхідний вклад замість збоїв на неправильному введенні.

І ось це!

Якщо є інтерес, я зламаю код більше.


Ого, це насправді величезна ярлика, я, мабуть, повинен був змусити збій при неправильному введенні раніше в обробці. Був ще один ярлик можливий btw, використовуючи налагоджувач vice. Але як би там не було, це правильне рішення.
Фелікс Палмен

Я не знав, що у пороку є налагоджувач. Це те, що я отримую за вивчення мови просто для того, щоб зламати відповіді.
Золота людина

Редагував мою публікацію, з деякими поясненнями. Хороша робота, просто змінити програму, щоб не збій, звичайно, це досить очевидний спосіб, я не думав про це.
Фелікс Палмен

Nitpick: " drops A in mystery+1, over the constant" <- це насправді mystery+4з вашим лейблом. Посилення в байтах :) та FWIW, самомодифікація є досить поширеною навіть у серйозному коді 6502, доки код працює з оперативної пам'яті.
Фелікс Палмен

1

Вибухнути , крок курець

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

Rh / qi?, Wcr + du

Спробуйте в Інтернеті!

  • Намагаючись розібратися, що насправді роблять усі "дослідники", болить голова занадто сильно, тому я просто розробив це (буквально: p - починаючи з правого правого символу, я зміщую кожного по черзі по [і навколо] діапазону символів для друку) .

Хороша робота :) Я додаю пояснення через пару годин, коли я знову за своїм ПК
Стівен

1

C (tcc) Джошуа

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

Спробуйте в Інтернеті!


Дарн. У мене була така точна тріщина, але я не міг змусити її працювати над TIO. +1
MD XF

Вибачте, але це. Fwiw це виправлено зараз.
Денніс

Чи знаєте ви, в чому проблема?
MD XF

Я знаю, як я це виправив (tcc мав бути побудований за допомогою підтримки SELinux), але я не впевнений, що це робить або для чого це було потрібно в першу чергу.
Денніс


1

Желе Джонатана Аллана

Оригінальний код:

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

Спробуйте в Інтернеті!

Вхід:

1,2586391,2949273,3312154,3312154,1134001,362881,2223505,766081,1134001,1497601,3312154,1860601,140

Пояснення:

Головним чином, потрібно зрозуміти, що робить код. Перше, що він робить - це взяти рядок"!,Word Hel"(з усіма необхідними символами, крім нового рядка) і створює купу перестановок з них. Входи задають номери перестановки, і кожна пара перестановок з входу застосовується до рядка, що виключає пари, де перша перестановка застосовується першою. В основному P2 (P1 (S)), P2 (P2 (S), P2 (P3 (S)), ..., P2 (PN (S)), P3 (P1 (S)), ..., P3 (PN (S)), ... ..., PN (P1 (S)), ..., PN (PN (S)). Вони всі об'єднані разом. Потім останній вхід повторно використовується для прийняття кожного PNth символу з цієї великої струни. Отже, я беру PN = len (S) * N = 10 * N. Це означає, що ми візьмемо перший символ P2 (P1 (S)), перший символ P3 (P1 (S) )), аж до першого символу PN (P1 (S)). Щоб спростити далі, я дозволю P1 = 1, що є перестановкою тотожності. Тоді достатньо вибрати будь-який P2, який перетворює "H" в перший положення, P3, який переставляє "e" у перше положення тощо. На щастя, невеликі перестановочні номери на зразок того, що вже було вибрано для PN, не впливають на більш ранні символи в рядку, тому PN залишає "!" на початку рядка. (Якщо це не було правдою, це все одно можна було б вирішити, вибравши інший P1.)


Він займає 14 перестановок у списку з 14 перестановок, вирівнюється, декуе, а потім приймає кожні 140 символів.
Джонатан Аллан

1

C (GCC на TIO) MD XF

4195875

Спробуйте в Інтернеті!

Як?

Він намагається друкувати другий аргумент у вигляді рядка, який є вказівником, який ми можемо визначити на вході. Так буває, що в пам'яті локації 4195875починається "Hello, World!\n"рядок.

Число визначали додаванням print("%p", "Hello, World!");перед printf, перетворюючи шістнадцяткове число в десяткове і випробуваним на початковому TIO. Однак він показав мені printfрядок формату. Спробувавши деякі числа, я виявив, що рядок розташований перед рядком формату.

Тож у пам'яті це виглядатиме так (як рядок C):

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

Це також означає, що будь-яке оновлення компілятора може порушити рішення.






1

JavaScript (ES6), Voile

Зважаючи на обмеження 81 символу, це, мабуть, не призначене рішення

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

Спробуйте в Інтернеті!


Геніальний. проходження однієї лінійки з глобальною маніпуляцією. Здається, що це задумане рішення
Євгеній Новиков

Це не призначене рішення :(
Voile

Тепер, коли я думаю про це, я не думаю, що дозволено робити такі речі, як це, перш ніж передавати вхід у функцію, якщо тільки зазначений матеріал також не може бути складений як частина вводу (наприклад, всередині функції, яка буде оцінюється всередині), оскільки виклик вимагає зробити внесок, який призведе до "Привіт, світ!", а не до повноцінної програми. Інакше майже нічого не може бути безпечним. Тож я думаю, що ця тріщина може бути недійсною?
Voile

@Voile Це дуже добре може бути. Я думаю, що цілком справедливо читати завдання так, ніби вхід повинен стояти окремо (тобто без змін у зовнішній системі) - особливо якщо це не призначене рішення :) Не потрібно відзначати вашому поліцейському зламане.
Birjolaxew

1
Я зробив мета-пост, обговорюючи це. Не соромтесь залишити там деякі дискусії.
Voile
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.