Mystery String Yazıcı (Soyguncular)


26

Polisler iplik burada bulabilirsiniz: Mystery String Yazıcı (Polisler)

Senin meydan

  • Polisler iş parçacığından bir gönderi seçin ve söz konusu iş parçacığındaki bir cevaptan dize yazdırın.
  • Seçtiğiniz gönderim güvenli olmamalıdır (7 günden daha yeni olmalıdır).
  • Programınız, işleviniz veya REPL komut dosyanızın polisler iş parçacığıyla aynı kuralları izlemesi gerekiyor. Sadece özetlemek için:

    • Programınız ≤128 karakter (bir polisin gönderimi daha küçük bir program uzunluğu aralığındaysa, programınız da bu uzunluk aralığında olmalıdır. Örneğin, bir polisin programı ≤32 bayt ise, programınız ≤32 bayt olmalıdır. ).
    • Program her çalıştırıldığında aynı çıktıyı üretmelidir.
    • Şifreleme işlevi yok.
    • Program giriş yapmamalıdır.
    • Standart boşluklar yok.
  • Tüm yeni gönderiler aynı dili kullanmalıdır. Bu kural yapılmadan önce yapılan gönderiler, yapmasalar bile gayet iyi.

puanlama

Puanlama, hırsızlar için benzer şekilde çalışır, ancak biraz farklıdır:

  • Herhangi bir ≤8 baytlık programı kırmak 1 puan verir.
  • Bir ≤16 baytlık programı kırmak 2 puan verir. 32 bayt 4 puan verir, vb.
  • Her ek gönderim, uzunluğu ne olursa olsun, +5 puan kazanır
  • Her polisin başvurusu yalnızca bir kez kırılabilir - yalnızca gönderimleri kıran ilk kişi puan alır.

gönderimler

