Polisler ve Soyguncular: Düzeltilmiş Öncelik (Soyguncuların Konusu)


9

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

Senin zorluğun polisin iş parçacığından kırılmamış bir başvuru almak ve orijinal düzeltilmemiş programı bulmaya çalışmaktır. Lütfen kodunu kırdığınızda polisin başvurusu hakkında yorum yapın.

Yanıtlar:


6

Brainfuck , Jo King

>>>>>+>,[>++++++[-<-------->]<+>,]<[-[█<█<]++++++++++<]>[-]>>██[>█>>█>]+[<]<<[<]>█<<+>>[>]█>[>]█+[<]<<[<]>-█>]>>[->]<[-[[<]<]++++++++++<]>[-]>[<█]>]>[>]<[[█]<]<<<<<[<]<<██>>[>]<█[->+<]<█>>[>]<[-[[<]<]++++++++++<]>███>[<<]>[[[>]>████[<]<[-[[<]<]++++++++++<]>[-]>[█<]>]>[>]<[[-]>+[>]<-<[<]<]+<<<<<[<]>[[>]+[[>]>]>[>]>[-<+>]<[<]<[>+[<]>>-<<<<<[[<]<]>>███████>[[█]>]<]<[[<]<]<[█]>]>>>[[>]<->>]]>[[>]>]<<[[[█]<]<]<<<[█]<<█>>>[>]█[-[[<]<]++++++++++<]>>[[>]+[------->++<]>.+.+++++.[---->+<]>+++.>>]>[>]+[------->++<]>++.++.---------.++++.--------.
>>>>>+>,[>++++++[-<-------->]<+>,]<[-[[<]<]++++++++++<]>[-]>>[[[>]>>[>]+[<]<<[<]>[<<+>>[>]>>[>]<+[<]<<[<]>-]>]>>[->]<[-[[<]<]++++++++++<]>[-]>[<<]>]>[>]<[[-]<]<<<<<[<]<<[>>>[>]<[[->+<]<]>>[>]<[-[[<]<]++++++++++<]>[-]>[<<]>[[[>]>[>]+[<]<[-[[<]<]++++++++++<]>[-]>[<<]>]>[>]<[[-]>+[>]<-<[<]<]+<<<<<[<]>[[>]+[[>]>]>[>]>[-<+>]<[<]<[>+[<]>>-<<<<<[[<]<]>>[[-]+>]>[[>]>]<]<[[<]<]<[<]>]>>>[[>]<->>]]>[[>]>]<<[[[-]<]<]<<<[<]<<]>>>[>]<[-[[<]<]++++++++++<]>>[[>]+[------->++<]>.+.+++++.[---->+<]>+++.>>]>[>]+[------->++<]>++.++.---------.++++.--------.

Çevrimiçi deneyin!

Bu, Eratosthenes'in elekini uygular.

Başlangıçta >>>>>+>,[>++++++[-<-------->]<+>,]her rakam bir karakter kodu olarak girilir ve 1-10 aralığına koymak için 47 çıkarılır. Bu, 0 hücre değerinin sayılar arasındaki boşluğu belirtmesine izin verir. +>Bu bölümde kuvvetlerinin başında yakınında sayısı önemli yakında olacak en az iki basamaklı olmak.

Sonra, ve ilk anladığım şeylerden biri, bölüm <[-[[<]<]++++++++++<]>[-]>. Bu, her biri farklı redaksiyon kalıplarına sahip olan kodda birkaç kez görünür, ancak bu örneklerin hepsinin muhtemelen aynı kod olduğunu tahmin etmek zor değildi. Bu kod, banttaki ondalık sayının solunda üç sıfır gerektirir ve bunun etkisi sayıyı azaltmaktır. Döngünün son yinelemesi, 10 değerini sayının iki hücresinin soluna koyar, ancak [-]temizler.

Ondalık sayı 0 ise, oluşturulmuş yabancı 10 yoktur ve tarafından sıfırlanan hücre [-]en önemli basamaktır. Bant başı daha sonra en önemli ikinci basamaktadır (bu yüzden en az iki basamak gereklidir). Bu snippet'in çoğu örneğini hemen takip eder [<<]>, bu da başı normal olmayan bir hücreye normal koşullarda ve orijinal ondalık sayı sıfırsa sıfır hücreye yerleştirir. Bu programda, ondalık temsilini göstermek n-1için kullanılır n, böylece azalmak 0yerine azalmanın yakalanması anlamına gelir -1.

Bir sonraki bölüm n-1 (n) 'den 0 (1)' e kadar olan sayıları kasete koyar:

>[                      until the number reaches zero:
  [                     for each digit:
    [>]>>[>]+[<]<<[<]>  create a placeholder for the next copy
    [                   while the original value of the digit is nonzero:
      <<+               add 1 to copy two cells left (to keep one copy)
      >>[>]>>[>]<+      go to new copy and increment that cell
      [<]<<[<]>-        go back to original digit and decrement
    ]                   (this is effectively the same as [<+>>+<-] but with the cells at variable locations)
  >]                    next digit
  >>[->]                cancel the placeholder 1s that were used for the new copy
  <[-[[<]<]++++++++++<]>[-]>[<<]> decrement
]
>[>]<[[-]<]      clean up the trash 10s on the tape while ending at a known location relative to the last number

Şimdi, bu sayıların hepsi kasette, onları sıfırlayan iki sıfır hücre var. <<<<<[<]<<bizi, bandın sondan önceki sayının son hücresine yerleştirir, bu da döngünün her yinelemesinde olacağımız yerdir. Orijinal dışındaki tüm sayılar işlendiğinde döngü sona erer.

Döngünün başlangıcında, mevcut sayıyı (bantta sonuncusu hala) bir hücre sağa doğru azaltmak için bir hücre sağa taşıyoruz ve sonra devam edip azaltıyoruz:

[>>>[>]<[[->+<]<]>>[>]<[-[[<]<]++++++++++<]>[-]>[<<]>

Bu azaltma gerçekleşmediyse, sayıyı tekil değere dönüştürmeye devam ederiz:

[[[>]>[>]+[<]<[-[[<]<]++++++++++<]>[-]>[<<]>]

Bu pasajın kapatılmamış olduğunu unutmayın [. Sonuç olarak, sayı 0 ise (1'i temsil ediyorsa) bu döngünün geri kalanı atlanır. Tekli'ye dönüştükten sonra, kalan 10'ları temizleriz, bizimle birlikte tekli temsili sola sürükleriz:

>[>]<[[-]>+[>]<-<[<]<]+

Şimdiye kadar bunu yazana kadar fark etmedim, ancak +bu snippet'in sonunda tekli 0'dan tekli gösterimden ayrılır. Aynı zamanda tekli gösterimin bir parçasıdır: dizi 1011...110 mod k'yı temsil edecektir. Aşağıdakiler <<<<<[<]>bizi sayının başına, k+1yeni bir döngü başlatır.

Buradaki iç döngü, banttaki her sayıyı hemen hücrede bir 1 olacak şekilde "işaretler" ve hangi sayıların katları olduğunu belirlemek için tekli gösterimi saat olarak kullanır k.

[
  [>]+             mark the current decimal number
  [[>]>]           move to end of decimal part of tape
  >[>]             move to 0 in middle of unary "clock"
  >[-<+>]          move the following 1 to the left if possible
  <[<]<            if a 1 was moved this will bring us back to a zero before the start of this "clock";
                   otherwise the looped move command doesn't move us at all and we are at the final 1
  [                if there was no gap (happens every kth iteration):
    >+[<]>>-       reset to original position
    <<<<<[[<]<]>>  go to number that was just marked
    [[-]+>]        replace digits with 0s (cell value 1)
    >[[>]>]<       go back to where we would be without this conditional
  ]
  <[[<]<]<[<]>     return to first unmarked number
]

Bu [[-]+>]bölümde anladığım son bölüm oldu. Bundan önce, programın sadece deneme bölümleri yaptığını varsayıyordum, ancak sonucun nerede kullanıldığını göremedim.

Bu döngü en soldaki numaranın solundaki iki hücreyi bitirir >>>[[>]<->>]]ve kasete yerleştirilen işaretleri kaldırır ve bizi tekrar bandın sonuna götürür. Bundan sonra >[[>]>]<<[[[-]<]<]tekli saati veya tüm segment atlanırsa kalan 10'ları kaldırır. Döngü ile başlangıç ​​durumuna ayarlanır <<<[<]<<].

Bundan sonra, giriş numarasının herhangi bir noktada 1 ile değiştirilip değiştirilmediğini okuduktan sonra:

>>>[>]<[-[[<]<]++++++++++<]>>                      do the check
[[>]+[------->++<]>.+.+++++.[---->+<]>+++.>>]      conditionally print "not "
>[>]+[------->++<]>++.++.---------.++++.--------.  unconditionally print "prime"

Neyse ki, gerçek çıktı hiç düzeltilmedi.


"Gece, günü asla bulamayan uzun." Hala bu gece mi? : P
Stewie Griffin

@StewieGriffin O gece yapamadım ve sonra aklımı kaçırdı. Hatırlatma için teşekkürler.
Nitrodon

Burada yaptığım gibi kendi kodumu da açıklayabilirdim. Güzel iş.
Jo King


5

Beyin Flak, MegaTom

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

Çevrimiçi deneyin!

Bu program n-2'den 1'e kadar deneme bölümleri gerçekleştirir, ancak ancak bu ancak 1 faktörü ile sonlandırıldıysa 1 çıkışı verir.


4

8086 DOS COM Joshua tarafından

xxd kodlama ve boş bayt ve diğer korkunç şeyler nedeniyle temsil:

00000000: 31c0 b90a 0031 dbbe 8100 ac3c 0d74 3c3c  1....1.....<.t<<
00000010: 2075 f7ac 3c0d 7410 2c30 7c2f 3c09 7f2b   u..<.t.,0|/<..+
00000020: 93f7 e193 01c3 ebeb 83fb 027c 19c6 0653  ...........|...S
00000030: 0159 b902 0039 d974 1289 d831 d2f7 f109  .Y...9.t...1....
00000040: d274 0341 ebef c606 5301 4eb4 09ba 5301  .t.A....S.N...S.
00000050: cd21 c341 0d0a 24                        .!.A..$

Önce polisi elle söktükten sonra yasm kullanarak monte ettim. Bazı baytlar, Joshua'nın kullandığı coner tarafından bozuldu, ama ben sadece redakte baytlar gibi davrantım. Gerçek içeriklerinden% 99,72 eminim. Yine de yanılıyorsam düzeltmek uzun sürmemelidir. Zevk almak:

; A COM file is just a 16-bit flat binary
; loaded at 0x100 in some segment by DOS

org 0x100
bits 16

; Unsurprisingly, we start by converting
; the commandline string to a number. During
; the conversion, SI is a pointer to the
; string, CX is the base, and BX holds the
; partial result
parse_input:
; We'll read the input character by character
; into AL, but we need the resulting digit as
; a 16-bit number. Therefore, initialise AX to
; zero.
    xor ax, ax
    mov cx, 10
    xor bx, bx
; When a DOS program is loaded, it's preceded
; in memory by the Program Segment Prefix,
; which holds the commandline arguments at
; offset 0x81, terminated by a carriage return
    mov si, 0x81

.skip_prog_name:
; Load a character and move the pointer
    lodsb
; If we find the terminator here, the program
; was not given any arguments.
    cmp al, 13
    je finish

    cmp al, ' '
    jne .skip_prog_name

.input_loop:
    lodsb
    cmp al, 13
    je got_input

; If the ASCII value of the character is less
; than the one of '0', error out. Adjust the
; value in AL so that it holds the digit
; itself. This exploits the fact that the
; comparison instruction is just a subtraction
; that throws away the actual result.
    sub al, '0'
    jl finish

; If we have a value larger than 9, this
; character wasn't a digit.
    cmp al, 9
    jg finish

; Multiply the intermediate result by 10 and
; add the new digit to it.

    xchg ax, bx
    mul cx
    xchg ax, bx
    add bx, ax
    jmp .input_loop

got_input:
; The loop below would go haywire when given a
; zero or a one, so make them a special case.
    cmp bx, 2
    jl composite

; Patch the output string to say that it's
; prime
    mov byte[outstr], 'Y'

; BX = number being checked
; CX = loop counter, potential divisor of BX
    mov cx, 2

.loop:
; If CX = BX, we looked everywhere and couldn't
; find a divisor, therefore the number is prime
    cmp cx, bx
    je finish

; DIV takes DX:AX as a 32-bit number for the
; dividend. We don't want nor need the extra
; precision, so we set DX to 0.
    mov ax, bx
    xor dx, dx
    div cx

; DX now contains the remainder. To check if
; it's 0, we perform some noop operation, that
; happens to set the flags appropriately. AND
; and OR are commonly used for this purpose.
; Because of what's presumably a bug in the
; encoder used by Joshua, I do not yet know
; which for certain. However, I can make an
; educated guess. All other instances of the
; bug happened with a codepoint below 32.
; Moreover, no other bytes from that range
; occur in the code. Because an AND would be
; encoded as an exclamation mark, while OR -
; - as a tab, I am highly confident that Joshua
; used an OR.
    or dx, dx
    jz composite

; Increment the counter and loop again!
    inc cx
    jmp .loop

composite:
    mov byte[outstr], 'N'

finish:
    mov ah, 9
    mov dx, outstr
    int 0x21
    ret

outstr:
    db 'A', 13, 10, '$'

Benimki arasındaki tek fark bx < 2kompozit değil bitirmekti. Yolsuzluk başlangıçta X'in maske karakteri olarak kullanılmasından ve █'ye geçerken her şeyi düzgün bir şekilde düzeltmemesinden kaynaklanıyordu.
Joshua

@Joshua İlk başta orada bitirmek için kullandım, ama sonra 1'i doğru şekilde işlemenin gerekli olduğunu hatırladım. Yolsuzluk hakkında - bu hayal ettiğim senaryolardan biri
NieDzejkob

3

Jöle

Bu cevabı kırıyor .

25██26█966836897364918299█0█1█65849159233270█02█837903312854349029387313█ị██v
250126,9668368973649182994001,658491592332700020837903312854349029387313ṖịØJv

Çevrimiçi deneyin!


Açıklama:

Baktığımızda ve vben, numaralarının listesini oluşturma düşünüyorum bazı listeye içine nDex ve değerlendirmek.

Jelly'deki öncelikliliği kontrol etmenin "önemsiz" yolu ÆP, öyleyse (eğer gönderimi çatlatabiliyorsa):

  • Liste zorunluluk içeren endeksli olması Æve P.
  • Endeksleri listesi uyumlu modülo olmalıdır 256ile [14, 81].

Yani ... programın başlangıcındaki liste [14, 81, 49]mod 256 ( TIO ) ile uyumludur ve son elemanı açar .


3

sh + coreutils

Bu cevabı kırıyor .

eecs c "██████WyAkKHNoIC1jICJg█WNobyBabUZqZEc5eWZIUnlJQ2█2SnlBblhHNG5m██JoYVd3Z0t6SjhkMk1nTFhjSyB8YmFzZTY0IC1kYCIpIC1lcSAxIF0K█b█se6███d`"
exec sh -c "`echo WyAkKHNoIC1jICJgZWNobyBabUZqZEc5eWZIUnlJQ2M2SnlBblhHNG5mSFJoYVd3Z0t6SjhkMk1nTFhjSyB8YmFzZTY0IC1kYCIpIC1lcSAxIF0K|base64 -d`"

Hayır Çevrimiçi deneyin! Bu kez bazı sorunlar nedeniyle . Ancak jdoodle kullanabilirsiniz .

Çıkış koduna göre döner. 0asal için (başarılı), 1kompozit için (hata).

Gerçekleştirilen komut

factor|tr ':' '\n'|tail +2|wc -w

Nasıl kırılır

  1. Koda bakın, Base64'ü tanıyın.
  2. base64Komutun nasıl kullanılacağını öğrenin .
  3. Bunun +geçerli bir base64 karakteri olduğunu bilin .
  4. Kod çözmeyi deneyin .
  5. Sarıcıyı orijinal programash -c "`echo ...|base64 -d`" geri uygulayın .
  6. Komutlardan iç içe base64 oluşturur .

Doğru yöntem. "Bazı sorunlar" tüm makinelerin bilmediği bir şeydir tail +n. İş yerinde makinede çatlağınızı denediğimde bu konuda şikayet etti. Doğru kodun maskesini kaldırdınız, bu yüzden ... :(
Joshua

3

Oktav , 86 bayt, Stewie Griffin .

@(x)eval([(str2num(cell2mat([cellstr(reshape('0█1███1█0█0█00',████))])')'█')','(x)'])
@(x)eval([(str2num(cell2mat([cellstr(reshape('04141113040800',2,[]))])')+'e')','(x)'])

Çevrimiçi deneyin!

Bu eğlenceliydi! Birkaç günlüğüne bununla mücadele ettim.

İlk ipucu tanıyırdu eval([...,'(x)'])bir çağrı yaratan inşaat gibi isprimebirleşik bağ, işleve intsve charörtülü için diziyi dönüştürür char, böylece ...her iki olması gerekiyordu isprimeya ASCII değerleri vardı bir dizidir isprime, [105, 115, 112, 114, 105, 109, 101].

Geri kalanı sadece aynı bayt sayısında yapmış olabileceğimi varsaymakla reshapebirlikte [], bilinmeyen bir boyut alabileceğini anlamak için dokümantasyondan geçiyordu reshape(...,2, 7).

Kullanma +'e'yerine (101) +'d'I (Karartılmamış) son rakam olduğunu fark kadar başka birkaç dakika için beni attı hoş bir dokunuş (100) oldu 00ziyade 01ve kolay olduğunu ile.


2

JavaScript

x=>{if(x<4)return(!0);for(y=x>>>Math.log10(p=████;--y-1;(p=x/y%1)████if(██&&(███))break████return(███)}
x=>{if(x<4)return(!0);for(y=x>>>Math.log10(p=2-1);--y-1;(p=x/y%1)){;;if(!p&&(1<2))break;;;}return(!!p)}

Çevrimiçi deneyin!

Bir şekilde bunun aklınızdan geçen şey olduğundan şüphe ediyorum, ama işe yarıyor.


2

> <> , Esolanging meyvesi

:1@v>~~:?1n;█$-1<█?=2:}*{█@:$@:

için

:1@v>~~:?1n;
$-1</?=2:}*{%@:$@:

Çevrimiçi deneyin!

Bir yeni satırın redaksiyonunu akıllıca kullanmak beni biraz karıştırdı. 1 ya da 2 için çalışmıyor gibi görünüyor.


Güzel. Herhangi ^, v, /veya \ ikinci boşluğu için orada çalışmış olabilirdi. Keşke *yerine onun yerine geçmesini isterdim /.
Esolanging Fruit

2

Java (OpenJDK 8) , Sihirli Ahtapot Semaverleri

class X{public static void main(String[]args){System.out.println(new String(████████[Integer.parseInt(args[0])]).matches("█████████████")?███);}}
class X{public static void main(String[]args){System.out.println(new String(new char[Integer.parseInt(args[0])]).matches(".?|(..+?)\\1+")?0:1);}}

Çevrimiçi deneyin!

Kod alınır RosettaCode ve böylece açıklanmıştır .


Bu popüler hah olduğu hakkında hiçbir fikrim yoktu! Bu uzun bir süre için arka cebimde vardı. Dürüst olmak gerekirse o zamandan beri sahip olduğum bir yardımcı dosyadan çaldım ... Tanrım ... 2014?
Sihirli Ahtapot Urn

2

Python 3 , 44 bayt, osuka_

p=lambda x,i=2:i>=x or(x%i and p(x,i+1))or 0

Çevrimiçi deneyin!

X <2 olduğunda çalışmaz. or 0İle ikame edilmiş olabilir >0{2 spaces}ya da 4 boşluk

X <2 problemi i>=xiçin, ön tarafa konulmalıdır (aksi takdirde sonsuz bir döngü olacaktır) ve i>=xx <2 olduğunda hemen döner, bu yüzden bununla ilgili bir sorun olmadığını düşünüyorum.


Sonuç olarak, kodum x <2 ile de çalışmıyor. Hata. (Muhtemelen sadece aralık (2, ...) ile test ettim, çünkü aptalım)
osuka_

2

M, dylnan

ÆPø“;;“»VOḣ2S⁵++3Ọ;”Pv

Muhtemelen amaçlanan çözüm bu değildi.

Çevrimiçi deneyin!

Nasıl çalışır

ÆP yerleşik öncelik testidir.

øyeni, niladik bir zincir. Önceki dönüş değeri (sonucu ÆP) kapsam dışına çıktığından, bunu dolaylı olarak yazdırır.

“;;“»dizeler listesine değerlendirir ["< Aalst" ""]ve Vbunları değerlendirmeye çalışır. sargümanını 0 uzunluğundaki parçalara ayırmaya çalışır , bu da M yorumlayıcının çökmesine ve daha fazla çıktıyı bastırmasına neden olur.


Amaçlanan çözüm değil ama güzel. Yakında çatlak için güncelleme güncelleyecek. Eğer “hayvanat bahçesi” kelimesini söylemiş olsaydım, bu başka bir olası çözüme götürür mü?
dylnan

Hm, kulağa karmaşık sonsuzluk gibi geliyor.
Dennis


1

Python 3 , kullanıcı 71546

import random
def f(z):
 if z<4:return z>>1
 d,s,n,e,c=~-z,0,z,0,50
 while not d&1:d//=2;s+=1
 while n>0:n//=2;e+=1
 random.seed()
 while c>0:
  a=0
  while a<2or a>z-1:
   a,b=0,e
   while b>0:a=a*2+random.randint(0,1);b-=1
  x,r=pow(a,d,z),~-s
  if ~-x and x!=~-z:
   while r>0:
    x,r=pow(x,2,z),~-r
    if not ~-x:return 0
    elif x==~-z:break
   else:return 0
  c-=1
 else:return 1

Çevrimiçi deneyin!

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.