Cheapo Enigma makinesi (Polisler)


15

Soyguncuların direği için Cheapo Enigma makinesi (Soyguncular)

Bir polisin gönderimi, tek bir bayt veri kabul eden ve tek bir bayt veri döndüren bir program / fonksiyondan oluşur. Olası her girdi benzersiz bir çıktı üretmelidir. (Başka bir deyişle, işleviniz iki yönlü olmalıdır)

Soyguncular, mümkün olduğunca kısa bir kod kullanarak ters fonksiyonunuzu yaratmaya çalışacaktır. Yani amacınız fonksiyonunuzu ters çevirmeyi zorlaştırmaktır.

Yalnızca karma veya şifreleme amaçlı yerleşik bileşenleri kullanamazsınız.

Bayt sayınız 64 baytı aşamaz. 0 baytlık çözümler kazanmak için uygun değildir.

Giriş / Çıkış formatı

8 bit (0 veya 1) veya 1-256, 0-255 veya -128 ila 127 aralığında bir temel-10 tamsayısı. Standart G / Ç veya dosya G / Ç kullanabilir. İşlev ayrıca bir değeri çıktı olarak döndürebilir. Giriş ve çıkış aynı aralığa ait olmalıdır (ikili, 1-256, 0-255 veya -128 ila 127). Soyguncunun ayrıca bu aralığı giriş ve çıkış için kullanması gerekecektir.

puanlama

Bayt sayımınızın en iyi soyguncunun size karşı girişimine oranı. En düşük puan kazanır.

Sadece bir soyguncu sizi yenmeye çalıştığında (polis olarak) kazanmaya hak kazanırsınız. (Bu soyguncu sen olabilirsin)

Misal

C ++, 0-255 aralığı, 31 bayt kullanır

int x;
cin>>x;
cout<<(x+1)%256;

C ++ 'da olası soyguncu gönderimi, 32 bayt

int f(int x)
{return x?x-1:255;}

Aynı dili veya benzer bir algoritmayı kullanmak şart değildir

Bu hem polise hem de soyguncuya 31/32 = 0.97 puan verir.


1
Bir polis gönderimi neleri içerir? Dil, boyut ve tam program / fonksiyon kodu?
Arnauld

1
Polis keyfi olarak büyük bir şey yapabilirse biraz kırık değil mi?
Yıkılabilir Limon

1
Bu soyguncu siz olabilirsiniz N'den N'ye eşlenen 64 baytlık bir polis yanıtı ve aynı şeyi bir baytta yapan bir soyguncu yanıtı gönderirsem ne olur?
Arnauld

1
Soyguncular cevap verdiğinde polis gönderiminin güncellenip güncellenmeyeceğini / nasıl güncelleneceğini belirtmek isteyebilirsiniz. (Her zamanki "kırık" güncelleme burada geçerli değil, sanırım. En azından benzersiz ve kesin bir çatlak olarak değil.)
Arnauld

3
İkinci düşüncede, bu kuralı tamamen kaldırmak isteyebilirsiniz. Çoğu cevabı Jelly'e soyguncu göndererek yok edebilirim.
Dennis

Yanıtlar:


7

JavaScript, 11 8 bayt, Puan: 8/5

x=>x^x/2

Gri kodun basit uygulanması. Kod çözme genellikle bütün bir döngüye ihtiyaç duyar. Bakalım kim en küçük ve hatta bir döngü olmadan geliyor!


Sanırım x^x/4daha zor olacak çünkü bunun için inşa edilmemeli ...
Christoph


1
Bu nasıl bir şey?
Leaky Nun

