Temukan Jarum di tumpukan jerami (Perampok)


18

Ini adalah bagian dari tantangan . Buka di sini untuk bagian polisi.

Tantangan Perampok

Jawaban polisi dapat di-crack dengan menghapus subset karakter apa pun dari program Haystack, sehingga hasilnya dikeluarkan Needlealih-alih Haystack(sementara masih menjadi pengiriman yang valid dalam bahasa yang sama). Anda tidak harus menemukan solusi yang sama persis seperti yang dimaksudkan oleh polisi, asalkan milik Anda valid oleh kendala di atas.

Jika Anda mengelola ini, posting jawaban dengan solusi, tautkan ke jawaban polisi, dan tinggalkan komentar pada jawaban polisi yang menghubungkan kembali ke jawaban Anda.

Perampok yang memecahkan sebagian besar jawaban polisi menang. Ikatan rusak oleh jumlah ukuran jawaban polisi yang retak (mendukung perampok yang retak pengiriman lagi).

Setiap jawaban polisi hanya dapat di-crack satu kali, dan tentu saja, Anda tidak diizinkan untuk memecahkan jawaban Anda sendiri. Jika jawaban polisi ternyata tidak valid sebelum atau setelah retak, itu tidak dihitung terhadap skor perampok.

Contohnya

Berikut adalah beberapa contoh sederhana dalam berbagai bahasa:

Ruby

Haystack: puts 1>0?"Haystack":"Needle"
Delete:        XXXXXXXXXXXXXXX
Needle:   puts "Needle"

Python 2

Haystack: print "kcatsyaHeldeeN"[-7::-1]
Delete:          XXXXXXXX        XX
Needle:   print "eldeeN"[::-1]

Perhatikan bahwa subset karakter yang dihapus tidak harus bersebelahan.


Jika penggunaan perampok hashing, encryption or random number generationdiizinkan? (Meskipun kemungkinan kecil)
l4m2

Jawaban:


11

JavaScript, 85 byte (ES6)

Retak jawaban Arnauld

f=(k=b=x=35)=>x--?f(k*4853461&268435455):k&2?'N'+(k^12408877).toString(b):'Haystack'

Demo "Needle"

Penjelasan

Fungsi aslinya adalah:

f=(k=b=x=35)=>x--?f(k*74837258394056219&268435455):k&2?'N'+(k^124038877).toString(b):'Haystack'

yang lebih mudah dibaca sebagai:

f = (k=b=x=35) => {
    if (x--) {
        return f(k*74837258394056219&268435455);
    } else {
        if (k&2) {
            return 'N'+(k^124038877).toString(b);
        } else {
            return 'Haystack';
        }
    }
}

Perhatikan bahwa ketika n=21625674, maka n.toString(35)adalah 'eedle'.

35 dalam input mungkin tidak dapat diubah menjadi subset (karena kami ingin basis yang cukup besar untuk memuat semua huruf 'del', jadi kami membutuhkan basis yang setidaknya 22). Jadi angka-angka untuk mengubah adalah 74837258394056219, 268435455, dan 124038877. Kami ingin menggantinya dengan angka a, b, c, masing-masing dibentuk dengan subset digit angka asli, sehingga fungsinya g(k) = (k * a & b), dimulai dengan k=35dan diulang 35 kali, dan kemudian XOR dengan c, memberi 21625674.

Untuk yang satu ini, setelah berpikir sedikit, karena panjang kecil (maksimal yang amemiliki panjang 17, bdan cmemiliki panjang 9), saya hanya menggunakan brute-force :-) Menulis C ++ Program untuk menghasilkan semua nomor mungkin a, b, cdibentuk sebagai subset nomor asli, beralih melalui semua adan b, dan periksa apakah yang diperlukan cada di set. Berjalan di sekitar 15 detik, dan satu-satunya output a=4853461, b=268435455, c=12408877(bergantian keluar nomor btidak perlu diubah). Saya tidak yakin apakah ada cara yang lebih pintar untuk membalikkan fungsi ini.



5

Brain-Flak , 96 byte

Retak jawaban Funky Computer Man .

([((((()()())){}){}){}](()[()]({}([(((()()()){}))[]])[]({}({}()(((()(({}){}){}){}){}())))[]))())

Cobalah online!

Ini adalah tantangan yang menyenangkan.

