Rozszyfruj kod źródłowy [wątek robbera na próby włamania]

44

To jest wątek towarzyszący głównemu wyzwaniu Rozszyfruj kod źródłowy . Jeśli uważasz, że udało ci się rozszyfrować jedną z odpowiedzi policjanta, powinieneś opublikować swoje rozwiązanie jako odpowiedź na ten wątek.

Przypominamy, że masz jedną próbę złamania każdego zgłoszenia. Twoja próba włamania będzie niezakodowaną wersją kodu źródłowego. Jeśli twoje zgadywanie pasuje do opisu (te same znaki, dane wyjściowe i oczywiście język), a ty jesteś pierwszym trafnym zgadnięciem, to wygrywasz punkt. Ważne jest, aby pamiętać, że twój program nie musi dokładnie pasować do oryginału, wystarczy użyć tych samych znaków i mieć tę samą funkcjonalność. Oznacza to, że może istnieć więcej niż jedna poprawna odpowiedź.

Złodziej z największą liczbą punktów (udane pęknięcia) wygrywa.

Tabela liderów

Zbyt wiele rozwiązań

20 rozwiązań

15 rozwiązań

10 rozwiązań

7 rozwiązań

5 rozwiązań

4 rozwiązania

3 rozwiązania

2 rozwiązania

1 rozwiązanie

PhiNotPi
źródło
1
Perl 5, rozmiar 27, autor: Morot - print'pin '= ~ tr (a-za) (za-z) r
@ WumpusQ.Wumbley Wszyscy tam byliśmy ...;)
Martin Ender
3
Nie chcę marnować czasu, próbując go uspokoić.
Biorąc pod uwagę dwa ciała pytań, wydaje się, że zaszyfrowane / nieszyfrowane odpowiedzi są odwrócone
Mooing Duck
Ruby, 23 według MegaTom = p% ++. Metody [80] [1 ..- 1]
histocrat

Odpowiedzi:

32

CJam, rozmiar 20, autor: Martin Büttner

Hi "petStorm!", mame

Wypróbuj online.

Jak to działa

Hi                      "           int(17)                     ";
   "petStorm!",         "                    len('petStorm!')   ";
                ma      "     atan2(       ,                 )  ";
                  me    " exp(                                ) ";
                        " exp(atan2(int(17), len('petStorm!'))) ";

Złamanie kodu

Pożądanym wyjściem 2.956177636986737jest Double lub Double, po którym następuje Long.

Używając tylko znaków w "Stop, Hammer time!", są cztery wbudowane operatory, które zwracają liczby nie będące liczbami całkowitymi:

  • mS, który jest asin
  • ma, który jest atan2
  • me, który jest exp
  • mt, który jest tan

Wszystkie zawierają m, więc możemy użyć maksymalnie trzech z nich. Jest tylko jeden Si jeden a.

Wszyscy operatorzy potrzebują danych wejściowych i majako jedyny zużywają dwa dane wejściowe. Mamy tylko trzy sposoby na popchnięcie Longsa:

  • "...",, która przesuwa długość łańcucha (ściśle mniej niż 18).
  • H, która popycha 17.
  • ...!, która wypycha logiczne NIE ....

Nie mamy możliwości popchnięcia czegoś falsy jako ..., więc ostatnia opcja zawsze spowoduje pchnięcie 0.

Dane wyjściowe nie zaczynają się ani nie kończą na 17lub 0. Ponieważ 15 cyfr dziesiętnych jest zwykłą liczbą cyfr dla Double, wydawało się prawdopodobne, że wynik był prostym Double.

Zakładając to, kod musi należeć do jednej z następujących kategorii:

  • <Long> <mS|me|mt>{1,3}
  • <Long> <mS|me|mt>{x} <Long> <mS|me|mt>{y} ma <mS|me|mt>{z}.
  • Dowolne z powyższych, z niektórymi rzutami na Long ( i) lub rounding ( mo) na Double.

W drugim przypadku x + y + zjest to 1 lub 2, a jeden z Longs ma wartość 0 lub 17.

Reszta to w zasadzie brutalna siła. Po kilku próbach

18 , {H \ ma me 2.956177636986737 =} =

wrócił 9, co oznacza, że

H 9 ma me

produkuje pożądaną moc wyjściową.

Pozostało tylko wyeliminować wszystkie ciągi oprócz 9 znaków. Spacje to noops i ijest to noop na Longs, więc "petStorm!"jest to jeden z możliwych wyborów.