Her cevap içermelidir

  • Polisin gönderdiğine bir link.
  • Programınız ve programlama diliniz.
  • Ayrıca, polisin program uzunluğunu (2'nin gücü olarak) başlığınızdaki son sayı olarak belirtin.

Ayrıca, lütfen polisin başvurusu üzerine cevabınıza bir link veriniz.

İşte afiş oluşturmak için bir Yığın Parçacığı. Snippet ile ilgili bir sorun varsa lütfen yorum bırakın. Açık olan tüm polis başvurularını görmek istiyorsanız, polislerin mücadelesindeki pasajı görün.

Bu yarışma şimdi kapalı.

Genel kazanan: kennytm

Çoğu gönderim: Sp3000

(Notların hesaplanmasında çatlak programın uzunluğu sayıldığından, başvuruların tam olarak puanlara çevrilmediğini unutmayın).


Not: Her ek gönderim 5 puan kazanır
Daniel M.

Yanıtlar:


29

Pyth, Dennis, 8

V./Tp*FN

Kahretsin, eğlenceliydi - en zor kısım Pyth'ta yeterince kısa nasıl yapılacağını bulmaktı.

analiz

1234Muhtemelen numara listesi ile uğraşıyoruz başlangıç ipuçları de, bir ayırıcı olmadan basılı. Sayıları anlamlı olacak şekilde bölmeye çalışalım:

1 2 3 4 4 6 5 8 8 9 6 12 10 12 7 16 16 18 12 15 16 8 24 20 24 14 27 18 20 9 32 32 36 24 30 32 16 36 21 24 25 10

Doğru yolda olduğumuz hakkında birkaç ipucu var:

  • Tüm sayıların asal çarpanları 10'dan az
  • Listedeki dizine çok fazla sayı girmiş.

Ancak, birkaç özelliği vardır. Dizin 23'teki sayı 24'dür ve dizindeki sayı dizinin kendisinden daha büyük olan tek durumdur. Bununla birlikte, daha büyük ipucu bazı sayıların komşularından, özellikle endeks 15’te 7, endeks 22’de 8 ve endeks 30’da 9’un daha küçük olduğu.

Bunun 7-8-9 paterni oluşturduğuna dikkat ederek, son sayının endeks 42'de 10 olduğunu görüyoruz. @Dennis'in abelyan gruplar üzerindeki son sorusu göz önüne alındığında, OEIS'i hızlı bir şekilde kontrol 15, 22, 30, 42etmenin bölümün bir sonucu olduğunu ortaya koyuyor sayılar . Pyth, bize sekiz karakterden ikisini veren bölümler için bir yerleşime sahiptir:./

Ancak, son sayının 10 olduğuna dikkat edin, çünkü 10, Pyth'te önceden başlatılmış bir değişkendir T. ./Tİşe yarayacak gibi görünen 10 sayının 42 bölümünün tam listesini verir.

Şimdi baskı işlemi bir ayırıcı olmadan yapılır, bu da kullanımda bir ipucu verir p. Belki de her bir bölüme geçiyoruz, bir şeyler yapıp sonra yazdırıyoruz p? Bu bize aşağıdaki şablonu verir:

V./Tp??N

burada Vdeğişken olarak, her elemanın depolanması, bir iterable üzerinde döngüler döngü için a, N.

İkinci son bölüme hızlıca bakmak, (5, 5)bir ürün almak istediğimizi açıkça belirtmelidir. Bir listeyi çarpımla azaltmanın saf yolu

u*GHd1

dSöz konusu liste nerede . Ancak, bu çok uzun.

Maalesef, burası kaba bir güçlendirici çıkarmak zorunda olduğum yerdi. Bir süredir Pyth'a yetişmedim, bu yüzden yeni özelliklerin çoğunu bilmiyordum. Tamamen yapılabilir görünen sadece iki karakter kaldı.

Ardından kaba kabadayı geri döndü:

V./Tp*FN

burada *File yönlüdür *(çarpma). Aramamda bulamadım şaşırtıcı değil - anahtar kelimesi yerine "azaltma" anahtar kelimesine bakıyordum!


3
7'de bile mümkün:jk*M./T
Jakube

@ Jakube Ah vay, aralık olsaydı <= 7ben mahkum olurdu. Dili kontrol ettiğimden beri bir süre geçti.
Sp3000 11:15


9

> <>, VTCAKAVSMoACE, ≤ 64

'9?':?!;1-$:'@'+o'3'*'='%$30.

İronik olarak, bu sadece aralık sınırını düşürmekle kalmaz, aynı zamanda taşınabilirdir ve çevrimiçi tercümanla çalışır .

analiz

Hedef dizeyle başlayalım:

yh[cPWNkz^EKLBiQMuSvI`n\Yw|JVXDUbZmfoRC_xrq{TlpHjGt]OadFAsgeyh[

> <> karakterleri yığın modunda 'veya "string modundayken, ancak yazdırmak için 63 karakter ve çalışmak için sadece 64 byte ile büyük harflerin (standart döngüleme numarası için>>>> geçersiz talimatlar) bulunması doğrudan baskı yapar imkansız. Bu nedenle, kod noktaları ile bir şeyler yapıyor olmamız gerekir.

Kod noktalarına dönüştürme aşağıdakileri sağlar (Burada Python kullanıyorum):

>>> L = [ord(c) for c in "yh[cPWNkz^EKLBiQMuSvI`n\Yw|JVXDUbZmfoRC_xrq{TlpHjGt]OadFAsgeyh["]
>>> L
[121, 104, 91, 99, 80, 87, 78, 107, 122, 94, 69, 75, 76, 66, 105, 81, 77, 117, 83, 118, 73, 96, 110, 92, 89, 119, 124, 74, 86, 88, 68, 85, 98, 90, 109, 102, 111, 82, 67, 95, 120, 114, 113, 123, 84, 108, 112, 72, 106, 71, 116, 93, 79, 97, 100, 70, 65, 115, 103, 101, 121, 104, 91]

Son üç sayının ilk üç ile aynı olduğuna dikkat edin. Bu, olası bir modulo döngüsünün olup olmadığını gösterir.

Bakalım kaç farklı elemente sahip olduğumuza bakalım:

>>> len(set(L))
60

Lİlk üçü son üçe denk gelen 63 öğemiz var . Bu, bu çarpışma dışında, diğer tüm öğelerin benzersiz olduğu anlamına gelir. Şimdi bu güçlerin moduloya asal sayı alması gibi bir şeye işaret ediyor. Gerçekten de, 60 + 1 = 61asal olan bu iyi bir işarettir.

En küçük elemanı bulmaya çalışalım

>>> min(L)
65

ve min elemanlarını 1 olacak şekilde tüm elemanları aşağı ölçeklemek için kullanın:

>>> M = [x-64 for x in L]
>>> M
[57, 40, 27, 35, 16, 23, 14, 43, 58, 30, 5, 11, 12, 2, 41, 17, 13, 53, 19, 54, 9, 32, 46, 28, 25, 55, 60, 10, 22, 24, 4, 21, 34, 26, 45, 38, 47, 18, 3, 31, 56, 50, 49, 59, 20, 44, 48, 8, 42, 7, 52, 29, 15, 33, 36, 6, 1, 51, 39, 37, 57, 40, 27]

Sonrasında elemanın nasıl 1olduğuna dikkat edin 51. Bir çeşit güç / çarpma olayı varsa, bu çarpanımız için iyi bir tahmindir.

Hadi bir şans verelim:

>>> (57*51)%61
40
>>> (40*51)%61
27
>>> all((x*51)%61 == y for x,y in zip(M, M[1:]))
True

Bingo! Şimdi aşağıdaki kodu vererek geri izleyebiliriz:

x = 57
for _ in range(63):
    print(chr(x + 64), end="")
    x = (x*51)%61

bu daha sonra> <> olarak çevrildi


1
İlginçtir ki, bu benim yaptığımın bir çok farklı yoludur - 37 ve 112'yi kullandım (101'i kullanmak istedim, ancak kodda bir hata yaptım. Epic başarısız oldu), sürekli bir çarpma kümesi olarak kullandım ve 63'le modulo'ledi, sonra 64'e ekledi. okunabilir bir ASCII aralığına girin. +1 Aferin.
Addison Crump

Çok güzel, keşke bunu yapabilseydim;)
J Atkin

7

Pyth, Maltysen, ≤4

C.ZG

Kaba kuvvet o kadar uzun sürdü ki, manuel olarak daha hızlı yaptım.

analiz

C(string string int'ye dönüştürmek int) Pyth'te büyük sayı üretmenin en kolay yoludur, bu yüzden muhtemelen ilk karakterdir. Eğer 256 tabanından dönüştürürsek, şunu elde ederiz:

xÚKLJNIMKÏÈÌÊÎÉÍË/(,*.)-+¯¨¬ 

Hmm ... çok aydınlatıcı değil.

Şimdi G, "abc...z"uzun bir dizgenin beslenmesi için bir kaynak olabileceğine benzeyen alfabe dizgisi C. Bulduğum dokümanlara bakmak:

.Z    Compresses or decompresses a string.

Burada sıkıştırma ile uğraşıyorsak, her türlü genişletilmiş ASCII karakterini almak şaşırtıcı olmaz. C.ZGSonra deniyor cevap verdi.


6

Fourier, Beta Bozulması, ≤ 32

2~x1~y20(xoy~z*x~yz~xq^~q)

Veya alternatif olarak, CJam’de:

X0I{_2$+}*]2\f#

analiz

Başlangıçta 2 tane güç görebiliyoruz:

2
1
2
2
4
8
32
256
8192
2097152
...

Eğer bu sayılardan 2 tane log tabanını alırsak, şunu alırız:

1 0 1 1 2 3 5 8 13 21 ...

Fibonacci serisi olan, başından beri 1, 0.


6

Salyangoz, feersum, ≤2 bayt

z

Bu aslında 2 bayttır; karakter zsonrasında bir yeni satır \n.

Nasıl çalıştığı ya da ne yaptığı hakkında hiçbir fikrim yok, ancak ~+ve dışındaki tüm olası girdileri test ettikten sonra ~,, bu 8çıktı olarak üretilen tek 2-baytlık programdı .

Ve bu sonucu almak için yaş aldı . Hiç şüphe yok ki "Salyangoz" :-D


Kendime not: Bir dahaki sefere bilinmeyen yazılımı test ederken, bir VM içinde yapın.


5

Pas, Liam Noronha, ≤128 bayt

fn main(){print!("AACAAEGAAACIIMOAAACAAEGQQQSYYDFAAACAAEGAAACIIMOHHHJHHLNXXXAGGKMAAACAAEGAAACIIMOAAACAAEGQQQSYYDFOOO");}

Basitçe dize yazdırmak 120 bayt ...


1
vay bunu yaptığımda geç oldu. Çok aptal üzgünüm. Hiç çaba harcamadan metni daha uzun yapabilirdim. Asıl kaynağı göndereceğim.
Liam



5

CoffeeScript, user2428118, ≤64

alert 0+(btoa k.substr -2 for k of document.body.style).join ''

(yalnızca Polis tarafından açıklandığı şekilde yalnızca Chrome 46.0.2490.71’de çalışır.)


Çıktı açıkça tüm "=" nedeniyle kısa base64 kodlu dizgilerin birleştirilmesidir. Onları çözdükten sonra, 2 karakterli dizelerin bir listesini buluruz.

['nt', 'ms', 'lf', 'ne', 'll', 'on', 'ay', 'on', …

Bu mantıklı görünmüyor. Ama içinde nXve gibi tuhaf öğeler buldum tY. Bunları filtrelemeden sonra

>>> # Python
>>>
>>> [i for i in tt if not re.match('[a-z]{2}$', i)]
['nX', 'nY', 'tX', 'tY', 'wX', 'wY', 'r', 'nX', 'nY', 'tX', 'tY', 'nX', 'nY', 'nX', 'nY', 'nZ', 'x', 'y']

Bu X ve Y gibi konum özelliklerini kullanılan orijinal kaynak kodunu gösteriyor gibi görünüyor offsetX/Y. Özellikle ilginç olan nZmadde. Varsayımı kontrol etmek için "Z" ile biten tüm özellikleri aradım:

// CoffeeScript
checked = []
f = (o) ->
    if !(o in checked) 
        for k of o
            if /Z$/.test(k)
                console.log(o, k)
            if o[k] instanceof Object
                f o[k]
f window

hangi ton gösterir CSSStyleDeclaration, "webkitTransformOriginZ". Bundan, listenin bir stylenesnenin tüm tuşlarının son 2 karakteri tarafından oluşturulduğuna dair güçlü bir göstergeye sahibiz , yukarıdaki testin gerçekten de doğru olduğunu gösteriyor.



5

Lua <= 4, Egor Skriptunoff

Bir çok kullanıcı sohbetteki bu cevap için tedirgin oldu, bu yüzden onları sefaletlerinden kurtarmalıyım. Lua'yı tanımıyorum ve test edemedim, ancak bu işe yaramazsa çok şaşırırdım.

4^~9

Bu oldukça açık olurdu, ama muhtemelen kimse bilemez çünkü bit operatörleri sadece 5.3 sürümünde eklenmiş; ideone.com sadece 5.2 sürümüne sahiptir.


facepalm Bitsel operatörleri gözden kaçırdım çünkü sadece tamsayı kullanıyorlar.
LegionMammal978

5

Python 2, histokrat, ≤16

[[[51002**3/6]]] 

En büyük ipucu Python 3'te işe yaramayacağına dair sözdür. Python 3'te neler değişti ? En büyük şüpheli, bölme operatörünün floatPython 3'te bir değer döndürdüğüdür .

Dolayısıyla, çözümün onentα β / n⌋ = c = 22111101102001 biçiminde olduğunu kabul ediyorum, çünkü üstelleştirme üstelik büyük sayıları yaratmanın tek kısa yolu.

Eğer {α, β, n} gerçekten bir çözüm oluşturursa, o zaman (cn) 1 / β ≈ α bir tam sayıya çok yakın olmalıdır. Bu nedenle, her bir n için {α, β} kaba kuvvet uygulamaya çalışmak için aşağıdakileri kullanıyorum:

(* Mathematica *)
n=2; Sort[Table[{N[Abs[k - Round@k] /. k -> (22111101102001*n)^(1/b), 12], b}, {b, 2, 50}]]

(* Output: {{0.00262542213622, 7}, ...}

   The first number is the "quality" of the solution, lower is better.
   the second number is β.
   Thus α ≈ (nc)^(1/β) = 89
   But (89^7)/2 = 22115667447764, which is still far away from the answer.

*)

Gerçek sonuç hızlı bir şekilde n = 6 olduğunda ortaya çıkar.


Aferin! Bu amaçlanan çözüm ve birisinin nasıl çözeceğini umduğumla ilgili (önceden ne kadar platforma bağımlı olduğunun farkında değildim).
histocrat

4

MATLAB, StewieGriffin, ≤ 16

[36;87]*' |'*5

Baskılar:

ans =
        5760       22320
       13920       53940

Güzel! Sevindim sevdim :-) Ben yaptım yolu: 5*'$W'.'*' |'.
Stewie Griffin

Örneğin .735 yerine çarparak +5ya da bir 3x3matris yaparak çarpmayı çok daha zor hale getirmeyi düşünüyordum ama bunun daha eğlenceli olduğunu düşündüm. Kalan üç bayt ile çok şey yapabilirdi.
Stewie Griffin

@StewieGriffin Daha .'önce hiç karşılaşmadım , ama tam anlamıyla mantıklı - parantezlere başvurmadan bir ipin nasıl transpoze edileceğini merak ediyordum.
Tom Carpenter,



4

Python, spacemanjosh, ≤ 64

n=0;d=1;L=[]
exec("L+=[10/(100-n)**.5];n+=d;d+=2;"*10)
print(L)

Şanlı ters sembolik hesap makinesi. İyi golf değil, ama hey uyuyor.

Düzenleme: Ben golf oynadım.

print([10/(100-n*n)**.5for n in range(10)])

4

JavaScript ES6, Cᴏɴᴏʀ O'Bʀɪᴇɴ, ≤128 bayt

var x=122,s='0037122342526683102122';for(var i=23;i<=505;i+=2)s+=(x+=i);s;

Bunun tam olarak doğru olduğundan şüpheliyim, çünkü 128 bayta yakın bir yere ihtiyacım yoktu, ama yinelenen bir dizi bulmak eğlenceli bir mücadele oldu.


Vay. Tamamen farklı bir yöntem kullandım. Bu hala sayılıyor mu? : 3
Conor O'Brien,

@ CᴏɴᴏʀO'Bʀɪᴇɴ Genellikle yapar. Orijinali ve bu ilk 22 baytı ne ürettiğini gerçekten merak ediyorum, döngü
initinde

Zamanım geldiğinde postalayacağım. Sanırım s * s - s / (5-s)
Conor O'Brien,

4

Salı, ppperry, <= 64

0::=11
1::=22
2::=33
3::=44
4::=55
a::=bbb
b::=000
::=
aaaaaaa

Esasen, 2016'yı ana faktörlere ayrıştırır. 62 karakter, bu yüzden benim tahminime göre bu sizin için ne gittiğini benzer.


Bazı baytları kaydetmek için 0 :: = 2222 yapabilirsiniz.
lirtosiast

Adil nokta, olsa biraz daha zarif görünüyor.
Histocrat


4

> <>, Sp3000, <= 8

'l(?; o>

Komut işaretçisi etrafına sarılır ve aşağıdaki adımlar gerçekleşir:

  • 'l(?; o>'ASCII değerlerini l(?; o>yığına iter
  • l yığında yığının boyutunu iter
  • (Üst iki yığın elemanlarını karşılaştırın size of stackveord('>')
  • ?; yığın boyutu daha büyükse programı durdurur
  • oİstifin üst elemanını karakter olarak gösterir (bu her zaman olur o)
  • > IP yönünü ayarlar, burada no-op
  • ilk adıma geri dönüyoruz

Çıktı olduğunu oooooooooooo.

[space]Yığına iten veya çıkan bir şeye geçerek ve yerine basacak veya patlayacak başka bir geçerli karakter kullanarak çok sayıda farklı çıktı alabiliriz >.


Güzel! Referans için vardı:'l=?;o*
Sp3000


4

CJam, Reto Koradi, ≤ 4

HJK#

İter 17 daha sonra, 19 20 = 37589973457545958193355601 .

Çevrimiçi deneyin.

Dört baytta yapabileceğiniz çok fazla şey var. Bu büyüklükte bir tamsayı bir şekilde güçler veya faktörler içermesi gerekiyordu ve bir faktoring kurumunun sıfırı sıfırlar olurdu.


Bu doğru. Resmi yazı güncellemesini daha sonra bugün ele alacağım.
Reto Koradi

4

Pyth <= 4, Dennis

ljyG

Bu, alfabenin tüm alt kümelerinin yeni satırlarına katılmanın uzunluğu.

Test sürüşü:

$ pyth -cd 'ljyG'
==================== 4 chars =====================
ljyG
==================================================
imp_print(Plen(join(subsets(G))))
==================================================
939524095

Sayının 2^27 * 7 - 1dayandığı, uzun yGolan 2^26elementler olan güçlü bir ipucu olduğunu anladım . Daha sonra bir dizgeye dönüştürülmesi gerektiğini ve uzunluğunun basıldığını tahmin ettim. Ancak, bunu yapmanın tek yolu bir süredir düşünebildiğim, repr. Sonra jhangisinin mükemmel olduğunu düşündüm .


4

C, Tucuxi, ≤64

main(i){for(i=0;i<11000;++i)if(!(i&2*i))printf("1%d",!(i&1));}

Çıktının tümü 0 ve 1'dir, ancak C doğrudan ikili dosyayı yazdıramaz, bu nedenle bunların boolean sonuçlar olması muhtemeldir.

0'dan fazla 1 var, bu yüzden OEIS A075318 olarak görünen 0s ( 3, 9, 13, 19, …) pozisyonunu kaydettim . Bu faydalı değildir, ancak bir sayının bu sırada nerede olduğunu belirleyen basit bir formül yoktur.

Ancak tüm tuhaf rakamların olduğunu not ediyoruz, bu yüzden belki (x-1)/2 = {1, 4, 6, 9, 12, …}de daha faydalı bilgilere sahip olabiliriz. Ve bu da A003622 .

A003622 "A003849'da 1'lerin konumları" olarak tanımlanabilir , bu tam olarak burada kırmamız gereken şey. Ve A003849 " A003714 mod 2" olarak tanımlanmıştır , burada A003714 sadece tam sayı olanlardır x & (2*x) == 0. Böylece çözüme kavuştuk.

OEIS rox.


gerçekten etkileyici - asla bu sitenin kullanıcıları tarafından
şaşırtılmayı bırakma

4

Dyalog APL, Dennis, ≤4

*⍨⍟8

Ln (8) ^ ln (8) değerini hesaplar. StackExchange cevaplarımı dönüştürmeyi durdurur mu? Buraya bir sürü şey yazacağım, böylece yorum yapmayacak.


Yaptım 8*⍟⍟8ama bilmiyordum . Güzel iş :)
Sp3000


3

Pyth, xnor, ≤ 4

C`CG

CG(alfabe dizesini "abc...z"256 tabanından dönüştürün ) gerçekten büyük bir sayı üretmenin tipik Pyth yoludur. Bundan sonra sadece stringify ve tekrar tabandan dönüştürmek.


3

Python 3, Mego, ≤128

(Python 3.5.0 kullanılarak, önceki sürümlerde test edilmemiştir. 105 98 bayt.)

import sys
a=sys.stdout
sys.stdout=None
from this import*
a.write(s.translate(s.maketrans(d))[4:])

Çok iyi! 94'te yaptım, polislerimin posta kodunu gör.
Mego


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.