The -24 pada awal yang bertobat yke adalam bahasa aslinya sekarang digunakan untuk mengkonversi eke M, yang kemudian diubah ke Ndalam tempat dengan mengubah seluruh akhir loop untuk ()). Huruf push pertama kdiubah menjadi ehanya dengan menghapus push-pop yang menambahkan 6 ke dalamnya. Sisanya sebagian besar hanya jatuh pada tempatnya, dengan beberapa langkah keliru lucu di sepanjang jalan (termasuk satu program yang outputnya Meddle).

Perbandingan kedua program:

Haystack: ([((((()()())){}){}){}](()([()](()({}([((((()()()){})))[]])[]({}({})[{}]()({}((()(({}){}){}){}){}())))[][][][][][]))[]))(((()[]){}){({}[()()])}{})
Needle:   ([((((()()())){}){}){}](() [()]   ({}([ (((()()()){})) []])[]({}({}     ()(  ((()(({}){}){}){}){}())))[]              ))   ()  )

Saya yakin itu akan berakhir seperti ini
H.PWiz

Tentu saja itu berhasil , tetapi entah bagaimana saya meyakinkan diri sendiri bahwa Nitu 77 bukannya 78, jadi saya tidak menangkapnya.
Nitrodon

Lagi pula, Anda lebih pendek.
H.PWiz

Solusi menarik! Saya telah menambahkan solusi yang saya maksudkan ke posting asli jika Anda ingin melihatnya.
Wheat Wizard

5

Haskell

Retak @ jawaban Laikoni ini .

s=map;hay=zipWith;a=head;h=s a.(hay(scanr id).s a<*>s(succ<$))$words"Haysta ayst ackH ays k ayst"

Cobalah online!

Kode asli:

hays=map;hay=zipWith;stack=head;h=stack{-
 hay.(hays.(stackany hay$or id).stack hay
<*>hays(sum$stack haystack<$>hay))-}$words
 "Haystack Hayst ackH aysta ckH aystac k"

mengganti karakter yang dihapus dengan garis bawah:

___s=map;hay=zipWith;__a__=head;h=s______
 _a_.(hay__(s__c_an_______r id).s____ _a_
<*>___s(su_____c________c_<$____))__$words
 "Haysta__ _ayst ackH ays__ _k_ ayst____"

Bagaimana Needledikonstruksi: string di akhir kode dipecah menjadi kata-kata. Karakter pertama dari setiap kata bertambah beberapa kali karena ada karakter dalam kata tersebut, misalnya Haysta-> Hditambah 6 karakter -> N.


5

Hexagony , 17 byte, H.PWiz

]; N @ cl; e ;; (\. S.; _

Cobalah online!

Perbandingan dengan yang asli:

];N.@cl;e@;;(\H/;ya;_.>s.;t//<._  original
];N @cl;e ;;(\       . s.;     _  modified

Visualisasi:

  ] ; N
 @ c l ;
e ; ; ( \
 . s . ;
  _ . .

Penjelasan

Tanda bonus - menggunakan semua 6 IP dan semua kecuali satu dari sel!

Jalur berwarna

IP # 0 dimulai dengan menuju ke kanan di sepanjang jalur hitam ke ].
Kami kemudian beralih ke IP # 1, yang mengarah di sepanjang jalur merah, mencetak Ndengan N;kemudian membungkus kembali ke jalur ]lagi.
Kami kemudian transisi ke IP # 2, yang kepala sepanjang jalur biru, menyimpan edalam sel memori saat ini, maka sepanjang jalan hijau, mengeksekusi (dengan refleksi di \) ;;(;yang cetakan ee, decrements sel memori dari eke dcetakan kemudian d.
IP melanjutkan sepanjang jalur oranye, mengeksekusi Nl;seyang mencetak l, dan menyimpan edalam sel memori saat ini. Terus sepanjang jalur coklat, mencetak edengan;. Pada titik ini kita sudah mencetak Needle, jadi sisanya baru selesai. IP menyimpan c, lalu klik ]. Kami kemudian beralih ke IP # 3, yang mengarah di sepanjang jalur biru, memukul , memantul ke mana memantul ke dalam . Kami kemudian beralih ke IP # 4, yang mengarah di sepanjang jalur hijau, memantul , lalu bercabang ke (karena positif). Akhirnya, kami beralih ke IP # 5, yang kemudian disimpan dengan toko .
Jalur berwarna 2
\_]
_\]c
e@


Bagus! Itu adalah solusi yang dimaksudkan.
H.PWiz

4

Python 2 , 123 byte

Jawaban Agtoever retak