Dennis
źródło
1
To szalone - jak wymyśliłeś numer?
Sp3000,
1
Przeszukałem logarytm (i inne) tej liczby, ale nie uzyskałem żadnego wyniku. Teraz odkryłem, że używam zbyt wysokiej precyzji.
jimmy23013
2
@ Sp3000: Zredagowałem swoją odpowiedź.
Dennis,
1
Bardzo dobrze! Powinienem był wyciągnąć jeszcze dwa znaki z ciągu. W moim oryginale faktycznie miałem spacje wciąż wewnątrz sznurka, ale mrprzed wzięciem długości. Nie dlatego, że w pewnym momencie nie wymyślisz tego. ;)
Martin Ender,
25

Python 3, rozmiar 12, autor: xnor

()and bciprt

Nic nie robi (wyrażenie tworzy pustą krotkę, która nie jest drukowana). Działa to z powodu oceny zwarcia.

matsjoyce
źródło
1
W Pythonie 3 IDLE to wyprowadza ().
Hosch250,
@ hosch250 Ponieważ jest w programie (plik python), nic nie jest wyprowadzane, ponieważ nie ma go print.
matsjoyce,
Widzę. Uciekałem przed wierszem poleceń.
Hosch250,
47
.... „rzecz” ....
TheDoctor
4
@Imray Z powodu zwarcia - Python ładuje krotkę i sprawdza, czy wartość krotki jest prawdziwa, ponieważ jest pusta, jest fałszywa. Kod ładujący zmienną bciprtnigdy nie jest wykonywany, więc nigdy nie wywołuje błędu NameError.
Mateon1,
20

Python, rozmiar 74, autor: xnor

any(print(set is
set)for i in oct(chr is
map))and aeeeeeggiilnnpprrrrrstvw

To była zabawa. Dzięki FryAmTheEggman, hosch250 i isaacg za sugestie / pomoc.

Sp3000
źródło
1
Dobra robota! Moje rozwiązanie było dość podobne: list(\nprint(range is range)for aacdeeeeehmppprrrrssvwy in\noct(int is int)).
xnor
@ xnor LOL nazwa tej zmiennej. Czy to źle, że nigdy bym o tym nie pomyślał? : P
FryAmTheEggman
2
@FryAmTheEggman Myślę, że wszyscy spodziewali się, że użyję sztuczki od mojego pierwszego gliniarza .
xnor
@FryAmTheEggman Nie martw się, nie jesteś jedyny: P
Sp3000
13

Python 2, rozmiar 50, autorstwa Geobits

print 2**2**2*2**2-22-2**2**2**2/2**2**2**2**2/2/2

Wyjścia 42.

Ypnypn
źródło
1
Miej print 2**2**2**2/2**2**2/2**2**2/2-2**2**2*2**2-22rację :) Dla porównania, oryginał był , ale nic dziwnego, że więcej niż jedna opcja jest poprawna.
Geobits
13

GolfScript, rozmiar 13, autor: Peter Taylor

,22,{.4&?+.}/

Sprawdź to tutaj.

Kolejny, który złamałem tylko z dużą pomocą Sp3000. Dzięki!

Oto jak się tam dostaliśmy. Sp3000 zauważył w wynikach kilka serii kolejnych liczb:

1,2,3,4,[2608852181],4582,4583,4584,4585,4586,[253225388392299],
142924,142925,142926,142927,142928,[302928],497409,497409

Na tej podstawie przyjęliśmy założenie, że jest to rosnąca sekwencja, która pozwoliła tylko na jeden możliwy podział pozostałych liczb:

1,2,3,4,260,885,2181,4582,4583,4584,4585,4586,25322,53883,92299,
142924,142925,142926,142927,142928,302928,497409,497409

To 23 liczby, co było silnym wskaźnikiem powtórzenia bloku 22 razy, a także zakończenia bloku za pomocą .(duplikatu górnego elementu stosu), tak że poprzedni wynik został pozostawiony na stosie i tak, aby ostatnia iteracja pojawiła się na stos dwa razy. To 22,{____.}/.

Teraz, patrząc na luki, okazują się, że są to 4 moce (co jest miłe, ponieważ mamy 4i ?). Dokładniej, są czwartą potęgą indeksu aktualnej liczby. Następnie przyjrzeliśmy się, które indeksy stworzyły lukę:

4,5,6,7, 12,13,14,15, 20,21,..?

Są binarnie

00100
00101
00110
00111
01100
01101
01110
01111
10100
10101

Wszystkie mają trzeci zestaw bitów, co oznacza, że ​​indeks jest prawdopodobnie tylko bitowy i opatrzony 4(co jest znowu fajne, ponieważ możemy zrobić kolejny za 4pomocą .i mieć a &). Działa to szczególnie dobrze, ponieważ operacja ta powoduje albo, 0albo 4, a jeśli użyjemy tego jako wykładnika, otrzymamy jedną 1lub czwartą moc, która jest dokładnie tym, czego potrzebujemy. Złóżmy to razem:

22,{.4&?+.}/

Oto, co robi blok:

.      # Duplicate current index
 4     # Push a 4
  &    # Bitwise and
   ?   # Raise index to resulting power
    +  # Add to previous result
     . # Duplicate for use in next iteration

Teraz pozostały dwa problemy: mieliśmy błąd, ,którego jeszcze nie wykorzystaliśmy, a pierwsza iteracja jest szczególnym przypadkiem, ponieważ nie ma żadnej wartości z poprzedniej iteracji, do której moglibyśmy dodać rzeczy podczas spotkania +. Odkryliśmy, że dzięki niepowiązanemu komentarzowi użytkownika23013, który od niechcenia wspomniał, że GolfScript zaczyna się od pustego łańcucha na stosie (jeśli nie ma nic na STDIN). Mogliśmy więc użyć tego drugiego ,prawa na początku, aby zamienić ten ciąg w a 0, i właśnie tego potrzebowaliśmy jako początku iteracji.

Martin Ender
źródło
Spot on. Inspiracją była sekwencja w OEIS, której nie mogę teraz znaleźć.
Peter Taylor
3
I dlatego dobrym pomysłem jest posiadanie osobnego wątku dla rabusiów. Dobra robota!
Dennis
11

Python 3, rozmiar 16, autor: matsjoyce

import __hello__
Martin Ender
źródło
1
Bah, pokonany o 20 sekund> <
Geobits
Zgadza się, jeden punkt do Ciebie (czy powinniśmy też mieć listę z tymi informacjami?)
matsjoyce,
11

Ruby, rozmiar 17, autor Doorknob

p 2,%r~n~i=~'*tN'

To była świetna zabawa. Dzięki Sp3000 za pomoc w tym! Dowiedziałem się, że %r?...?literały mogą mieć dowolne ograniczniki. :)

Martin Ender
źródło
10
Rekwizyty do Doorknob do bycia z szalenie mylące print, tylko podzielić go na pdo druku, %rdla regexes i iprzez przypadek-niewrażliwe regex dopasowywania.
Sp3000,
11

PHP, rozmiar 49, autor: bwoebi

print@substr(new exception,+~$$a+=++$$m+$$i+2+n);

To było absolutnie mentalne .

Musiał

print@substr(new exception,);

dość szybko, w tym momencie potrzebowałem czegoś, co daje -6po przecinku, po $++$++$++$+=$~main$2wyjściu.

Głównym haczykiem jest to $a, $mi $iwszystkie są NULL, więc użycie ich pośrednio w zmiennych zmiennych oznacza, że ​​wszystkie wskazują na tę samą zmienną. Wydaje się jednak, że PHP robi dziwne rzeczy w zakresie rozwiązywania zmiennych zmiennych. Za pomocą normalnych zmiennych możesz robić takie rzeczy

echo $a+$a=2;

który drukuje 4( 2jest przypisany, $aa następnie dodany do siebie). Ale jeśli zrobię to samo ze zmiennymi zmiennymi:

echo $$a+$$a=2;

Rozumiem 2, ponieważ teraz pierwszy $$ajest oceniany przed zadaniem.

W końcu udało mi się wymusić pewien porządek, wprowadzając pewne przyrosty RHS, +=które musiały zostać ocenione przed tym przypisaniem dodatkowym. W ten sposób doszedłem do tego, 5co mogłem uzupełnić. Nadal ... dzieje się kilka tajemniczych rzeczy i nie mam pojęcia, dlaczego połowa rzeczy, które próbowałem, działała, a nie działała.

Martin Ender
źródło
Dla porównania, mój oryginał:print@substr(new exception,~$$mn+=2+$$a+++$$i++);
bwoebi
Btw. Mam nadzieję, że wszystkie znaki dolara i fakt, że wszystkie litery mainbyły w łańcuchu, bardzo was wprowadzają w błąd. Poza tym, jak {main}sądzę , dość nietypowa metoda wyodrębniania ;-)
bwoebi
@bwoebi mainnaprawdę nie wprowadzać w błąd mnie po plamienia exception, newi substr. Myślałem, że będą to tylko nazwy zmiennych. Trochę mi zajęło wymyślenie zmiennych zmiennych i przez większość czasu zastanawiałem się nad kolejnością operacji, które faktycznie dałyby wynik, 5który mógłbym uzupełnić bez użycia innego zestawu nawiasów.
Martin Ender,
Cóż, następnym razem, jeśli jest więcej dolarów niż znaków, zwykle są to zmienne zmienne. (W tym przypadku nadużyłem również varvarów, aby wymusić ocenę od lewej do prawej.) Jak długo zajęło ci wykrycie nowego wyjątku? Nawiasem mówiąc, mam głębszą wiedzę na temat silnika Zend, więc mogę doskonale wytłumaczyć, dlaczego rzeczy są oceniane w jakiej kolejności i co jest miłe w przypadku tych wyzwań ;-) Jeśli jest coś szczególnego, czego nie dostaniesz, ja ' Z radością ci to wyjaśnię.
bwoebi
@bwoebi Przyjdź jutro na czacie i możemy o tym porozmawiać, ale dzisiaj spędziłem na tym wystarczająco dużo czasu. ;) Co do twojego pierwszego pytania, exceptionbyło oczywiste, co pozostawiało zbłąkane postacie substri newleżały. To była dosłownie pierwsza rzecz, jaką zobaczyłem, kiedy zaczynałem nad tym pracować.
Martin Ender,
9

