Tìm kim trong Haystack (Cướp)


18

Đây là một phần của thử thách . Tới đây cho phần của cảnh sát.

Thử thách của bọn cướp

Câu trả lời của cảnh sát có thể bị bẻ khóa bằng cách xóa bất kỳ tập hợp con ký tự nào khỏi chương trình Haystack, để nó xuất ra Needlethay vì Haystack(trong khi vẫn là một đệ trình hợp lệ trong cùng ngôn ngữ). Bạn không phải tìm giải pháp chính xác giống như cảnh sát dự định, miễn là giải pháp của bạn hợp lệ bởi các ràng buộc trên.

Nếu bạn quản lý điều này, hãy đăng câu trả lời với giải pháp, liên kết đến câu trả lời của cảnh sát và để lại nhận xét về câu trả lời của cảnh sát liên kết lại với câu trả lời của bạn.

Tên cướp nào bẻ khóa được nhiều câu trả lời nhất của cảnh sát. Các mối quan hệ bị phá vỡ bởi tổng kích thước của các câu trả lời của cảnh sát bị bẻ khóa (có lợi cho tên cướp đã bẻ khóa các bài nộp dài hơn).

Mỗi câu trả lời của cảnh sát chỉ có thể bị bẻ khóa một lần, và tất nhiên, bạn không được phép bẻ khóa câu trả lời của chính mình. Nếu câu trả lời của cảnh sát hóa ra không hợp lệ trước hoặc sau khi bị bẻ khóa, thì nó không được tính vào điểm số của tên cướp.

Ví dụ

Dưới đây là một vài ví dụ đơn giản trong các ngôn ngữ khác nhau:

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]

Lưu ý rằng tập hợp con của các ký tự bị loại bỏ không phải tiếp giáp nhau.


Nếu sử dụng cướp hashing, encryption or random number generationcó được phép không? (Mặc dù rất nhỏ)
l4m2

Câu trả lời:


11

JavaScript, 85 byte (ES6)

Vết nứt của Arnauld

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

Bản demo "kim"

Giải trình

Chức năng ban đầu là:

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

dễ đọc hơn như:

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';
        }
    }
}

Lưu ý rằng khi n=21625674, sau đó n.toString(35)'eedle'.

Số 35 trong đầu vào có thể không thể thay đổi thành tập hợp con (vì chúng tôi muốn một cơ sở đủ lớn để chứa tất cả các chữ cái 'del', vì vậy chúng tôi cần một cơ sở ít nhất là 22). Vì vậy, các con số để thay đổi được 74837258394056219, 268435455124038877. Chúng tôi muốn thay thế chúng bằng các số a, b, c, mỗi số được tạo thành một tập hợp con các chữ số của các số gốc, sao cho hàm g(k) = (k * a & b), bắt đầu bằng k=35và lặp lại 35 lần, và sau đó XOR với c, đưa ra 21625674.

Đối với cái này, sau khi suy nghĩ một chút, như độ dài nhỏ (các tối đa acó chiều dài 17, bccó chiều dài 9), tôi chỉ sử dụng brute-force :-) Wrote một chương trình C ++ để tạo ra tất cả các số có thể a, b, chình thành như các tập con của những con số ban đầu, lặp qua tất cả ab, và kiểm tra xem yêu cầu clà trong bộ này. Chạy trong khoảng 15 giây, và đầu ra duy nhất là a=4853461, b=268435455, c=12408877(lượt ra số bkhông cần phải được thay đổi). Tôi không chắc liệu có cách nào thông minh hơn để đảo ngược chức năng này hay không.



5

Brain-Flak , 96 byte

Vết nứt của Funky Computer Man .

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

Hãy thử trực tuyến!

Đây là một thử thách thú vị.

-24 ở đầu chuyển đổi ythành abản gốc hiện được sử dụng để chuyển đổi ethành M, sau đó được chuyển đổi Ntại chỗ bằng cách thay đổi toàn bộ vòng lặp kết thúc thành ()). Chữ cái đẩy đầu tiên đã kđược thay đổi thành eđơn giản bằng cách loại bỏ một chữ pop-pop có thêm 6 chữ cái. Phần còn lại hầu hết chỉ rơi vào vị trí, với một số sai lầm hài hước trên đường đi (bao gồm một chương trình có đầu ra Meddle).

So sánh hai chương trình:

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

Tôi chắc chắn rằng nó sẽ kết thúc như thế này
H.PWiz

Điều đó chắc chắn hoạt động , nhưng bằng cách nào đó tôi đã thuyết phục bản thân mình Nlà 77 thay vì 78, vì vậy tôi đã không nắm bắt được.
Nitrodon

Dù sao bạn cũng ngắn hơn.
H.PWiz

Giải pháp thú vị! Tôi đã thêm giải pháp dự định của mình vào bài viết gốc nếu bạn muốn xem nó.
Thuật sĩ lúa mì