import numpy
print "".join([dir(numpy)[int(i)][0] for i in numpy.poly1d([-143/2e1,-31,14,131,61,184])(numpy.arange(-3,3))])

repl.it

Perbandingan:

print "".join([dir(numpy)[int(i)][1-0] for i in numpy.poly1d([-1*1433/252e1,-3232/1920.,4026./72/2/3.,613/(6*4.)*1,-4723./1.8e2,-9763/120.,-2689/(-1+5*17.),1+138*.4*2])(numpy.arange(-12/3,13%9))])
print "".join([dir(numpy)[int(i)][  0] for i in numpy.poly1d([-1  43 /2  e1,-3    1    ,               1     4    ,       1         3 1   ,  6     1       ,1   8  4  ])(numpy.arange(-   3, 3  ))])

Saya memiliki banyak kesenangan menemukan solusi yang dicetak Meedledan Needlfdengan memasang polinomial ke median indeks simbol-simbol numpy yang dimulai dengan masing-masing huruf dalam Needle. Saya kemudian mencoba untuk menemukan koefisien yang sama dengan himpunan bagian dari program asli dengan tangan, tetapi saya akhirnya harus terpaksa memaksa memaksa satu untuk menemukan solusi yang valid.


Wow! Kerja bagus! Saya tidak berharap itu akan retak secepat itu.
agtoever

Saya awalnya mengembangkan tantangan berdasarkan numpy 1.13, yang tidak saya temukan di lingkungan repl, jadi saya harus menulis ulang untuk numpy 1.12 ... ;-)
agtoever


2

Jelly , 14 byte

Jawaban Crack Jonathan Allan

“¡#ɦṢÞɠ»ḟ“¡pṄ»

Cobalah online!

Perbandingan:

“¿ọ⁽ṅ*FỊ⁼g£¡#!ʋzoɦṪ£ṢÞḲÐɠ`”m3⁾“»jVḟ“¡!pṄ»
“          ¡#    ɦ  ṢÞ  ɠ      »  ḟ“¡ pṄ»

Saya dulu œcberalih melalui berbagai himpunan bagian dari string literal, digunakan tr -duntuk setiap filter yang mungkin, dan greped untuk Needle. Menggunakan asumsi bahwa tidak ada karakter yang digunakan dalam string pertama yang digunakan dalam jawaban, biarkan ia menemukan jawaban dalam waktu kurang dari 15 detik.


Persis yang saya pikirkan Nebbed+ rubletanpa salah rub.
Jonathan Allan


2

Java (OpenJDK 8), 191 byte

Retak jawaban Luke Steven

String d(){int h=3905055,m=55,s=15443;String d="0"+h*2+""+m*20+""+s*7,x="",y;for(int g=0;g<d.length();g+=3){y="";for(int e=0;e<3;e++)y+=d.charAt(e+g);x+=(char)Integer.parseInt(y);}return x;}

Cobalah online!

Karakter yang dihapus:

int h=3609000-5055+911,m=557558,s=15441301-157*10000
       xx  xxx    xxxx     xxxx       x xxxxxxxxxxxx

Ini membuat devaluasi ke 078101101100108101, yang mengeja Needle.


2

Ruby , 149 byte

Retak ini: /codegolf//a/144790/74216

Modulnya cukup kecil, jadi saya menulis ulang tahun multi-threaded dan berharap yang terbaik.

Sunting: Dan setelah itu menemukan jawaban yang bahkan lebih pendek.

x='hxDKFQOoqJLuVNW'
s="n=x.to_i 36;x.bytjs.jach_cons(3){|a,b,c|n+=n*b%c;n*=a^b};puts n%8675309==1388649 ?'Njjdlj':'Haystack'"
eval s.tr ?j,s.size.chr

Cobalah online!

Perubahan:

x='yGwztsPXhxDkBKlCYdFjQnpUROfoHvqmTgbaJSLcEiZrIAuMVNW'
x='        hxD  K    F Q    O o  q     J L       u VNW'

# and here's some more variants for extra pwnage:
x=' G  tsPx     KlCYd  Qn U   o v mT  a SLc    I u  NW'
x='  w  s    D BKl  dF QnpU O        ba SLcEiZrI  MV  '
x='yGwz s Xh Dk K C  F  npU O  Hvq   b   L    rIAu V W'

2

dc , 34 byte

93 9 2*+432212+ 47*4242160 7 2++*P

Pecahkan ini . TIO .