Ruby, rozmiar 38, autor Doorknob

[$><<(!$pece60).to_s[rand($win)].succ]

Jestem prawie pewien, że to nigdzie w pobliżu oryginalnego źródła. Jest deterministyczny pomimo użycia rand.

Oto jak to działa. $><<jest po prostu wyjściem. $pece60i $winsą niezdefiniowanymi zmiennymi globalnymi, które są po prostu nil(i pozwoliły mi pozbyć się obcych znaków). !$pece60tworzy a truei to_sdaje ciąg "true".

Przez wieki próbowałem uzyskać dostęp do 2lub tam, ale potem zdałem sobie sprawę, że mogę po prostu wziąć i zadzwonić na (era), aby zrobić .-2ut.succu

randz nilparametrem zwraca losową liczbę zmiennoprzecinkową w przedziale [0,1). Używając liczb zmiennoprzecinkowych do indeksowania ciągów, są one obcinane do liczb całkowitych, więc zawsze zwróci pierwszy znak.

W końcu miałem zapasową parę, []więc po prostu wszystko w nią zapakowałem, bo na szczęście wszystko jest wyrażeniem w Ruby.

Dzięki Sp3000 za rozpowszechnianie pomysłów na czacie.

Martin Ender
źródło
8
Ruby to przerażająco wyglądający język.
feersum
8

C, 51 autorstwa es1024

c=0xf.cp9,hhtaglfor;main() {;; printf("%d",(++c));}

Po 20 latach programowania C dowiedziałem się dzisiaj o szesnastkowych stałych zmiennoprzecinkowych.

Sztuka
źródło
8

Ruby, 45 (histocrat)

%q[zyfnhvjkwudebgmaclprs x].to_i(36)/51074892

Łał! To mój pierwszy problem z kodem golfowym i nie mam wystarczającej liczby przedstawicieli, aby skomentować oryginalny post. Natychmiast rozpoznałem zastosowaną sztuczkę, ponieważ często znajdowałem jej zastosowanie w kodzie produkcyjnym. Zrozumienie większości konstrukcji zajęło około 5 minut, a znalezienie pełnej odpowiedzi zajęło kilka godzin.

Wyjaśnienie:

  • %q[]jest alternatywną metodą tworzenia ciągów. Można również użyć nawiasów i nawiasów klamrowych.
  • String#to_i w Ruby przyjmuje liczby w dowolnej bazie od 2 do 36. Zignoruje pierwszy znak w ciągu, który nie jest częścią liczby, więc wszelkie dodatkowe znaki można „wyrzucić” po spacji.

A oto kod, którego użyłem do złamania go:

require 'set'

# return true if the string is made up of unique characters
def uniq(s)
  a = s.each_char.to_a
  return a == a.uniq
end

def uniq_while_same(a,b)
  s = Set.new
  a.each_char.zip(b.each_char).each do |ai, bi|
    return true if ai != bi
    return false if s.include? ai
    s << ai
  end
  return true
end