1
@LeakyNun Uhm ne tür bir cevap beklediğinizden emin değilim ama deneyeceğim: Gri kod, her ardışık sayının sadece 1 bitte değiştiği bir sayıyı temsil etmenin alternatif bir şeklidir (hammig mesafesi her zaman 1'dir). Her sayı için tam olarak bir gri kodlama ve bir ikili kodlama vardır, bu nedenle bir bijeksiyon oluştururlar. Örneğin 7, ikili dosyada 0111 ve gri renkte 0100'dür, sonraki sayı 8, ikili renkte 1000 ve gri renkte 1100'dür. Gri kodlama temel olarak ikili kodlamanın kenar kodlamasıdır.
Christoph

1
@LeakyNun ^üstel değil, bitsel xorveya . Neyse sihirli görünüyor
Евгений Новиков

7

C, 64 bayt, Puan 64/71 = 0.901

T[256];f(x){srand(x&&f(x-1));for(;T[x=rand()%256]++;);return x;}

[0 255] aralığında girdi alır.

Çevrimiçi deneyin! - TIO'da (GCC kullanarak), bu aşağıdakileri üretir:

103,198,105,115,081,255,074,236,041,205,186,171,242,251,227,070,
124,194,084,248,027,232,231,141,118,090,046,099,051,159,201,154,
102,050,013,183,049,088,163,037,093,005,023,233,094,212,178,155,
180,017,014,130,116,065,033,061,220,135,112,062,161,225,252,001,
126,151,234,107,150,143,056,092,042,176,059,175,060,024,219,002,
026,254,067,250,170,058,209,230,148,117,216,190,097,137,249,187,
168,153,015,149,177,235,241,179,239,247,000,229,202,011,203,208,
072,071,100,189,031,035,030,028,123,197,020,075,121,036,158,009,
172,016,080,021,111,034,025,125,245,127,164,019,181,078,152,224,
077,052,188,095,119,108,134,043,085,162,004,211,054,226,240,228,
079,073,253,169,008,138,010,213,068,091,243,142,076,215,045,066,
006,196,132,173,222,048,246,032,133,007,244,185,195,217,160,120,
218,106,083,144,087,238,207,096,210,053,101,063,098,128,165,089,
140,012,192,131,047,039,022,147,184,109,182,193,199,237,018,069,
057,157,174,104,122,166,055,110,003,040,139,086,145,114,129,113,
206,167,191,214,146,221,136,038,156,082,200,029,044,204,223,064

Diğer sistemlerde, C'nin belirli bir randuygulamayı zorunlu kılmadığı için farklı (ancak yine de geçerli) çıktı üretebileceğini unutmayın . Gönderim özellikle TIO'da (bağlı olarak) çalışan sürümdür.


f(x){return rand(srand(x*229))/229%256;}TIO üzerinde çalışmak için orijinal ( ) gibi bir sürüm alamadığım için oldukça hayal kırıklığına uğradım , çünkü bunun çok daha zarif olduğunu düşünüyorum. Bu sadece OS X üzerinde çalışan Clang'da çalıştığından, rekabet için adil değil. Bu hala tersine çevirmek için oldukça garip, bu yüzden sanırım yeterli.


Şey ... Bu eğlenceli!
Matthew Roh

Burada çözüm , ama seninle biraz zorlandım srand(), bu yüzden bu formda kabul edilebilir olup olmadığına karar vermelisin.
Appleshell

Çıktı rasgele olduğundan, her girdinin benzersiz bir çıktısı olmadığından, bu programın Bijection gereksinimini nasıl karşıladığını göremiyorum.
Post Rock Garf Hunter

2
Sorun uygulama değildir. Sorun, bu zorluğun tüm önemli fikirleri olduğunu düşündüğüm şeylerden yoksun: Tersine rakip olmayan bir trival algoritması (bu nedenle 64 bayt ve dilden bağımsız) bulmak. Gönderiniz şu noktaya "hissediyor": Dil bağımsızlığı, bir yerleşkenin bilinmeyen bir uygulamasına dış kaynak kullanımı ile 64 bayt sınırı (rand, dile değil yerel stdlib'e bağlıdır ) ve karma / şifreleme kuralına sahiptir. PPCG'nin kuralları dahilindedir, ancak kesinlikle ghosts_in_the_code'un kurallarıyla amaçladığı şey değildir.
Christoph

1
@ghosts_in_the_code iyi RNG'ler ve hash işlevlerinin her ikisi de geri döndürülemeyecek şekilde tasarlanmıştır. Bu nedenle, bu kurala dahil edilmeleri gerektiğini düşünüyorum (gerçek uygulama bu şekilde tasarlanmamış olsa bile). Her neyse, bu aşamada kuralları değiştirmeyi tavsiye etmiyorum.
Christoph


2

JavaScript, 44 bayt 22/3

x=>a.sort()[x]
for(a=[],i=0;i<256;)a[i]=i++;

0-255 arasındaki tüm sayıları yeniden düzenlemek için sözlükbilimsel sıralama (Javascript Default) kullanır

Çevrimiçi deneyin!


1
22/3 - biraz garip olsa bile farklı dil kabul edilebilir görünüyor. Ben 5 olduğunu düşündüm, ama 256 yoluma çıktı :).
Jonathan Allan


1

Javascript, 11/8 bayt

x=>x**5%257

Alan / aralık 1 ila 256'dır.


Hm, Javascript çok sayıda üs ile kötü mü? Ruby'de çalışır: repl.it/HXvZ/0
histocrat

JavaScript yalnızca çift duyarlıklı kayan noktalı öğelere sahiptir, bu nedenle ~ 53 bit'ten fazla olan hiçbir şey tam olarak temsil edilemez. x**3ve x**5çalışmalı.
Dennis

Bana varsaymak için doğru hizmet ediyor. Dilleri değiştireceğim.
histokrat

Ya da terser dillerini destekleyen kurallar göz önüne alındığında Dennis'in önerisini yapın. :) Teşekkür ederim!
histokrat

Ne yazık ki, kurallar şu anda biraz kırılmış ve bunu başka bir dille tersine çevirmeme izin verilecekti. Hassasiyet sınırı nedeniyle, bu JS kullanarak ters çevirmek için oldukça ayrıntılı olacaktır.
Dennis


1

Javascript, 27/29 bayt

x=>x-6?x*95%127+x*98%131:65

Düzenleme: Aralık / Alan 1..256. Az ya da çok kaba kuvvet ile üretilir.


Ne yazık ki iki yönlüdür, ancak [0,256) aralığında değildir: 130 değeri asla verilmez, ancak 256 değeri (8 bit int'e uymaz).
Christoph

Puan 27/29 . Bunu sevdim !
Christoph

1
Teşekkürler! Kurallar bir dizi [1,256] belirlememe izin veriyor ve bu aralıkta iki yönlü.
histokrat

1

Oktav , 16/6

@(x)mod(x*3,256)

Çevrimiçi deneyin!


1
Puan: 16/6 (Not: Soyguncu gönderimi için başka bir dil kullanılmasına izin verilmesi gerektiğini düşünmüyorum , ancak bu noktada öyle.)
Dennis

1
Başka bir polis (yine Jelly veya MATL kullanarak) yaparak soyguncu teslimini yenmeyi deneyip deneyemeyeceğimi bilmek de ilginç olurdu
flawr


1

Ruby, 23 bayt

->x{('228'*x).to_i%257}

Aralık ve etki alanı 0..255'tir. 228'i x kez birleştirin, sonra modulo 257 sonucunu alın (0, 0 ile eşleşir). 228, bu aralık için çalışan 9'dan sonraki ilk sihirli sayıdır (256 içermeyen farklı değerler verir).


0

Python 3, 55 bayt

y=lambda x,i=3:x if i==0 else pow(3,y(5*x,i-1),257)-1

Alan / Aralık 0-255'tir.


0

Python 3, 32 bayt 32/23

V=lambda x:((3+x)%16)*16+x//16

Alan / Aralık 0-255'tir.

İlk dört baytı son dört ile çevirir ve ilk bayta üç bayt ekler.



0

Mathematica, 13 bayt

Mod[#^7,257]&

[0..255] aralığında eşit olarak geçerli olmasına rağmen [1..256] aralığını kullanır. Tüm tabloyu görmek için aşağıdaki kod satırlarından birini Wolfram sanal alanına kopyalayın / yapıştırın :

Array[ Mod[#^7,257]&, 256]   (for a list of values in order)
Array[ Rule[#,Mod[#^7,257]]&, 256]   (for a list of input-output rules)

0

beyin sapı , 37/11

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

Çevrimiçi deneyin!

Çok iyi değil ama 0-255 aralığı



@Dennis Güzel iş! Böyle bir bytey dili kullanmamalıyım.
Christopher

3
Bu arada, dil adlarını sansürlemek iyi bir fikir değil. Evet, bu belirli dillerin sıradan ve çocukça bir adı vardır, ancak herkes yıldız işaretinin ne anlama geldiğini bilir ve arama motoru tarafından mevcut haliyle bulunamaz.
Dennis

@Dennis sonunda bunu düzeltti
Christopher
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.