Golf size büyük bir iyilik için bir anagram!


12

Görev

Bu meydan okumada, göreviniz düzgün dağılımlı rasgele seçilen anagramlarından birini çıktısı veren bir kod yazmaktır, ancak hiçbir zaman kendini çıktılamamalıdır.


ayrıntı

Hiçbir giriş yapılmazsa, programınız kaynak kodun anagramlarından herhangi birini çıktılamalıdır. Programınız asla kendi kaynağını olduğu gibi vermemelidir, yani asla bir kine olmamalıdır.


Giriş

Programınız herhangi bir girdi almamalıdır. Ancak, diliniz zorunlu olarak girdi gerektiriyorsa, dilin küçük harfle verileceğini varsayabilirsiniz a. Ancak girdiyi hiçbir şekilde kullanmamalısınız.


Çıktı

Programınız bir değişkene yazmak dışında herhangi bir şekilde çıktı alabilir. Dosyaya, konsola, ekrana vb. Yazmak mümkündür. Fonksiyona returnda izin verilir.


Ek Kurallar

  • Programınızın kaynak kodunda en az 3 karakter olmalıdır (3 bayt değil).

  • Programınızın kaynak kodunda en az 3 olası anagram bulunmalıdır (kendisi hariç). Örneğin, yalnızca ( ve ) dışında iki anagram bulunduğundan aabgeçerli bir gönderim sayılmaz .aabaabbaaaba

  • Programınız herhangi bir hata oluşturmamalıdır.

  • Programınız anagramlarını tam olarak vermelidir .

  • Standart Loopholes ve Standard quine kuralları geçerlidir.


Misal

Programınızın kaynak kodunun olduğunu varsayalım abc. Aşağıdakilerden herhangi birini rasgele çıktılamalıdır (düzgün dağılımlı):

  1. acb
  2. bca
  3. bac
  4. cba
  5. cab

Ve asla çıktı vermemelidir abc.


Kazanan Ölçüt

Bu , yani bayt içindeki en kısa kod kazanır! Beraberlik durumunda, daha önce yayınlanan çözüm kazanır!



Doğru veya sadece olasılık 1 ile davrandığını garanti etmek gerekiyor mu?
PyRulez

@PyRulez Bu meydan okumada, sizin göreviniz düzgün dağıtım ile rastgele seçilen anagram birini çıktı bazı kod yazmaktır ... (İlk cümle ( Görev altında ))
Arjun

@ Arjun% 0 başarısızlık şansı iyi mi?
PyRulez

@PyRulez Hatası? Kodun, anagramının herhangi birinin eşit şansı ile rastgele seçilen anagramından (kendisi hariç) birini çıkarması beklenir. "Başarısızlık" ile ne demek istediğini bilmiyorum.
Arjun

Yanıtlar:


5

Jöle , 15 bayt

“v0¡µṾ;ḢŒ!QḊX”v

Sadece işleri başlatmak için; bu neredeyse kesinlikle katlanılabilir. Bu temelde evrensel bir kine yapıcısının ve "girdi dışında rastgele bir permütasyon seç" fonksiyonunun bir kombinasyonudur; ikincisi geliştirilebilir, birincisi neredeyse kesinlikle.

açıklama

Universal quine yapıcı

“v0¡µṾ;Ḣ”v
“       ”v   Evaluate the following, given {itself} as argument:
 v0¡µ          No-op (which starts with "v")
     Ṿ         Escape string
      ;Ḣ       Append first character of {the argument}

Tek başına çalıştırıldığında bu bir kine olarak görülebilir. Ayrıca bildiğim çoğu tanım gereği uygun bir soru; kendi kaynağını okumaz (daha ziyade, "değerlendirilen" bir değişmez içerir ve bağımsız değişken olarak kendisinin bir kopyasını verilir), bir yük taşıyabilir (burada görüldüğü gibi!) ve vdize dışında hazır bilgi viçeriden kodlanır .

Rastgele bir anagram seçin

Œ!QḊX
Œ!     All permutations
  Q    Discard duplicates
   Ḋ   Discard the first (i.e. the string itself)
    X  Choose random element

Bu gerçekten bu kadar uzun bir dizede verimsiz, bu yüzden programı bir bütün olarak test edemedim, ama daha kısa dizelerde test ettim ve düzgün çalışıyor gibi görünüyor.


Bu neden TIO üzerinde çalışmıyor?
Bay Xcoder

@ Mr.Xcoder Muhtemelen 60'ların zaman sınırını atlıyor.
Outgolfer Erik

Oh, evet, haklısın.
Bay Xcoder

Bayt sayınız varken kodunuz gerekli özlüyor Q. Ancak bu "tüm permütasyonlar" yöntemini kullanarak bir "shuffle" yöntemini kullanarak değiştirebilir Ẋ⁼¿ve bayt tasarrufu yaparken TIO üzerinde çalışmasına izin verebilirsiniz.
Jonathan Allan

4

CJam , 17 bayt

{`"_~"+m!(a-mR}_~

Bu yakında bitmeyecek, bu yüzden TIO bağlantısı yok.

Bir teselli olarak, burada çok hızlı bir şekilde sona eren 20 baytlık bir çözüm var:

{`"_~"+:S{mr_S=}h}_~

Çevrimiçi deneyin!

açıklama