def ungolf(answer)
  # For each base that even makes sense
  [            36, 35, 34,     32, 31, 30,
   29, 28, 27, 26, 25, 24, 23,     21, 20,
   19, 18, 17, 16, 15, 14, 13, 12,     10].each do |base|
    # Ignore bases where it is not possible to create a unique-string number greater than answer
    next if answer > base ** base
    # Pick digits for the denominator that are not duplicates of the digits in base
    denominator_digits = ('1234567890'.each_char.to_a - base.to_s.each_char.to_a)
    # For each permutation of those digits for the denominator
    (1..10).each do |denominator_length|
      denominator_digits.permutation(denominator_length) do |denominator_s|
        # Maybe the denominator is in octal
        denominator_base = 10
        if denominator_s[0] == '0'
          next if denominator_s.include?('8') || denominator_s.include?('9')
          denominator_base = 8
        end
        denominator_s = denominator_s.join
        denominator = denominator_s.to_i denominator_base
        print "#{"\b"*64}(%q[#{(answer * denominator).to_s(base).ljust(36)}].to_i #{base})/#{denominator_s.ljust(10)}" if rand < 0.01
        # Ignore denominators that are definitely impossible to have answers for
        next unless uniq_while_same "qtoi#{base}#{denominator_s}#{(answer * denominator).to_s(base)}",
                                    "qtoi#{base}#{denominator_s}#{((answer + 1) * denominator).to_s(base)}"

        # For each numerator that gives answer when divided by the denominator
        (answer * denominator...(answer + 1) * denominator).each do |numerator|
          print "#{"\b"*64}%q[#{numerator.to_s(base).ljust(36)}].to_i(#{base})/#{denominator_s.ljust(10)}" if rand < 0.01
          # Remove any that are still not unique
          s = "#{numerator.to_s(base)}#{base}#{denominator_s}qtoi"
          next unless uniq s
          # Done. Compute which characters need to be thrown away to fill the remaining space
          remains = ('0123456789abcdefghijklmnopqrstuvwxyz'.each_char.to_a - s.each_char.to_a).join
          print "#{"\b"*64}#{" "*64}#{"\b"*64}"
          return "%q[#{numerator.to_s(base)} #{remains}].to_i(#{base})/#{denominator_s}"
        end
      end
    end
  end
  print "#{"\b"*64}"
  puts "\nnone"
  return nil
end


print ungolf 9410663329978946297999932

Sposób na osadzenie problemu NP w zagadce. Byłem bardzo ostry jak kujon. Dobra robota!

charredUtensil
źródło
Dodałem komentarz do oryginalnej odpowiedzi.
FireFly,
Jest to niesamowite (i zbliżone do zamierzonej odpowiedzi), ale technicznie nie jest poprawne, ponieważ nie ma danych wyjściowych.
histocrat
* facepalm Cóż, nadal dobrze się bawiłem.
charredUtensil
2
@charredUtensil, jeśli nie masz nic przeciwko uruchomieniu skryptu, myślę, że drukowanie przesuwa znak pdo przed wyrażeniem. Przypuszczalnie pozostałe postacie można wykorzystać do utworzenia stałych, tak jak to zrobiliście.
FireFly,
Nie muszę go ponownie uruchamiać. Kilka ostatnich znaków ciągu można zmienić bez zmiany wyniku - p %q[zyfnhvjkwudebgmaclrsx].to_i(36)/51074892wiem, że jednak złamałem swoją próbę złamania :)
charredUtensil
7

Powłoka Python [dowolna], rozmiar 44, autorstwa Caridorc

__name__[3]  or (enfin_____[42], manager[1])

Jestem pewien, że miało to być coś więcej, ale ponieważ __name__jest to równoznaczne __main__, czwarty znak „a” jest wybierany, a reszta linii nigdy nie jest oceniana.

piskliwy kostuch
źródło
Dla odniesienia oryginalny program to[__name__ for ___name__ in range(1,4)][2][3]
Caridorc
7

CJam, rozmiar 13, autor: user23013

G,Cf#If/sE*K%

Sprawdź to tutaj.

Rozwiązane ręcznie, tak:

Po pierwsze, pewne tło dla osób niebędących CJammerami:

  • CEGIKsą wszystkie zmienne, które są wstępnie inicjalizowana 12, 14, 16, 18, 20, odpowiednio.
  • s konwertuje element najwyższego stosu na ciąg.
  • Ciągi są technicznie tylko tablicami znaków.
  • fto całkiem magia. Dla celów tej odpowiedzi wersja uproszczona polega na tym, że dla tablicy a, innej wartości bi operatora gsekwencja jest abfgodwzorowywana g(_,b)na a(gdzie każdy element awchodzi do _szczeliny).
  • / to dzielenie i dzielenie tablic (między innymi).
  • * to mnożenie i powtarzanie tablic (między innymi).
  • %to modulo i jakaś dziwna operacja, która w postaci ad%tablic ai liczb całkowitych dprzyjmuje każdy dth element a(jak krojenie Pythona z krokami szerokości d).
  • # jest potęgowanie (między innymi).
  • ,zamienia liczby na zakresy (od 0do n-1) i zwraca długość tablicy.

Okej, to na uboczu ...

Było dość oczywiste, że musimy ,zamienić liczbę na zakres, ponieważ jedynym innym sposobem na uzyskanie tablicy byłoby zbudowanie większej liczby i przekształcenie jej w tablicę znaków za pomocą s- ale wtedy nie moglibyśmy zrobić żadnej dalej na tym arytmetyka. I potrzebujemy tablicy, aby zrobić coś z fs.