5

Haskell

Vết nứt @ Laikoni 'câu trả lời .

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

Hãy thử trực tuyến!

Mã gốc:

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"

thay thế các ký tự bị xóa bằng dấu gạch dưới:

___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____"

Cách Needlexây dựng: chuỗi ở cuối mã được chia thành các từ. Char đầu tiên của mỗi từ được tăng lên nhiều lần khi có các ký tự trong từ, ví dụ Haysta-> Hcộng với 6 ký tự -> N.


5

Lục giác , 17 byte, H.PWiz

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

Hãy thử trực tuyến!

So sánh với bản gốc:

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

Hình dung:

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

Giải trình

Điểm thưởng - sử dụng tất cả 6 IP và tất cả trừ một trong các ô!

Đường dẫn màu

IP # 0 bắt đầu bằng cách đi thẳng vào con đường màu đen vào ].
Sau đó chúng tôi chuyển đổi sang IP # 1, mà người đứng đầu dọc theo con đường đỏ, in ấn Nvới N;sau đó gói lại vào ]một lần nữa.
Chúng tôi sau đó chuyển đổi sang IP # 2, mà người đứng đầu dọc theo con đường màu xanh, lưu trữ etrong các tế bào bộ nhớ hiện tại, sau đó dọc theo con đường màu xanh lá cây, thực hiện (với một sự phản ánh tại \) ;;(;mà in ee, decrements các tế bào bộ nhớ từ eđể din sau đó d.
IP tiếp tục dọc theo đường dẫn màu cam, thực hiện Nl;sein lvà lưu trữ etrong ô nhớ hiện tại. Nó tiếp tục dọc theo con đường nâu, in evới;. Đến thời điểm này chúng tôi đã in xong Needle, nên phần còn lại chỉ là hoàn thiện. Các cửa hàng IP c, sau đó nhấn ]. Sau đó chúng tôi chuyển sang IP # 3, đi dọc theo con đường màu xanh, đánh , nảy vào đó nảy vào . Sau đó, chúng tôi chuyển sang IP # 4, đi dọc theo con đường màu xanh lá cây, nảy lên , sau đó và phân nhánh (vì là tích cực). Cuối cùng, chúng tôi chuyển sang IP # 5, cửa hàng sau đó thoát ra .
Đường dẫn màu 2
\_]
_\]c
e@


Đẹp! Đó là giải pháp dự định.
H.PWiz

4

Python 2 , 123 byte

Vết nứt của Agtoever

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

thay thế

So sánh:

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

Tôi đã có rất nhiều niềm vui khi tìm các giải pháp được in MeedleNeedlfbằng cách ghép một đa thức với trung vị của các chỉ số của các ký hiệu numpy bắt đầu với mỗi chữ cái trong đó Needle. Sau đó, tôi đã cố gắng tìm các hệ số tương tự với các tập hợp con của chương trình gốc bằng tay, nhưng cuối cùng tôi đã phải dùng đến vũ phu buộc người ta phải tìm một giải pháp hợp lệ.


Ồ Bạn đã làm rất tốt! Tôi không mong đợi nó sẽ bị bẻ khóa sớm.
bất cứ lúc nào

Ban đầu, tôi đã phát triển thử thách dựa trên numpy 1.13, mà tôi không tìm thấy trong bất kỳ môi trường thay thế nào, vì vậy tôi đã phải viết lại cho numpy 1.12 ... ;-)
bất chấp


2

Thạch , 14 byte

Vết nứt Jonathan Allan Trả lời

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

Hãy thử trực tuyến!

So sánh:

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

Tôi đã sử dụng œcđể lặp qua các tập hợp con khác nhau của chuỗi ký tự, được sử dụng tr -dcho từng bộ lọc có thể và greped cho Kim. Sử dụng giả định rằng không có ký tự được sử dụng nào trong chuỗi đầu tiên được sử dụng trong câu trả lời cho phép nó tìm thấy câu trả lời trong vòng dưới 15 giây.


Chính xác là cái tôi có trong tâm trí Nebbed+ rublemà không có bất kỳ rub.
Jonathan Allan


2

Java (OpenJDK 8), 191 byte

Vết nứt của 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;}

Hãy thử trực tuyến!

Xóa ký tự:

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

Điều này làm cho dđánh giá 078101101100108101, mà phép thuật Needle.


2

Ruby , 149 byte

Bẻ khóa này: /codegolf//a/144790/74216

Mô-đun khá nhỏ, vì vậy tôi đã viết một điều sinh nhật đa luồng và hy vọng điều tốt nhất.

Chỉnh sửa: Và sau đó tìm thấy một câu trả lời thậm chí còn ngắn hơn.

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

Hãy thử trực tuyến!

Thay đổi:

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

Vết nứt này . TIO .

