"Selam Dünya!" (Soyguncunun ipliği)


11

Bu soyguncuların iş parçacığı. Polislerin konusu burada .

Zorluk, polisin iş parçacığından kopuk bir sunum almak ve hangi girdi veya girdiler için programın yazdırılacağını Hello, World!ve yeni bir satır bulmaktır . Büyük harf kullanımı, boşluk ve noktalama işaretleri tam olmalıdır.

Lütfen kodunu kırdığınızda polisin başvurusu hakkında yorum yapın.

Yanıtlar:


12

Bash Sisyphus tarafından

Orijinal kod:

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

Giriş:

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

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

Açıklama:

Bu "yankı Merhaba Dünya!" sekizli kaçış dizileri olarak (\ xxx).

Dışında sayı kullanamazsınız, bu yüzden ilk bölüm 0-7 sayıları için değişkenler oluşturur. Bunları, size gerçek komutu vermek üzere değerlendirilecek sekizli dizileri olan bir dize oluşturmak için kullanabilirsiniz.

Ancak evalalfasayısaldır. Yani bunun yerine bu dizeyi başka bir örneğine girdi olarak bağlar bash. $0Bash'i çağırmak için kullanılan komutun adını içerir bash( normalde (veya -bashbir giriş kabuğu için) normal olarak çalıştırıyorsanız (TIO aracılığıyla veya bir terminale yapıştırarak). (Bu tesadüfen, bunu bir senaryoya yapıştırarak çalıştırmaya çalışırsanız, bir sürü kez çatallamaya çalıştıkça işler korkunç bir şekilde yanlış gidecek demektir.)

Neyse, $0doğrudan söyleyemezsin . Bunun yerine, $__içerdiği ismi arasında $0( "0"), ve bunu (erişmek için dolaylı genişleme kullanabilirsiniz ${!__}içeriğine atıfta $0).

Ve son olarak, ihtiyacınız olan tüm parçaları size veriyor.


Programlama Bulmacaları ve Kod Golf hoş geldiniz! Polisin cevabına bir yorum bıraktım. İlgilenenler için TIO bağlantısı: tio.run/##jc/…
Dennis

Güzel! Çözümüm farklı görünüyordu, ancak aynı fikri kullandı - bir sekizli dize oluşturma ve dolar tek tırnak sözdizimini kullanma ve dolaylı kullanma. Aferin =)
Sisifos

4

05AB1E , Adnan

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

-107

Çevrimiçi deneyin!

Nasıl?

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

Negatif temel ... güzel ...
Outgolfer Erik



3

Jelly: EriktheOutgolfer

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

Jöle , 11 bayt

sLƽ$Xṙ5O½Ọ

Çevrimiçi deneyin!

açıklama

Orijinal kod şu şekilde açıklanabilir:

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

Yani, "Merhaba, Dünya!" ve kod noktalarını alın, kare yapın, kod noktalarına geri dönün, 5 kez sağa döndürün ve ardından sonucu kare ve düzleştirin.


3

Oktav Stewie Griffin tarafından