Saya mulai dengan mendapatkan representasi numerik dari Haystack (5215583380252484459) dan Needle (86197399743589). Selanjutnya, saya melakukan factorisation yang terakhir, yaitu 47 * 432323 * 4242169. Dari sini, cukup mudah untuk merekonstruksi angka-angka itu.

Menandai karakter yang digunakan:

6 93 3 9 2 2**+*+483622 1 2 3 3*+3*+89 47*+*+3 5 2* 269 158 9**107 97*2 4*++2 3 3*+42 14 2**+*+5*+5 2148 1 6 2*+*+68262 5 280 7 2 3 3*+5 2**+*+*+*+P
  XXX  XXX   XX  X X XX X X     X     XXXX                              X   X      XX X                    X                XXXXX     X     XX     X

gg! saya tahu bahwa menempatkan angka sebanyak itu adalah ide yang buruk)
cab404

@ cab404 Hanya ingin tahu: apakah Anda menggunakan perhitungan yang sangat berbeda untuk mencapai 86197399743589?
agtoever


Wow. Itu luar biasa. Itu mungkin pertanyaan codegolf lain: berapa banyak cara yang ada untuk mendapatkan hasil tertentu dengan menghapus karakter dalam ekspresi ...
agtoever

saya kira itu umumnya akan memerlukan beberapa matematika serius untuk menghitung semua kemungkinan dan membuktikan bahwa hanya ada jumlah mereka)
cab404

2

Hexagony , 19 byte, Martin Ender

