Znajdź igłę w stogu siana (Rabusie)

18

To część wyzwania . Idź tutaj po część gliniarzy.

Wyzwanie rabusiów

Odpowiedź gliniarza może zostać złamana przez usunięcie dowolnego podzbioru znaków z programu Haystack, tak aby wyświetlał Needlezamiast Haystack(podczas gdy nadal jest prawidłowym przesłaniem w tym samym języku). Nie musisz znaleźć dokładnie tego samego rozwiązania, jakie zamierzał policjant, o ile twoje jest zgodne z powyższymi ograniczeniami.

Jeśli poradzisz sobie z tym, opublikuj odpowiedź z rozwiązaniem, łącząc się z odpowiedzią policjanta, i zostaw komentarz na temat odpowiedzi policjanta z powrotem do twojej.

Rabuś, który łamie najwięcej odpowiedzi gliniarzy, wygrywa. Więzy są zerwane przez sumę rozmiarów odpowiedzi na złamane gliny (na korzyść rabusia, który pęka z dłuższych postów).

Każdą odpowiedź gliniarza można złamać tylko raz i oczywiście nie wolno ci złamać własnej odpowiedzi. Jeśli odpowiedź gliniarza okaże się nieprawidłowa przed lub po pęknięciu, nie jest liczona do wyniku rabusia.

Przykłady

Oto kilka prostych przykładów w różnych językach:

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]

Zauważ, że podzbiór usuniętych znaków nie musi być ciągły.

Martin Ender
źródło
Jeśli użycie rabusia hashing, encryption or random number generationjest dozwolone? (Choć możliwość niewielka)
l4m2

Odpowiedzi:

11

JavaScript, 85 bajtów (ES6)

Pęknięcia odpowiedź na Arnauld

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

Demo „Igły”

Wyjaśnienie

Oryginalna funkcja to:

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

który jest bardziej czytelny jako:

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

Zauważ, że kiedy n=21625674, to n.toString(35)jest 'eedle'.

Liczby 35 na wejściu prawdopodobnie nie można zmienić na podzbiór (ponieważ chcemy, aby podstawa była wystarczająco duża, aby zawierać wszystkie litery „del”, więc potrzebujemy podstawy, która ma co najmniej 22). Więc numery zmienić to 74837258394056219, 268435455i 124038877. Chcemy zastąpić je liczbami a, b, c, z których każda składa się z podzbioru cyfr liczb pierwotnych, tak aby funkcja g(k) = (k * a & b), zaczynając od k=35i iterując 35 razy, a następnie XORed z c, dawała 21625674.

W tym drugim, po myśli się nieco, jak wymiary są małe (maksymalna ama długość 17, bi cma długość 9), po prostu stosuje się brute-force :-) Wrote C ++ programu w celu wytworzenia wszystkich możliwych liczb a, b, cukształtowany jako podzbiorów pierwotnych liczb, powtarzaj wszystkie ai bi sprawdź, czy wymagane cbyło w zestawie. Działa w około 15 sekund, a jedyne wyjście a=4853461, b=268435455, c=12408877(okazuje numer bnie musi być zmieniony). Nie jestem pewien, czy istnieje bardziej sprytny sposób na odwrócenie tej funkcji.

ShreevatsaR
źródło
5

Stóg siana , 82 bajty

Pęknięcia Odpowiedź HyperNeutrino

0\1-c\
/    
?10F17+c8F+4+cd8F+3+c6-c1+c,c2+c8+c|
 0   \1++c,c|
F/c++2F8
c\8F+2+cd

Wypróbuj online!

fireflame241
źródło
1
Ładny! Sposób, w jaki go skonfigurowałem, moim oryginalnym rozwiązaniem było dosłownie usunięcie 0na początku: P Miło widzieć inne podejście! +1
HyperNeutrino,
5

Brain-Flak , 96 bajtów

Cracks Odpowiedź Funky Computer Mana .

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

Wypróbuj online!

