Golf bạn một đảo chữ cho tốt!


12

Nhiệm vụ

Trong thử thách này, nhiệm vụ của bạn là viết một số mã xuất ra một trong số các đảo chữ cái được chọn ngẫu nhiên với phân phối đồng đều nhưng nó không bao giờ tự xuất ra.


Xây dựng

Không có đầu vào, chương trình của bạn sẽ xuất bất kỳ một trong số các đảo chữ cái của mã nguồn. Chương trình của bạn không bao giờ nên xuất nguồn của chính nó, tức là nó không bao giờ nên là một quine.


Đầu vào

Chương trình của bạn không được nhận bất kỳ đầu vào. Tuy nhiên, nếu ngôn ngữ của bạn yêu cầu đầu vào là một điều cần thiết, bạn có thể cho rằng nó sẽ được viết thường a. Bạn không được sử dụng đầu vào theo bất kỳ cách nào, mặc dù.


Đầu ra

Chương trình của bạn có thể xuất ra theo bất kỳ cách nào ngoại trừ ghi nó vào một biến. Viết vào tập tin, bàn điều khiển, màn hình, vv được cho phép. Chức năng returncũng được cho phép.


Quy tắc bổ sung

  • Mã nguồn chương trình của bạn phải có ít nhất 3 ký tự (không phải 3 byte).

  • Mã nguồn chương trình của bạn phải có ít nhất 3 đảo chữ cái có thể (không bao gồm chính nó). Ví dụ: aabkhông được tính là một lần gửi hợp lệ vì aabchỉ có hai đảo chữ khác với aab( baaaba).

  • Chương trình của bạn không được tạo ra bất kỳ lỗi nào.

  • Chương trình của bạn sẽ xuất ra đảo chữ chính xác .

  • Tiêu chuẩn sơ hởquy tắc chuẩn quine áp dụng.


Thí dụ

Giả sử mã nguồn chương trình của bạn là abc. Nó sẽ xuất ngẫu nhiên bất kỳ một trong những điều sau đây (với phân phối đồng đều):

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

Và, nó không bao giờ nên đầu ra abc.


Tiêu chí chiến thắng

Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ thắng! Trong trường hợp hòa, giải pháp được đăng trước đó sẽ thắng!



Có cần phải đảm bảo rằng nó hành xử chính xác, hoặc chỉ với xác suất 1?
PyRulez

@PyRulez Trong thử thách này, nhiệm vụ của bạn là viết một số mã xuất ra một trong số các đảo chữ được chọn ngẫu nhiên với phân phối đồng đều ... (Câu đầu tiên (bên dưới Nhiệm vụ ))
Arjun

@Arjun vậy có 0% cơ hội thất bại không?
PyRulez

@PyRulez Thất bại? Mã được cho là xuất ra một trong số đó là đảo chữ (ngoại trừ chính nó) được chọn ngẫu nhiên với cơ hội tương đương với bất kỳ đảo chữ nào của nó được xuất ra. Tôi không biết ý của bạn với "Thất bại".
Arjun

Câu trả lời:


5

Thạch , 15 byte

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

Chỉ để bắt đầu mọi thứ; điều này gần như chắc chắn có thể đánh bại. Về cơ bản, đây chỉ là sự kết hợp của một hàm tạo quine phổ quát và hàm "chọn một hoán vị ngẫu nhiên khác với hàm đầu vào"; cái sau có thể là ngẫu hứng, cái trước gần như chắc chắn là vậy.

Giải trình

Xây dựng quine phổ quát

“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}

Điều này có thể được coi là một quine nếu chạy bởi chính nó. Đó cũng là một câu hỏi thích hợp theo hầu hết các định nghĩa mà tôi biết; nó không đọc nguồn của chính nó (thay vào đó, nó chứa một chữ "eval" theo nghĩa đen và được cung cấp một bản sao của chính nó như là một đối số), nó có thể mang một trọng tải (như được thấy ở đây!) và vbên ngoài chuỗi nghĩa đen được mã hóa bởi vbên trong.

Chọn một đảo chữ ngẫu nhiên

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

Điều này thực sự không hiệu quả trên một chuỗi dài như vậy, vì vậy tôi chưa thể kiểm tra toàn bộ chương trình, nhưng tôi đã kiểm tra nó trên các chuỗi ngắn hơn và nó có vẻ hoạt động chính xác.


Tại sao họ không làm việc trên TIO?
Ông Xcoder

@ Mr.Xcoder Có lẽ nó vượt qua giới hạn thời gian 60 giây.
Erik the Outgolfer

Ồ, vâng, bạn đúng.
Ông Xcoder