Tôi bắt đầu bằng cách lấy đại diện số của Haystack (5215583380252484459) và Kim (86197399743589). Tiếp theo, tôi đã làm một nhân tố của cái sau, đó là 47 * 432323 * 4242169. Từ đó, việc tái tạo lại những con số đó khá dễ dàng.

Đánh dấu các ký tự được sử dụng:

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 tôi biết rằng đặt nhiều số đó là một ý tưởng tồi)
cab404

@ cab404 Chỉ tò mò: bạn đã sử dụng một phép tính rất khác để đến 86197399743589 chưa?
bất cứ lúc nào


Ồ Điều đó thật đáng chú ý. Đó có thể là một câu hỏi khác về codegolf: có bao nhiêu cách để có được một kết quả nhất định bằng cách xóa các ký tự trong một biểu thức ...
bất chấp

tôi đoán rằng nói chung sẽ yêu cầu một số phép toán nghiêm túc để tính toán tất cả các tính tích cực và chứng minh rằng chỉ có số đó)
cab404

2

Hexagony , 19 byte, Martin Ender

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

Hãy thử trực tuyến!

So sánh với bản gốc

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

Mã chưa mở

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

Vì vậy, tôi chưa bao giờ viết bất cứ điều gì trong Hexagony, nhưng tôi đã hình dung chỉ với 37 byte là tôi có thể tìm ra vết nứt. Martin, tôi hy vọng bạn biết tôi đã dành rất nhiều thời gian để cố gắng tìm ra điều này. :)

Tôi có thể không chính xác, nhưng tôi sẽ giải thích những gì tôi nghĩ mã này đang làm:

Chương trình bắt đầu với [, nó sẽ tự động chuyển sang IP # 5. IP này bắt đầu ở góc phía tây, hướng về phía [một lần nữa, di chuyển nó sang IP # 4. Từ đây, nó thực thi N;esau đó đi đến góc đông nam và thực hiện ;, bật sang bên phải cho một cái khác ;sau đó kết thúc để (làm giảm dòng điện ethành a d. Sau đó, nó tiếp tục (với một bọc) để ...;.sau đó bật lên lvà đến [lần cuối cùng, chuyển sang IP # 3. Nó thực hiện ;, >chuyển hướng về phía tây bắc để .sau đó <chuyển hướng về phía tây, đánh e, quấn ;và chấm dứt trên @.

Phiên bản dài dòng

Tôi rất vui vì bạn đã sử dụng kích thước hình lục giác bình thường cho chương trình Kim; Tôi đã kiểm tra kích thước 19 chương trình (cho hình lục giác có độ dài 3 cạnh) khi tôi nhận ra rằng bạn có thể xóa bất kỳ số lượng ký tự nào và nó sẽ tự động điền vào hình lục giác với .s ở cuối, điều này sẽ khiến việc bẻ khóa trở nên khó khăn hơn. Như vậy, Hexagony là một ngôn ngữ xấu cho thử thách này bởi vì (hầu hết) bất kỳ nhân vật nào bị loại bỏ đều thay đổi toàn bộ đường dẫn thực hiện của chương trình. Điều đó đã được nói, tôi rất thích cố gắng đưa ra điều này, ngay cả khi cuối cùng tôi đã vũ phu buộc nó. :)


Nếu tôi đã làm hỏng / bỏ lỡ bất cứ điều gì, xin vui lòng cho tôi biết.
Jo.

Công việc tốt, điều này có vẻ khá chính xác. Tôi sẽ so sánh nó với những gì tôi đã có ban đầu vào cuối tuần.
Martin Ender

1

Java (OpenJDK 8) , 151 byte

Vết nứt của 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();}

Hãy thử trực tuyến!

So sánh:

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() ;}

Tôi cảm thấy như phần cuối không có ý định.


Lol ok, đó là một cách thông minh để làm "edle". Trong khi loay hoay, tôi đã nghĩ rằng mình đã làm quá nhiều và có thể có rất nhiều giải pháp ..;) Giải pháp dự định là: 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());}(không biết tại sao tôi lại bao gồm BigInteger vì chỉ cần mảng byte là đủ ..) , nhưng tôi thích bạn hơn .. :)
Kevin Cruijssen

1

Brain-Flak , 102 byte

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

Vết nứt của H.PWiz .

Hãy thử trực tuyến!

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


1

Java của 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

Đơn giản chỉ cần loại bỏ vòng lặp thêm Hay và không có gì sẽ còn lại trên ngăn xếp trừ kim.


Ha, một điều tuyệt vời - tôi thực sự đã không nghĩ đến việc đơn giản là xóa vòng lặp! Loại bỏ equalsphương pháp hoạt động là tốt.
Jonathan S.


0

T-SQL theo phroureo , 757 byte

seleCT 'Needle'

Bằng cách nào đó tôi không nghĩ rằng đó là giải pháp dự định. Sử dụng các ký tự được bao quanh bởi {}:

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)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.