To było zabawne wyzwanie.

-24 na początku, który przekształca yto aw oryginale jest obecnie używany do konwersji edo M, który następnie przekształca się Nw miejscu, zmieniając cały koniec pętlę ()). Pierwsza pchana litera kzostała zmieniona na epo prostu przez usunięcie pop-popu, który dodaje do niej 6. Reszta w większości po prostu się na miejscu, z kilkoma humorystycznymi błędami po drodze (w tym jeden program, którego wyjście było Meddle).

Porównanie dwóch programów:

Haystack: ([((((()()())){}){}){}](()([()](()({}([((((()()()){})))[]])[]({}({})[{}]()({}((()(({}){}){}){}){}())))[][][][][][]))[]))(((()[]){}){({}[()()])}{})
Needle:   ([((((()()())){}){}){}](() [()]   ({}([ (((()()()){})) []])[]({}({}     ()(  ((()(({}){}){}){}){}())))[]              ))   ()  )
Nitrodon
źródło
Byłem pewien, że to się skończy jak ten
H.PWiz
To z pewnością działa , ale jakoś przekonałem się, że Nto 77 zamiast 78, więc tego nie złapałem.
Nitrodon,
Twój i tak jest krótszy.
H.PWiz
Ciekawe rozwiązanie! Dodałem moje zamierzone rozwiązanie do oryginalnego postu, jeśli chcesz je zobaczyć.
Wheat Wizard
5

Haskell

Odpowiedź Cracks @ Laikoni .

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

Wypróbuj online!

Oryginalny kod:

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"

zastępując usunięte znaki podkreśleniami:

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

Jak Needlejest zbudowany: ciąg znaków na końcu kodu jest podzielony na słowa. Pierwszy znak każdego słowa jest zwiększany tyle razy, ile znaków w słowie, np. Haysta-> Hplus 6 znaków -> N.

nimi
źródło
5

Sześciokąt , 17 bajtów, H.PWiz

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

Wypróbuj online!

Porównanie z oryginałem:

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

Wyobrażanie sobie:

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

Wyjaśnienie

Znaki bonusowe - wykorzystuje wszystkie 6 adresów IP i wszystkie komórki oprócz jednej!

Coloured paths

Adres IP # 0 zaczyna się od czarnej ścieżki prowadzącej do ].
Następnie przechodzimy do adresu IP nr 1, który biegnie czerwoną ścieżką, drukując, Na N;następnie zawijając z powrotem w ]ponownie.
Następnie przejście do IP # 2, który głowice wzdłuż niebieskiej ścieżce, przechowywania ew bieżącej komórce pamięci, a następnie po zielonej ścieżce, wykonywanie (z odbiciem w \) ;;(;która drukuje ee, Zmniejsza komórkę pamięci z eaby dnastępnie drukuje d.
Adres IP jest kontynuowany wzdłuż pomarańczowej ścieżki, wykonując, Nl;sektóry drukuje li zapisuje ew bieżącej komórce pamięci. Kontynuuje wzdłuż brązowej ścieżki, drukując za epomocą;. W tym momencie już wydrukowaliśmy Needle, więc reszta właśnie się kończy. Adres IP przechowuje c, a następnie trafia ]. Następnie przechodzimy do IP # 3, który podąża niebieską ścieżką, uderzając , odbijając się, w który odbija się . Następnie przechodzimy do adresu IP 4, który podąża zieloną ścieżką, odbijając się , a następnie rozgałęziając do (ponieważ jest dodatni). Na koniec przechodzimy do adresu IP nr 5, który przechowuje następnie za pomocą .
Coloured paths 2
\_]
_\]c
e@

Bobobak
źródło
Ładny! To było zamierzone rozwiązanie.
H.PWiz
4

Python 2 , 123 bajty

Pęknięcia odpowiedzi 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))])

repl.it

Porównanie:

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