{`"_~"+   e# Standard quine framework, leaves a string equal to the source
          e# code on the stack.
  m!      e# Get all permutations. The first one will always be the original order.
  (a      e# Remove that copy of the source code and wrap it in a new list.
  -       e# Remove all copies of the source code from the list of permutations.
  mR      e# Pick a random permutation.
}_~

20 baytlık çözüm, orijinalinden farklı olana kadar kaynak kodunu karıştırır.


4

Python 2, 117 bayt

Şaşırtıcı bir şekilde bu çözüm beklediğimden daha kısa. Orijinalden farklı olana kadar kaynak kodunu karıştırır.

@ Bybb007 sayesinde -2 bayt @Wondercricket
sayesinde -3 bayt

Çevrimiçi deneyin

s=r"""from random import*;R='s=r\"""'+s+'\"""'+';exec s';L=R
while L==R:L=''.join(sample(R,len(R)))
print L""";exec s

Bu, python'daki temel tırnaklardan biri, değiştirdiğim

s = r"print 's = r\"' + s + '\"' + '\nexec(s)'"
exec(s)

Üreten anagram rastgele modül tarafından yapılır

L=R
while L==R:L=''.join(sample(L,len(L)))

R, kaynak kodu içeriyorsa

s=...
R='s=r\"""'+s+'\"""'+'\nexec s'

Gerçek sıra ayırıcıları kodda tutmak zorunda kaldığım için üçlü alıntılar gerekiyordu. Anagramların zaten 3 satırı olacak.


1
exec syerineexec(s)
mbomb007

Bir yana strdeğişmez, sen yaparak bir bayt kaydedebilir L=Rve kullanma sampleile ilgili Lziyade kullanarak shuffleüzerinde list. repl.it . Fikir bu Stackoverflow
Wondercricket

@Wondercricket Sample, karakterlerin listesini döndürür, bu nedenle sonuçları R ile karşılaştırmak her zaman False döndürür. Ama bazı yeniden düzenleme yardımcı olur, fikir için teşekkür ederiz!
Ölü Olası

3

Java 7, 376 428 426 428 bayt

import java.util.*;class M{public static void main(String[]a){String s="import java.util.*;class M{public static void main(String[]a){String s=%c%s%1$c,x=s=s.format(s,34,s);for(List l=Arrays.asList(x.split(%1$c%1$c));x.equals(s);s=s.join(%1$c%1$c,l))Collections.shuffle(l);System.out.print(s);}}",x=s=s.format(s,34,s);for(List l=Arrays.asList(x.split(""));x.equals(s);s=s.join("",l))Collections.shuffle(l);System.out.print(s);}}

İki hata düzeltmesi için +52 ve +2 bayt .. Rastgele oluşturulmuş String orijinal kaynak koduna eşit olup olmadığını (doğru) denetlemiyordum. Bunun şansı, dahil olan karakterlerin miktarı göz önüne alındığında astronomik küçüktür, ancak meydan okuma kurallarına uymaksızın onu doğrulamalıyım.

İlk Java cevap ..
Burada deneyin.

Çıktının gerçekten programa eşit olduğunu doğrulamak için her ikisini de kaldırabilir Collections.shuffle(l)ve her ikisinin !önüne ekleyebilirsiniz x.equals(s):
Burada deneyin.

Açıklama:

  • String sBiçimlendirilmemiş kaynak kodu içerir.
  • %s, bu Dizeyi ile içine girmek için kullanılır s.format(...).
  • %c, %1$cve 34çift ​​tırnakları biçimlendirmek için kullanılır.
  • s.format(s,34,s) hepsini bir araya getirir

Kodun bu kısmı rastgele bir anagram çıkarmaktan sorumludur:

// Strings `s` and `x` now both contain the source-code:
x=s=s.format(s,34,s);

// Create a list with the characters of this source-code-String and loop
for(List l=Arrays.asList(x.split(""));
    // as long as String `x` equals String `s`
    x.equals(s);
    // Shuffle the list, and set it to `s` in every iteration of the loop:
    s=s.join("",l))Collections.shuffle(l);
// End of loop (implicit / single-line body)

// And then print the random anagram to STDOUT:
System.out.print(x);

1

05AB1E , 22 bayt

"34çìDJœ¦.R"34çìDJœ¦.R

Bu, TIO için çok büyük bir liste oluşturur, bu nedenle bağlantı daha küçük bir dize kullanır, ancak fikir aynıdır.

Çevrimiçi deneyin!

"34çìDJœ¦.R"           # Push this string
            34ç        # Push "
               ì       # Prepend
                DJ     # Duplicate and join 
                  œ¦   # Push all permutations except the original
                    .R # Pick a random element

1

Javascript (ES6), 128 bayt

!function a(){b="!"+a+"()",c=b.split(""),c.sort(()=>Math.round(Math.random())-.5),c!=b.split("")?console.log(c.join("")):a()}();

Çıktıyı karıştırmak için rastgele -1,0 veya 1 döndüren sort () kullanır.


0

Bash, 27 96 bayt

i=`cat $0`&&e=`fold -w1 $0|shuf|tr -d '\n'`&&while [ "$e" = "$i" ]; do `$0`; exit; done&&echo $e

foldkodu satırlara böler, satırları shufkarıştırır ve trkodu tekrar bir araya getirir

kendi çıktısını alma sorunu düzeltildi, şimdi asla çıktı vermeyecek

Çevrimiçi deneyin!


1
Değişiklik yapmadan kodun kendisinin çıktısını alma şansı var mı?
Ölü Possum

Ayrıca sadece satırları karıştırıyor gibi görünüyor, bu nedenle tüm permütasyonlar mümkün değil, özellikle programın sadece tek bir satırı olduğundan ...
Martin Ender

Tüm permütasyonlar mümkündür, test edin. Ben belki kendi kendini ouputing sorunu tamir ediyorum
DrnglVrgs 23:05

1
Bu $0, “Programınız herhangi bir girdi almamalıdır” ihlali gibi görünüyor.
manatwork

Bunun sadece dosya adı olduğundan eminim. Bu nedenle, girdi olmasa bile, bu bir hile quine :(
CalculatorFeline
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.