Trong khi bạn có nó trong byte của bạn, mã của bạn bỏ lỡ cần thiết Q. Tuy nhiên tôi nghĩ rằng bạn có thể thay đổi phương thức "tất cả hoán vị" này bằng cách sử dụng phương thức "xáo trộn"Ẋ⁼¿ , tiết kiệm một byte trong khi cũng cho phép nó hoạt động trên TIO.
Jonathan Allan

4

CJam , 17 byte

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

Điều này sẽ không hoàn thành sớm bất cứ lúc nào, vì vậy không có liên kết TIO lần này.

Như một sự an ủi, đây là một giải pháp 20 byte chấm dứt rất nhanh:

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

Hãy thử trực tuyến!

Giải trình

{`"_~"+   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.
}_~

Thay vào đó, giải pháp 20 byte xáo trộn mã nguồn cho đến khi khác với mã gốc.


4

Python 2, 117 byte

Đáng ngạc nhiên là giải pháp này ngắn hơn tôi mong đợi. Xáo trộn mã nguồn, cho đến khi nó khác với bản gốc.

-2 byte, nhờ @ mbomb007
-3 byte, nhờ @Wondercricket

Dùng thử trực tuyến

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

Đây là một trong những nguyên tắc cơ bản trong python, mà tôi đã sửa đổi

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

Tạo đảo chữ được thực hiện bởi mô-đun ngẫu nhiên

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

Trong đó R chứa mã nguồn

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

Cần có ba trích dẫn vì tôi buộc phải giữ các bộ điều khiển dòng thực tế trong mã. Đảo chữ nào cũng có 3 dòng.


1
exec sthay vìexec(s)
mbomb007

Kể từ khi một strlà không thay đổi, bạn có thể tiết kiệm một byte bằng cách làm L=Rvà sử dụng sampletrên Lhơn là sử dụng shuffletrên list. thay thế . Ý tưởng được lấy từ Stackoverflow này
Wondercricket

@Wondercricket Mẫu trả về danh sách các ký tự, vì vậy so sánh kết quả của nó với R sẽ luôn trả về Sai. Nhưng một số sắp xếp lại giúp, cảm ơn vì ý tưởng!
Xác chết

3

Java 7, 376 428 426 428 byte

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);}}

+52 và +2 byte cho hai bản sửa lỗi .. Tôi đã không kiểm tra (chính xác) nếu Chuỗi tạo ngẫu nhiên bằng với mã nguồn ban đầu. Cơ hội của điều này là nhỏ trong thiên văn khi xem xét số lượng nhân vật liên quan, nhưng tôi phải xác nhận nó bất kể tuân thủ các quy tắc thách thức.

My đầu tiên câu trả lời trong Java ..
Hãy thử nó ở đây.

Bạn có thể xóa cả hai Collections.shuffle(l)và thêm !vào trước cả hai x.equals(s)để xác minh rằng đầu ra thực sự bằng với chương trình:
Hãy thử tại đây.

Giải trình:

  • String schứa mã nguồn chưa được định dạng.
  • %sđược sử dụng để nhập Chuỗi này vào chính nó với s.format(...).
  • %c, %1$c34được sử dụng để định dạng dấu nháy kép.
  • s.format(s,34,s) đặt tất cả lại với nhau

Và phần này của mã có trách nhiệm xuất ra một đảo chữ ngẫu nhiên:

// 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 byte

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

Điều này tạo ra một danh sách quá lớn cho TIO, vì vậy liên kết sử dụng một chuỗi nhỏ hơn, nhưng ý tưởng là như nhau.

Hãy thử trực tuyến!

"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 byte

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

Sử dụng sort () trả về ngẫu nhiên -1,0 hoặc 1 để xáo trộn đầu ra.


0

Bash, 27 96 byte

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

foldchia mã theo dòng, shufxáo trộn các dòng và trđặt mã lại với nhau

Đã khắc phục sự cố tự xuất ra, bây giờ nó sẽ không bao giờ tự xuất

Hãy thử trực tuyến!


1
Liệu nó có cơ hội để tự xuất mã, mà không thay đổi?
Xác chết

Nó dường như cũng chỉ xáo trộn các dòng, vì vậy không phải tất cả các hoán vị đều có thể, đặc biệt vì chương trình chỉ có một dòng duy nhất ...
Martin Ender

Tất cả các hoán vị là có thể, kiểm tra nó. Tôi đang khắc phục sự cố có thể xảy ra
DrnglVrss

1
Điều đó có $0vẻ như vi phạm trên Chương trình của bạn không được nhận bất kỳ đầu vào nào.
thao tác

Tôi khá chắc chắn rằng đó chỉ là tên tệp. Do đó, ngay cả khi không phải là đầu vào, đây là một mánh khóe gian lận :(
CalculatorFeline
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.