Najpierw założyłem, że fużywamy s #i %, ale oznaczałoby to, że potrzebowalibyśmy liczby około 90, aby uzyskać odpowiednią liczbę cyfr na końcu. Nie wyjaśniło to również, co z tym zrobić s, a ponieważ odpowiedź wyglądała naprawdę golfowo, wątpiłem, by user23013 po prostu dodał sjako skuteczny zakaz, by zrzucić ludzi.

Pomyślałem, że może nawet nie utrzymuje liczb na małym poziomie %, ale zamiast tego buduje tablicę ogromnych liczb, łączy ich reprezentację łańcuchową s, ale potem wybiera z niej tylko jakiś dziwny kawałek %. Więc bawiłem się trochę z następującymi ramami:

__*,_f#_f/s_%

(Nie możesz zrobić _f/pierwszego, ponieważ to dałoby zero dla co najmniej pierwszych 12 elementów.)

Gdzie _są niektóre permutacje zmiennych. Nie próbowałem wszystkich, zanim się nudziłem, a głównym problemem było to, że wynikowa sekwencja cyfr jak zawsze była o wiele za długa.

W pewnym momencie przyszło mi do głowy, że nie potrzebowalibyśmy tak dużego zakresu (iloczynu dwóch liczb), gdybyśmy zamiast tego użyli tego *do powtórzenia otrzymanego ciągu. Z powodu niedopasowania parametrów *i %nie spowoduje to powtórzenia w wyniku:

_,_f#_f/s_*_%

To dało wyniki o długości bardzo zbliżonej do tego, czego szukałem. Wypróbowałbym wszystkie 240, ale dość szybko (trzecia lub czwarta próba) natknąłem się

E,Cf#If/sG*K%

co daje

03081942753650251594592190492275006661328850322159030034930530649722385533653290754678977

Doszedłem do wniosku, że dopasowanie pierwszych sześciu cyfr nie będzie przypadkiem. Pytanie brzmiało więc, jak zmienić jego kolejność bez zakłócania rzeczywistych obliczeń:

  • Nie mogłem się zmienić, Kponieważ wybrałoby to zupełnie inne cyfry.
  • Nie mogłem zmienić Club Iponieważ to zmieniłoby liczby wynikające z dwóch operacji mapy.
  • Gdybym to zmienił G, zmieniłoby to tylko liczbę powtórzeń, co nie zrobiłoby nic poza zmianą długości wyniku. (Co jest dobre.)
  • Gdybym to zmienił E, zmieniłoby to zakres tablicy, ale zakres nadal zaczynałby się od [0 1 2 3 ...], więc nie wpłynęłoby to na obliczenia. Wpłynęłoby to na długość zwracanego ciągu podstawowego s, co oznaczałoby również, K%że wybrałby różne cyfry po dodatkowych powtórzeniach.

Więc po prostu starał swapping Ei Gi voila:

030819828850379075460427536222159187897761502517030034671154875945928930530907551421904962649729

Podsumowując, oto, co robi kod:

G,            "Push [0 1 2 3 ... 13 14 15].";
  Cf#         "Raise each element to the 12th power.";
     If/      "Divide each element by 18.";
        s     "Concatenate all numbers into a string.";
         E*   "Repeat 14 times.";
           K% "Pick every 20th digit.";
Martin Ender
źródło
6

Pyth, rozmiar 11, autor: isaacg

:\\w$ ",d,N

To pewne złośliwe nadużycie w tym miejscu. To kompiluje się do:

Pprint("\n",at_slice("\",input(), ",d,N))

Istotnym błędem jest to, że \\kompiluje się "\"zamiast "\\", co pozwala kompilować Pyth w ciąg.

Martin Ender
źródło
Powinien Pprintbyć print, a przynajmniej pprint?
FireFly,
@FireFly Tak właśnie powiedział wynik debugowania. Może interpreter Pyth definiuje własny Pprint?
Martin Ender
No dobra, nieważne.
FireFly,
6

Python, rozmiar 69, autorstwa Sp3000

print(sum(list(map(ord,str((dict(((str(dict()),list()),)),str()))))))

To było trudne...

grc
źródło
1
Miły! Dla porównania, oryginał był print(sum(map(ord,str((dict(list(((str(),str(dict())),))),list()))))), ale oczywiście działałoby wiele różnych kombinacji słów kluczowych.
Sp3000,
2
To jest poziom PISN na poziomie LISP!
xnor
6

Python 3, 37 bajtów, autor: Sp3000

print(sum(b"a".zfill(len(str(...)))))

Żenująco zdecydowanie najtrudniejsza była próba przekształcenia łańcucha na bajty. Musiałem na nim spać, a w nocy zdałem sobie sprawę, że to jest dosłownie bajt!