[@;(...e<l.a;./;N>;

Cobalah online!

Perbandingan dengan aslinya

H[@;(...e<l.a;./$.>;\sN;\ac.>).;;;._y
 [@;(...e<l.a;./   ;  N     >  ;

Kode dibuka

  [ @ ;
 ( . . .
e < l . a
 ; . / ;
  N > ;

Jadi, saya tidak pernah menulis apa pun di Hexagony, tapi saya pikir hanya dengan 37 byte yang bisa saya dapatkan dengan crack. Martin, kuharap kau tahu, aku meluangkan banyak waktu untuk mencari tahu ini. :)

Saya mungkin salah, tetapi saya akan menjelaskan apa yang saya pikir kode ini lakukan:

Program dimulai dengan [, yang secara otomatis beralih ke IP # 5. IP ini dimulai di sudut barat, menuju [sekali lagi, yang memindahkannya ke IP # 4. Dari sini, ia mengeksekusi N;ekemudian menuju ke sudut tenggara dan mengeksekusi ;, memantul ke kanan untuk yang lain ;kemudian membungkus (yang mengurangi arus eke a d. Kemudian berlanjut (dengan bungkus) untuk ...;.kemudian memantul ke ldan sampai ke yang [terakhir kalinya, pindah ke IP # 3. Ini dijalankan ;, >dialihkan ke barat laut untuk .kemudian <dialihkan ke barat, memukul e, membungkus ;, dan berakhir di @.

Versi verbal

Saya sangat senang bahwa Anda menggunakan ukuran segi enam normal untuk program Needle; Saya sedang memeriksa program ukuran 19 (untuk segi enam sisi panjang-3) ketika saya menyadari Anda dapat menghapus sejumlah karakter dan itu akan secara otomatis mengisi segi enam dengan .s pada akhirnya, yang akan membuatnya secara dramatis lebih sulit untuk dipecahkan. Karena itu, Hexagony adalah bahasa jahat untuk tantangan ini karena (sebagian besar) karakter apa pun yang dihapus mengubah keseluruhan jalur eksekusi program. Yang sedang berkata, saya menikmati mencoba untuk datang dengan ini, bahkan jika saya akhirnya benar-benar memaksanya pada akhirnya. :)


Jika saya telah mengacaukan / melewatkan sesuatu, tolong beri tahu saya.
Jo.

Kerja bagus, ini terlihat cukup akurat. Saya akan membandingkannya dengan apa yang awalnya saya miliki selama akhir pekan.
Martin Ender

1

Java (OpenJDK 8) , 151 byte

Cracks Jawaban Kevin Cruijssen

v->{String h="H";int x=7;return new String(new byte[]{(byte)((-~-~-~-~-~-~1^x++*x)+15),new Byte("10"+h.length())})+new StringBuffer("elde").reverse();}

Cobalah online!

Perbandingan:

v->{String h="Haystack";int x=-7;return x<0?h:new String(new java.math.BigInteger(new byte[]{(byte)((~-~-~-~-~-~-~-~-~-~1^-x++*x)+151),new Byte("2"+"1+\"0+\"".length()+(x=h.length()*4/x)+"-x-7")}).toByteArray())+(new StringBuffer("hidden".substring(++x%3^4,--x-x--).replaceFirst("dd","e"+(char)(x*211%+93))).reverse());}
v->{String h="H       ";int x= 7;return       new String(                         new byte[]{(byte)(( -~-~-~-~-~-~      1^ x++*x)+15 ),new Byte("    1   0  "          +   h.length()    )        })               + new StringBuffer("    e                                 l          d    e"      )             .reverse() ;}

Saya merasa bagian terakhir tidak dimaksudkan.


Lol ok, itu cara cerdas untuk membuat "edle". Sambil mengutak-atik saya sudah berpikir saya melakukan sedikit terlalu banyak dan banyak solusi akan mungkin ..;) Solusi yang dimaksud adalah: v->{String h="Haystack";int x=7;return new String(new java.math.BigInteger(new byte[]{(byte)((~-~-~-~-~-~-~-~1^-x++*x)+15),new Byte(""+10+((x=h.length()*4/x)+x-7))}).toByteArray())+(new StringBuffer("hidden".substring(++x%3,x).replaceFirst("d","e"+(char)(x*21+3))).reverse());}(tidak tahu mengapa saya memasukkan BigInteger karena hanya byte-array sudah cukup ..) , tapi aku lebih suka milikmu lebih baik .. :)
Kevin Cruijssen

1

Brain-Flak , 102 byte

(((((((((()()()){}){}){}){}()){}()))()()<>)(()()()){}())<>((()((){}<>)))(({})[(((()()){}())(){}){}()])

Retak jawaban H.PWiz ini .

Cobalah online!

((((((((((()()()){}){}()){}){}()){}()))<({}[(()()()()){}])(([[]]({})<>)<>)>((()()())){}{})[()]))<[[]()]>((()){}){}((){}[][(<>){}<>])(<>){}(({}<>()[()])[(((()()()){}<[()]>)<(()){}>{}){}()])
 (((((((((()()()){}){}  ){}){}()){}()))      ()()                   <>)     (()()()) {}    () ) <      >((()      ((){}    <>)     )   )  (({}        )[(((()()  ){}  ()  )  () {}   ){}()])


1

Java oleh Johnathan S.

import java.util.*;interface Main{static void main(String[]args){Stack<Hay>s=new Stack();s.add(new Needle());System.out.println(s.get(s.indexOf(new Hay())+1).a);}}class Needle extends Hay{{a="Needle";}}class Hay{String a="Haystack";public boolean equals(Object o){return getClass().equals(o.getClass());}}

TiO

Cukup lepaskan loop yang menambahkan Hay dan tidak ada yang tersisa di tumpukan kecuali jarum.


Ha, bagus - saya tidak benar-benar berpikir hanya menghapus loop! Menghapus equalsmetode juga berfungsi.
Jonathan S.


0

T-SQL oleh phroureo , 757 byte

seleCT 'Needle'

Entah bagaimana saya tidak berpikir itu adalah solusi yang dimaksudkan. Menggunakan karakter yang dikelilingi oleh {}:

create table a(l int,c int)
in{se}rt into a va{l}u{e}s (1,10),(2,1),(3,8),(4,0)
go
;CREATE FUN{CT}ION b(@ varchar(max)) returns varchar(max) as
begin return{ '}char('+@+'),'''','end 
go
;CREATE FU{N}CTION h(@ varchar(max),@a varchar(max), @b varchar(max), @c varchar(max), @d varchar(max), @e varchar(max), @f varchar(max), @g varchar(max), @h varchar(max))
r{e}turns varchar(max) as 
b{e}gin
return replace(replace(replace(replace(@,@a,@b),@c,@d),@e,@f),@g,@h)
end
{d}ec{l}ar{e} @x varchar(max),@ int=1,@y varchar(99)={'}'
,@D varchar(4)='Ha',@O varchar(4)='ys'
,@T varchar(3)='ta',@A varchar(4)='ck'
WHILE @<=4
BEGIN
set @y+=(SELECT dbo.b(c+100)from a where l=@)+' '
set @+=1
END
SELECT @x='select
left(dbo.h('''+@D+@O+@T+@A+''','+ left(@y,len(@y)-1) +'),char(56))'
execute(@x)

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.