Bunun doğru çözüm olup olmadığından emin değilim (TIO'da \00karakteri yazdırır ), ancak octave-clikabuğumda şöyle görünür:

Oktav kabuğu

Ayrıca orijinal meydan okumada hiçbir şey (veya null-karakter) yazdırmak diyor , bu yüzden hiçbir şey aynı değilse, \00bu iyi olmalı.

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

Çevrimiçi deneyin!



Ama bu meydan okumaya benzemiyor, eğer öyleyse bu çok daha kolay olurdu (sonuncuyu a 0ile değiştirin 10).
ბიმო

@BruceForte Yani bir meydan okuma sorar: "Buradaki zorluk bir program ya da belirli bir girişi olan, tam dize yazdırır, o fonksiyonu yazmaktır Hello, World!ve Yeni satır." meydan okumadan kesin bir alıntıdır. Ve aslında, bu cevap önemsizdir.
hvd

@hvd Evet, ancak OP görüntüsüne bakarsanız çözümü gelmez, ana karışıklık buradan gelir.
ბიმო

1
@HyperNeutrino FWIW bu ben çözümünün amaçlanan stil olduğunu düşünüyorum şeydir.
Jonathan Allan


3

JavaScript (ES6) Tarafından Ephellon Dantzler

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

Çevrimiçi deneyin!

Bu oldukça kolaydı.

Herhangi bir dize girdilerinin çıktısının mümkün olmadığını fark ettim Hello, World!çünkü içerideki her şey String.fromCharCodesadece 4'ün katlarını döndürecek ve !33 kod koduna sahip olacak. Yani açıkça tüm programı kesmek zorundayız. JavaScript'i yerleşik olarak hacklemek, onları durdurmaya çalışmazsa (ve bunu yapsa bile, genellikle çok sayıda geçici çözüm vardır ...).


3

JavaScript (ES6), Vual

Her 3 çağrıldığında yalnızca istenen karakteri döndüren basit proxy.

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

Çevrimiçi deneyin!


2
Evet, amaçlanan çözüm budur :) Proxy'nin daha fazla sevgiye ihtiyacı var.
Voile

3

Ruby, yazan Histocrat

Sihirli girdi: 1767707618171221 30191World!

Çevrimiçi deneyin.

Açıklama:

  • sayı 1767707618171221asaldır ve taban 36'da yazılmıştır "hello". Büyük harfle yazıldığında "Hello", bu,$><<
  • satır girişteki $><<", #$'"if/30191/sayıyı arar 30191ve virgül, boşluk ve girdiden sonra gelen her şeyden oluşan bir dizgiyi stdout'a yazar 30191( $POSTMATCHburada kısa varyantı tarafından atıfta bulunulan, kullanılarak $').

3

Lua 5.1 tehtmi tarafından

Bunu ilk argüman olarak iletin:

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

Orijinal kodun bir dosyada olduğunu varsayarsak tehtmi.lua, çalıştırın (bash veya benzeri bir kabukta):

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

Ayrıca TIO'nun kullandığı Lua 5.3 üzerinde çalışıyor, neden çevrimiçi denemiyorsunuz ? "PUC-Rio'nun Lua 5.1" çekirdeğini kullanan bir uygulamayı test etmedim (çünkü gerçekten hiçbir bilgi bulamıyorum), ama benim çözümüm muhtemelen orada da çalışıyor.

Nasıl?

İlk bağımsız değişkeni kod olarak çalıştırır, ancak yalnızca 5'ten az küçük karakter içeriyorsa.

İşin püf noktası koşmak print("Hello, World!"). Bunun çalıştırılabilecek başka bir yolu da_G["print"]("Hello, World!") , yalnızca dizeleri kullanan kullanmaktır.

Ancak, küçük harf sayımı kısıtlaması nedeniyle dizeyi doğrudan kullanamayız, ancak bir dizi bayttan dizeye dönüşebilen ("").charişlevi almak için çalıştırabilirsiniz string.char. Ben yukarıdaki gibi kullanılabilir hem de printve Hello, World!dizeleri oluşturmak için kullanabilirsiniz bir büyük harf değişkeni (böylece sınırı vurmak yok) atadı .


Ah, aferin! Kullanmayı düşünüyordumnextcharYineleme sırasının randomizasyonu nedeniyle Lua 5.3 üzerinde çalışmayan bunun yerine .
tehtmi

3

JavaScript (ES6) Voile tarafından

Giriş, aşağıdakileri içeren bir dize olmalıdır:

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

Bunu kullanarak deneyin:

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

Çıktının sondaki yeni satır gereksinimini umursamıyorsanız, son 6 satırı bununla değiştirebilirsiniz:

!"
`)

Nasıl yaptım

Girdi üzerindeki kısıtlamalar, bir dize olması, her satırın iki bayt uzunluğunda veya daha az olması ve toplam uzunluğun 80 bayt veya daha az olmasıdır. Bunu doğru anladıktan sonra ilk denemem şuydu:

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

Not: \ s, girişteki dizgideki yeni satırları yok sayar. Bu, cevap için inanılmaz derecede önemli ve kazayla tökezlediğime inanamıyorum. (Daha önce tanıdım ama unuttum)

Ama bu işe yaramadı, çünkü => argümanlarla aynı çizgide olması gerekiyor. Neyse ki, bir dizeye benzer bir şey sarma ve onu bir satıra indirgemek için girişime bir değerlendirme koymak gibi bir fikrim vardı, bu da son cevabımla sonuçlandı. Girişteki eval gerçekleştikten sonra, bir dize olarak oluşturulur (daha sonra bir işleve değerlendirilir ve çalıştırılır):

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

Bunu kırmak gerçekten zordu, ama sonunda başardım.

Ayrıca, ilk çatlak hiç!


3

kübik olarak olarak MD XF

Bunun her zaman tehlikeli olduğunu düşünüyorum, ancak tercümanda bir hata olması nedeniyle doğru olduğumu bekleyen bir çatlağım olduğunu düşünüyorum (ki şimdi derledim).

Girişim

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

Çıktı Hello, World!\n\n\n\n\n\n\n\n\n\n.....bitmeyen yeni satırlarla.

Ama kodun son bölümünü fark ettim:

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

not defterini 0x0Akorkutucu bir şekilde (satırsonu) olarak ayarlar, girişi 7'ye (giriş yüzü) okur ve sonra 7 yüzü sıfır olana kadar 6 yüzü (not defteri yüzü) tekrar tekrar yazdırır. Yüz 7'yi sıfıra ayarlarsanız, yalnızca bir satırsonu alırsınız. Ancak, sonsuz satırsonu aldım ve 13. girişim sıfır oldu ve döngüye bir "7 yüzden baskı numarası" ekleyerek 7 yüzün her zaman sıfır olduğunu doğrulayabilirim:

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

sonra bitmeyen \n0çiftleri basar .

Ben küp biçiminde github sayfasında özellikleri bakıyorum ve bu davranış bir hata gibi korkunç bir çok görünüyor. Bir orijinal programın son karakteri değiştirme 7a 0beklenen davranış sonuçları. TIO yorumlayıcısı aynı yanlış davranışı gösterir.


Şimdi düzeltilmelidir, Dennis Cubically çeker çekmez TIO'ya sabitlenecektir.
MD XF


2

C # (.NET Çekirdek) , Grzegorz Puławski

Bulduğum çözüm, yazdırılamayan karakterleri çok fazla kullanıyor, bu yüzden buraya yapıştırmaya çalışmak iyi çalışmadı. Giriş için bayt değerleri:

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

Veya dize sürümü, TIO bağlantısının giriş alanında kullanılabilir.

Çevrimiçi deneyin!

Orijinal program girişteki farklı karakterleri alır, ardından girişi tersine çevirir ve iki listenin elemanlarını çarpar. Böylece, ilk 13 karakterin farklı olduğu, son 13 karakterin ilk 13'te de göründüğü 26 karakter uzunluğunda bir dize oluşturdum ve her bir dizin çifti [i, 26-i], i-th karakterinin bayt değeri ile çarpıldı Hello, World!.


İyi iş! Take (a.First () - 33) tuzağını atlamayı başardınız. Ayrıca Tersine Ayrıklığı unuttuğumu fark etmemi sağladı, ama ah, hala güzel bir meydan okuma için yaptım. Ayrıca yazdırılabilir ASCII'de daha yüksek sayılar kullanabilmeniz için% 255 vardı.
Grzegorz Puławski

2

Ly , LyricLy

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

2 25 92100105103 79 24 36103100100 93 64

Burada deneyin (sayfa yeni satırı oluşturmasa da).

ngirdi alır, boşluklara bölünür ve ints dökülür, bunlar yığına konur. osıralı noktalar yazdırır ve 8+ne düşünürse onu yapar. Bu nedenle girdinin, boşluklara bölünerek ters sırada kod noktalarından 8 daha az olması gerekir.


Bu sondaki satırsonu yazdırmaz, değil mi?
LyricLy

Hata! Kolayca düzeltilebilir!
Jonathan Allan

... aslında öyle mi? 2İşe yarayacağını düşünürdüm - sadece herokuapp sayfası bunu oluşturmuyor mu?
Jonathan Allan

1
Evet, 2 eser eklemek. Sayfa yalnızca son satırları oluşturmaz.
LyricLy

2

C (gcc), Felix Palmen tarafından

Orijinal kod:

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

Argümanlar:

"Hello, World!" ","

Çevrimiçi deneyin!

Açıklama:

W(c)yazdırılacak argüman listesinden bir dizenin adresini hesaplıyor. O(c)Bu durumda 42. bağımsız değişken olan cth argümanının ( ) adresi ile başlar ve sonra ikinci bağımsız değişkenin ( **O(2)) ilk karakterini bir tamsayı ofseti olarak çıkarır ve sonra eklerx , bağımsız değişken sayısı olan .

W(c)ikinci argümanı kullanır, bu yüzden bunlardan en az 3 tanesi olması gerektiğini bilirsiniz (0, 1, 2). Sonra "Merhaba Dünya!" ilk argümana gidebilir ve daha sonra bu argümanı ele almak için ASCII değeri "42-x + 3 = 1" denklemine uyan bir karaktere ihtiyacınız vardır. Bu "," olur.


Harika bir açıklama, bir PC'ye gelir gelmez yazımı düzenleyeceğim :)
Felix Palmen

2

JavaScript: ThePirateBay

Ben zorla a başarısız böylece ayrıştırılmış nesnelerin valueOf()ve toString()yöntemleri geçersiz kılar TypeError.

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

12
Hmm, anlayamıyorum. Lütfen detaylandırın falan? Özellikle dalksdjalkdjaS djalksdjalksdja kısmı, biraz kafa karıştırıyor.
Outgolfer Erik

@EriktheOutgolfer Spam bölümünü düzenledim, ama neden orada olduğu hakkında hiçbir fikrim yok.
NoOneIsHere

@EriktheOutgolfer oh lol. Bu, cevabımın otomatik olarak bir yoruma dönüşmesini durdurmak için geçiyordu.
Maltysen

1
@Maltysen Peki orada bir dahaki sefere yararlı olabilecek bir düzenleme düğmesi var;)
Outgolfer Erik

2

6502 Meclisi (C64) - Felix Palmen

Doğru cevap, 52768,23

Açıklama biraz dahil.

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

Kod önce bir virgül (sözdizimi zorunluluğu) olup olmadığını denetler ve sonra birincisi WORD olan 0014 ve 0015 bellek konumunda küçük endian depolanan ve ikincisi X kaydında depolanan iki bağımsız değişkeni okur.

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

Programı yeniden yazmak için girdilerimizi kullanmak oldukça zekice. Sonunda programın sonunda çıkış döngüsü için sayacı yeniden yazar.

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

İşte aldatıcı kısım:

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

C64'te, d018 çok önemli bir bayttır. Ekranın çıktısını içeren şeyler için referans noktalarını saklar. Buraya bakın fazla bilgi için . Bu yanlış bir değer alırsa, C64'ünüzü kilitler. Gerekli karma büyük ve küçük harfleri yazdırmak için bunun 17 $ olması gerekir.

Şimdi çıktı döngümüze başlıyoruz:

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

Bu sabit, daha önce yazılan şeydir. Döngünün ne kadar süre çalışacağını açıkça belirler. Zaten doğru değer oluyor, ama yine 0e'yi yapıştırmamız gerekiyor.

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

Gerisi sadece c025 bellek adresinden başlayarak yazdırmamız gereken bilgilerdir.

Yani oradaki matematiği takip ediyor.


Kesinlikle doğru, tebrikler. Gönderiyi düzgün bir şekilde düzenlemem biraz zaman alabilir, şimdi mobil cihazdayım.
Felix Palmen

D018 çok zekiydi ve gizlice nasıl bir ipucu gönderdiğini seviyorum.
Bir Altın Adam

d018 amaçlanan kapı açıcıydı ... ipucu kazaraydı, $FForada demek istedim , ama sonra bırakmaya karar verdim.
Felix Palmen

2

6502 Makine Kodu (C64) - Felix Palmen

Doğru cevap

8bitsareenough

Kod oldukça karmaşıktır ve bir çok kendini değiştirmeyi içerir. Bu yüzden tamamen tersine mühendislik yapmak yerine, sadece kendini çatlatmak için kullanabilirsiniz.

İşte olanları anlamaya yardımcı olmak için kodun biraz daha yararlı bir şekilde sökülmesi. Sözdizimi KickAssembler içindir.

*=$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

Bu şekilde etiketlemek, XOR kodunun, ihtiyacımız olanı yazdırmak için gizlenmiş bir sürü sabit olduğunu görmem için yeterliydi. XOR tersine çevrilebilir olduğundan, istenen çıkışı girerseniz, anahtarın ne olduğunu size söyleyecektir.

Bu yüzden son satırı değiştirdim

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

böylece yanlış bir girişe çarpmak yerine son gerekli girdiyi basar.

Ve işte bu!

Herhangi bir ilgi varsa, kodu daha fazla kıracağım.


Vay be, bu aslında büyük bir kısayol, muhtemelen işlem sırasında daha önce yanlış girişte bir çökme zorlamalıydım . Hata ayıklayıcısını kullanan başka bir kısayol btw vardı . Ama her neyse, bu doğru çözüm. vice
Felix Palmen

Mengene bir hata ayıklayıcı olduğunu bilmiyordum. Sadece cevapları kırmak için bir dil öğrenmek için aldığım şey budur.
Bir Altın Adam

Yazımı bazı açıklamalarla birlikte düzenledi. İyi iş, sadece programı çökmemek için değiştirmek tabii ki oldukça açık bir yol, bunu düşünmedim.
Felix Palmen

Nitpick: " drops A in mystery+1, over the constant" <- bu aslında mystery+4etiketinizde. Offests bayt olan :) ve FWIW, kendini modifikasyon bile oldukça yaygındır ciddi uzun RAM kod çalışır gibi, 6502 kod.
Felix Palmen

1

Patlat , Adım Tavuk

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

Rh / qi?, WCR + du

Çevrimiçi deneyin!

  • Tüm "kâşiflerin" aslında ne yaptığını anlamaya çalışmak başını çok fazla incitir, bu yüzden onu tersine değiştirdim (kelimenin tam anlamıyla: p - en sağdaki karakterden başlayarak her biri sırayla yazdırılabilir karakter aralığı boyunca [ve etrafında] kaydırdım) .

İyi iş :) Bilgisayarıma geri döndüğümde birkaç saat içinde bir açıklama ekleyeceğim
Stephen

1

C (tcc) Joshua tarafından

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

Çevrimiçi deneyin!


Lanet. Bu tam çatlak vardı ama TIO üzerinde çalışamadı. +1
MD XF

Üzgünüm. Fwiw şimdi düzeltildi.
Dennis

Sorunun ne olduğunu biliyor musun?
MD XF

Nasıl düzelttiğimi biliyorum (tcc SELinux desteği ile inşa edilmesi gerekiyordu), ancak bunun ne işe yaradığından veya neden ilk başta gerekli olduğundan emin değilim.
Dennis


1

Jöle Jonathan Allan tarafından

Orijinal kod:

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

Çevrimiçi deneyin!

Giriş:

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

Açıklama:

Temel olarak, kodun ne yaptığını anlamak gerekir. Yaptığı ilk şey, dizeyi alması"!,Word Hel"(satırsonu hariç tüm gerekli karakterlerle) ve bir grup permütasyon oluşturur. Girişler permütasyon numaralarını belirtir ve girişten gelen her bir permütasyon çifti, ilk permütasyonun ilk uygulandığı çiftler hariç dizeye uygulanır. Temel olarak, P2 (P1 (S)), P2 (P2 (S), P2 (P3 (S)), ..., P2 (PN (S)), P3 (P1 (S)), ..., P3 (PN (S)), ... ..., PN (P1 (S)), ..., PN (PN (S)) Bunların hepsi bir araya getirilir ve son giriş her PNth'ı almak için yeniden kullanılır Bu nedenle, PN = len (S) * N = 10 * N alırım.Bu, P3'ün (P1 (S) ilk karakteri olan P2 (P1 (S)) 'nin ilk karakterini alacağımız anlamına gelir. )), PN'nin ilk karakterine kadar (P1 (S)) Daha da basitleştirmek için, kimlik permütasyonu olan P1 = 1'e izin verdim, sonra ilkine "H" ye izin veren herhangi bir P2'yi seçmek yeterlidir durum, "e" yi birinci konuma getiren bir P3 vb. Neyse ki, PN için seçilmiş olan gibi küçük permütasyon sayıları dizgedeki önceki karakterleri etkilemez, bu nedenle PN "!" dizenin başında. (Bu doğru değilse, farklı bir P1 seçerek çözmek yine de mümkün olacaktır.)


14 permütasyon listesinin 14 permütasyonunu alır, düzleştirir, bozar ve sonra her 140'ıncı karakteri alır.
Jonathan Allan

1

MD XF tarafından C (TIO üzerinde GCC)

4195875

Çevrimiçi deneyin!

Nasıl?

İkinci argümanı, girdi üzerinde belirleyebileceğimiz bir işaretçi olan bir dize olarak yazdırmaya çalışır. Konum belleğinde dizeyi 4195875başlatır "Hello, World!\n".

Sayı eklenerek belirlendi print("%p", "Hello, World!");önce printf, ondalık için onaltılık sayı dönüştürme ve orijinal TIO üzerinde denedik. Ancak, bana gösterdiprintf biçim dizesini . Bazı sayıları deneyerek, dizenin biçim dizesinden önce bulunduğunu öğrendim.

Yani bellekte şöyle görünecektir (bir C dizesi olarak):

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

Bu ayrıca derleyiciye yapılan herhangi bir güncelleştirmenin çözümü kırabileceği anlamına gelir.






1

JavaScript (ES6), Vual

81 karakter sınırı göz önüne alındığında, bu muhtemelen amaçlanan çözüm değildir

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

Çevrimiçi deneyin!


Dahi. küresel manipülasyon ile bir karakter dizesi geçirme. Görünüşe göre, çözüm amaçlanmıştır
Евгений Новиков

Amaçlanan çözüm bu değildir :(
Voile

Şimdi düşündüğüme göre, bir işlevde girdiyi geçmeden önce tonlarca şey yapmasına izin verildiğini düşünmüyorum, çünkü söz konusu şeyler girdinin bir parçası olarak da oluşturulamazsa (örn. zorluk yapmanız gerekir, çünkü) içeride değerlendirilen girdi 'Merhaba Dünya!' değil tam programda sonuçlanacaktır. Aksi takdirde hemen hemen hiçbir şey güvenli olamaz. Bence bu çatlak geçersiz olabilir mi?
Voile

@Voile Çok iyi olabilir. Sanırım giriş tek başına (yani harici sistemde değişiklik olmadan) - özellikle bu amaçlanan çözüm değilse :) okumak için adil okumak için polisi kırık olarak işaretlemek gerek.
Birjolaxew

1
Bu konuyu tartışan bir meta yayın yaptım . Orada bazı tartışmalar bırakmaktan çekinmeyin.
Voile
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.