Blake Walsh
źródło
Ahaha ładnie zrobione, myślałem, że Ellipsis może potknąć ludzi, ale chyba nie
Sp3000,
Widziałem elipsę i zfill, ale nie wiedziałem o obiektach bajtów. Te mogą być przydatne w golfowych tablicach liczb całkowitych!
feersum
Dobra robota! Widziałem tylko wydruk i .zfill i wiedziałem, że suma może być jego częścią, ale nie mogłem go rozwiązać. Masz +1.
Hosch250,
6

PHP, 53, PleaseStand

Nareszcie go złamałem:

for($d=57,$o=35;$o+$d<999;)$o+=printf("$d%o",$d+=$o);

Rozwiązanie pojawiło się dość szybko, gdy zauważyłem, że sekwencja składa się z naprzemiennych liczb dziesiętnych i ósemkowych:

Dec: 57...92...132...177...228...285...348...417...492....573....661....756....858....
     571349220413226117734422843528553434864141775449210755731225661136475615328581707
Oct: ..134..204...261...344...435...534...641...754...1075...1225...1364...1532...1707
==Dec:  92  132   177   228   285   348   417   492    573    661    756    858    967

Ponadto odstępy między każdym zestawem liczb rosły w tempie równym wartości zwracanej przez printf()(tj. Liczbie zapisanych znaków).

piskliwy kostuch
źródło
3
Wow, niezła praca detektywistyczna!
Sp3000,
6

Python 2, rozmiar 132, autorstwa Vi.

exec('from string import printable as e\nprint "cqance"\x2Ereplace("q",e[len("fgiillmmooprrsstt")])or ",,,\016:::S[]____tuuvyy" ""')

Dzięki za wszystkie ukośniki odwrotne i cudzysłowy :)


Edycja: zaktualizowana wersja z 96 znakami:

exec "try:exec'from __future__ import braces\\nt(12)'\nexcept SyntaxError as q:print(q[0][6:])"

Zostało to całkowicie zaczerpnięte z rozwiązania Alexa pod adresem https://codegolf.stackexchange.com/a/41451/32353

kennytm
źródło
Hej, miło. Zastanawiasz się, co to było rozwiązanie ...
FireFly,
To nie jest zamierzone rozwiązanie. Oryginalne rozwiązanie nie zawiera żadnych „wyrzucanych” rzeczy, takich jak fgiillmmooprrssttlub ,,,\016:::S[]____tuuvyy.
Vi.
exec? Mój kod mógłby być krótszy ... emulowałem go za pomocą compile+, evalponieważ zapomniałem o exec...
Vi.
Wdrożono krótszą wersję. Spróbuj wymyślić oryginalną sztuczkę.
Vi.
5

CJam, rozmiar 15, autor: Ypnypn

98,{7%}%{6+}%:+

Z podanych postaci zgadłem, że musiała to być jedna z trzech następujących form:

__,{_%}%{_+}%:+
_,{_%}%{__+}%:+
__,{_+}%{_%}%:+

który tworzy dwucyfrowy zakres, a następnie mapuje operację dodawania i modulo (w dowolnej kolejności) na zakresie przed zsumowaniem. Zacząłem więc od pierwszego i systematycznie próbowałem permutacji 6789w lukach.

Martin Ender
źródło
Cholera, ja też to rozwiązałem: /
Optimizer
5

PHP, rozmiar 52, autorstwa PleaseStand

for(mt_srand($i=46);$i--;)echo chr(mt_rand()%95+32);

W końcu okazało się to dość łatwe. Wyjście wygląda bardzo przypadkowe, a postacie m, t, _, r, a, ni dwszystko dwa razy pojawił się ...

piskliwy kostuch
źródło
5

Python 2, rozmiar 61, autor: FryAmTheEggman

print(dir('~s]l.c:st_''-p_tp.l]-~.:o:Te[_u[.i_')[10][2:][:3])

Byłbym bardzo zaskoczony, gdyby to pasowało do oryginału.

grc
źródło
Nie, ale i tak gratuluje! Mój kod brzmiał:print''.__doc__[::2][::3].split()[1].split('.')[0][:-~-~True]
FryAmTheEggman,
Z perspektywy czasu nie powinienem był zamieszczać cytatów ...;)
FryAmTheEggman
@FryAmTheEggman Oh wow - fajny program! Byłem przekonany, że przynajmniej dir()znalazłeś „dostać”. I tak, bez cytatów byłoby to bardzo trudne.
grc
5

Python 3, Sp3000, rozmiar 44

print(~(~(()<((),))<<(()<((),))))<<((()<()))

Python 3 pomógł mi tutaj, ponieważ mogłem spowodować błąd (przesunięcie w lewo Noneo coś) po wydrukowaniu odpowiedzi.

feersum
źródło
Hmm ... wygląda na to, że marnowałem swoje pareny. Miał print(~(~(()<())<<((()<((),))<<(()<((),)))))pierwotnie.
Sp3000,
5