Miałem dużo zabawy ze znalezieniem rozwiązań, które wydrukowałem Meedlei Needlfdopasowując wielomian do mediany indeksów symboli numpy, które zaczynają się od każdej z liter Needle. Próbowałem następnie znaleźć podobne współczynniki z podzbiorami oryginalnego programu, ale ostatecznie musiałem uciekać się do brutalnego zmuszania jednego do znalezienia prawidłowego rozwiązania.

jacobly
źródło
Łał! Dobra robota! Nie spodziewałem się, że tak szybko zostanie złamany.
agtoever,
Pierwotnie opracowałem wyzwanie oparte na Numpy 1.13, którego nie znalazłem w żadnym środowisku replikacji, więc musiałem przepisać go na Numpy 1.12 ... ;-)
Agtoever
2

JavaScript, 91 bajtów

_=>(+{}+[])[+[]]+([][[]]+[])[3]+([][[]]+[])[3]+([][[]]+[])[2]+(![]+['t'])[2]+([][[]]+[])[3]

Rozbija to . To było naprawdę fajne.

mój zaimek to monicareinstate
źródło
2

Galaretka , 14 bajtów

Pęknięcia Odpowiedź Jonathana Allana

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

Wypróbuj online!

Porównanie:

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

Kiedyś œciterację różnych podgrupach dosłownym smyczki, wykorzystywanych tr -ddla każdego możliwego filtra i greped dla Needle. Przyjmując założenie, że żaden z użytych znaków w pierwszym ciągu nie został użyty w odpowiedzi, pozwala znaleźć odpowiedź w czasie krótszym niż 15 sekund.

jacobly
źródło
Dokładnie ten, który miałem na myśli Nebbed+ rublebez żadnego rub.
Jonathan Allan
2

Java (OpenJDK 8), 191 bajtów

Łamie odpowiedź Luke'a Stevena

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

Wypróbuj online!

Usunięte znaki:

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

To sprawia, że docenia 078101101100108101, które zaklęcia Needle.

mleko
źródło
2

Rubin , 149 bajtów

Pęka to: /codegolf//a/144790/74216

Moduł był dość mały, więc napisałem wielowątkową rzecz urodzinową i liczyłem na najlepsze.

Edycja: A potem znalazłem jeszcze krótszą odpowiedź.

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

Wypróbuj online!

Zmiany:

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'
kabina404
źródło
2

dc , 34 bajty

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

Rozbija to . TIO .

Zacząłem od uzyskania reprezentacji numerycznej Haystack (5215583380252484459) i Needle (86197399743589). Następnie dokonałem faktoryzacji tego drugiego, czyli 47 * 432323 * 4242169. Z tego dość łatwo było zrekonstruować te liczby.

Oznaczanie użytych znaków:

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
agtoever
źródło
gg! wiedziałem, że podanie tak dużej liczby to zły pomysł)
cab404,
@ cab404 Ciekawe: czy użyłeś zupełnie innych obliczeń, aby dostać się do 86197399743589?
agtoever
tak, jest znacznie dłużej
cab404
Łał. To niezwykłe. To może być kolejne pytanie kodegolfa: ile jest sposobów na uzyskanie określonego wyniku poprzez usunięcie znaków w wyrażeniu ...
agtoever
Myślę, że wymagałoby to poważnej matematyki, aby obliczyć wszystkie możliwości i udowodnić, że jest ich tylko taka liczba)
cab404
2

Sześciokąty , 19 bajtów, Martin Ender

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

Wypróbuj online!

Porównanie z oryginałem

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

Rozłożony kod

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

Tak więc nigdy nie napisałem nic w Hexagony, ale doszedłem do wniosku, że mam tylko 37 bajtów, że mógłbym wymyślić crack. Martin, mam nadzieję, że wiesz, że dużo włożyłem czasu, próbując to rozgryźć. :)

Mogę się mylić, ale wyjaśnię, co myślę robi ten kod:

Program rozpoczyna się od [, który automatycznie przechodzi do IP # 5. To IP zaczyna się w zachodnim rogu, kierując się [ponownie w stronę, która przenosi go do IP # 4. Stamtąd wykonuje, N;ea następnie kieruje się do południowo-wschodniego rogu i wykonuje ;, odbija się w prawo, ;a następnie zawija, do (którego zmniejsza prąd edo a d. Następnie kontynuuje (z zawijaniem), ...;.a następnie podskakuje do li przechodzi do [ostatniego, przechodząc do adresu IP # 3. Wykonuje ;, >przekierowuje na północny zachód, .a następnie <przekierowuje na zachód, uderzając e, owijając ;i kończąc na@ .

Pełna wersja

Tak się cieszę, że użyłeś normalnego rozmiaru sześciokąta dla programu Igła; Sprawdzałem programy w rozmiarze 19 (dla sześciokąta bocznego o długości 3), kiedy zdałem sobie sprawę, że możesz usunąć dowolną liczbę znaków, a to automatycznie wypełniłoby sześciokąt literą .s na końcu, co znacznie utrudniłoby złamanie. W tej chwili Hexagony jest złym językiem dla tego wyzwania, ponieważ (głównie) każda usunięta postać zmienia całą ścieżkę wykonania programu. To powiedziawszy, lubiłem próbować to wymyślić, nawet jeśli w końcu brutalnie zmusiłem to do końca. :)

Jo.
źródło
Jeśli coś pomieszałem / przegapiłem, daj mi znać.
Jo.
Dobra robota, wygląda to całkiem dokładnie. Porównuję to z tym, co pierwotnie miałem przez weekend.
Martin Ender
1

Java (OpenJDK 8) , 151 bajtów

Pęknięcia Odpowiedź Kevina Cruijssena

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

Wypróbuj online!

Porównanie:

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

Czuję, że ostatnia część nie była zamierzona.

jacobly
źródło
Lol, ok, to sprytny sposób na zrobienie „Edle”. Podczas zabawy, myślałem już, że zrobiłem trochę za dużo i byłoby możliwe mnóstwo rozwiązań ..;) Zamierzonym rozwiązaniem było: 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());}(nie wiem, dlaczego dołączyłem BigInteger, ponieważ wystarczy tablica bajtów ..) , ale ja lubię twoją lepiej .. :)
Kevin Cruijssen 10.10.17
1

Brain-Flak , 102 bajty

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

Pęknięcia odpowiedź H.PWiz użytkownika .

Wypróbuj online!

((((((((((()()()){}){}()){}){}()){}()))<({}[(()()()()){}])(([[]]({})<>)<>)>((()()())){}{})[()]))<[[]()]>((()){}){}((){}[][(<>){}<>])(<>){}(({}<>()[()])[(((()()()){}<[()]>)<(()){}>{}){}()])
 (((((((((()()()){}){}  ){}){}()){}()))      ()()                   <>)     (()()()) {}    () ) <      >((()      ((){}    <>)     )   )  (({}        )[(((()()  ){}  ()  )  () {}   ){}()])
Nitrodon
źródło
1

Java autorstwa 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

Wystarczy usunąć pętlę, która dodaje siano, a na stosie nie pozostanie nic oprócz igły.

Tytus
źródło
Ha, fajnie - właściwie nie myślałem o zwykłym usunięciu pętli! Usunięcie equalsmetody działa równie dobrze.
Jonathan S.,
0

Pyt , 21 bajtów

Kr."Dn2û"2+Kr."EL8"Z

pęknięcia to .

Wypróbuj online!

Leaky Nun
źródło
Oczywiście miło. To była tylko pierwsza próba, więc crack był dość trywialny ;-)
Mr. Xcoder,
0

T-SQL przez phroureo , 757 bajtów

seleCT 'Needle'

Jakoś nie sądzę, że to było zamierzone rozwiązanie. Używa znaków otoczonych przez {}:

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)
Robert Fraser
źródło