PHP, rozmiar 52, autor: kenorb

_:@print_r(chr(@++$i+pow(3<<5,1)));if($i<2*4)goto _;

(Boże, ile czasu zajęło mi ustalenie, co zrobić z pozostałym _rsufiksem. Dopóki nie zauważyłem, że tak nie było print, ale print_r...)

Bwoebi
źródło
I nie wiem jak się ustalić to :) oryginalny: _:print_r(chr(3*pow(2,5)+@++$i));if(@$i<4<<1)goto _;.
kenorb
3
@kenorb a) musisz coś wydrukować, więc echonie jest to możliwe; printpozostał; b) potrzebujesz trochę pętli, ale dla forpętli nie było wystarczającej liczby średników, no cóż, jest dwukropek ... więc prawdopodobnie jest tam etykieta w połączeniu z goto; c) wtedy konieczne jest przerwanie pętli goto. Posiadanie teraz X:print($Y);if($Y)goto X;(X i Y są symbolami zastępczymi); d) jest ++, ale nie =, więc prawdopodobnie niektóre ++$Zod 1 do 8; e) aby uzyskać litery z liczby całkowitej, potrzebujemy chr()(zwykle) - tam była; f) teraz musiałem tylko znaleźć numery 96 i 8 dla chr i if. Następnie wypełnij symbole zastępcze i volià.
bwoebi
5

PHP, rozmiar 54, autor: Steve Robbins

echo(21<<($$$$$$${$aaaabbbbbbehi==$l&$w^2}^1==1));;;;

Myślę, że to nie oryginalne rozwiązanie.

jimmy23013
źródło
2
Haha, to cudownie. Zacząłem od wyławiania echoi while, ale potem nie udało mi się znaleźć pętli, która daje 42.
Martin Ender
Był whilew moim oryginale.
Steve Robbins,
5

C, es1024, długość 70

e='C',f;main(g){Chorkil:f=printf("40%.d",e+e-  -g);}hAx;*hotpoCkats();

Trudność polegała na tym, aby śledzić wszystkie niepotrzebne postacie ... poważnie ... Musiałem je przerobić około 10 razy. Jedyne, co mnie martwiło, to to, .że jakoś utknąłem w środku ciągu printfformatu i stało się to niewidoczne!

feersum
źródło
5

Haskell, rozmiar 34, autor: Petr Pudlák

main=print(0xb2f3d5^0x7f1f27::Int)

Pamiętaj, że ten program musi być uruchomiony na komputerze 32-bitowym. Jeśli chcesz sprawdzić, czy jest to poprawny program i masz komputer 64-bitowy, możesz użyć tego:

import Data.Int
main=print(0xb2f3d5^0x7f1f27::Int32)

Odgadnięcie „ramki” programu było dość łatwe main=print(0x<hex digits>^0x<hex digits>::Int). Cała magia polegała na poszukiwaniu właściwego sposobu podziału i porządkowania cyfr. Nie zrobiłem tu zbyt wiele mądrego, po prostu poszukiwania z użyciem siły brutalnej ... chociaż starałem się nadużyć faktu, że niektóre cyfry zostały zduplikowane, prawdopodobnie w bazie i wykładniku znajdowała się prawdopodobnie taka sama liczba cyfr, a ostatnia cyfra bazy prawie na pewno nie była parzysta. Pełny kod wyszukiwania znajduje się poniżej; wykorzystuje pakiet multiset-grzebień . Pełne wyszukiwanie zajmuje około 10:33 na moim komputerze (i oczywiście daje tylko jedną poprawną odpowiedź).

{-# LANGUAGE NoMonomorphismRestriction #-}
import Control.Monad
import Data.Int
import Data.List (inits, tails, group)
import Numeric
import Math.Combinatorics.Multiset

main = print (searchFor (-1121766947))

searchFor n = do
    nl <- [6,5,7,4,8,3,9,2,10,1,11]
    (l_, r_)  <- chooseSubbag nl digits
    l <- perms l_
    guard (last l /= '2')
    r <- perms r_
    guard ((fromString l :: Int32) ^ (fromString r :: Integer) == n)
    return (l, r)

chooseSubbag n = chooseSubbag' n . group
chooseSubbag' n xss = go (drop (n-1) (concat xss)) n xss where
    go _  n xss | n < 0 = []
    go _  0 xss = [([],concat xss)]
    go [] n xss = []
    go m  n (xs:xss) = do
        (kx, tx) <- zip (tails xs) (inits xs)
        (k , t ) <- go (drop (length tx) m) (n-length kx) xss
        return (kx++k, tx++t)

digits = "1223577bdfff"
fromString = fst . head . readHex
perms = permutations . fromList
Daniel Wagner
źródło