En kısa öz tanımlayıcı programı yazın (bir değişken çeşidi)


57

"Gerçek" çıktı üretecektir bir program yazın IFF giriş programının kaynak kodunu eşleşir ve giriş programının kaynak kodunu uymuyor iff "sahte" çıktı üretir.

Bu problem, program sürecinde bir şekilde kendi kaynak kodunu hesaplayabilmesi gerektiğinden, kuyruklarla ilişkili olarak tanımlanabilir.

Bu kod golf: standart kurallar geçerlidir. Programınız, kendi kaynak kodunun dosyası gibi hiçbir özel dosyaya erişmemelidir.

Düzenleme: İsterseniz, doğru / yanlış, Doğru / Yanlış veya 1/0 ile değiştirilebilir.

Örnek

Programınızın kaynak kodu ise bhiofvewoibh46948732));:/)4, programınızın yapması gerekenler:

Giriş (Stdin)

bhiofvewoibh46948732));:/)4

Çıkış (stdout)

true

Giriş

(Anything other than your source code)

Çıktı

false

7
Mi true/ falseçıkış güçlü gerekliliği veya varyasyonları (vardır True/ False, 1/ 0açıdan kabul gören) ve?
Cristian Lupascu

Programın doğru / yanlıştan biraz daha fazla çıktı vermesi bir sorun mu var?
Denys Séguret


5
Yani narsist bir program mı demek istiyorsun?
PyRulez

Yanıtlar:



19

JavaScript ES6, 9 karakter

Bu JS içinde yapmak için tek (golfy) yolu. ES6 sadece daha az karakter almasını sağlar

Bunu en son Firefox’un Web Konsolunda çalıştırın:

f=x=>f==x

Örnek kullanım:

f("check") // returns false
f("x=>f==x") // returns true

1
@phinotpi - Girişim hala cevap olarak seçilmeye uygun mu?
Doktor

6
Bu durumda kaynağı olduğunu olsa ileri sürülebilir f=x=>f==xolup x=>f==xDenys Seguret versiyonu aslında bütün kaynağını kontrol etmez iken,.
Hankrecords,

@Hankrecords JavaScript buna karar versin. f=x=>f==x function f() f.toSource() "x=>f==x"(Temel olarak konsoldaki kodu değerlendirin ve sonra f.toSource()bu yöntemi destekleyen bir tarayıcıda değerlendirin .
Doktor

Anonim işlevlere izin verilmiyor (kodunuzu kısaltın x=>f==x) EDIT: nevermind, f işlevinin içinde başvuruda bulundu
MilkyWay90

9

Haskell, 72 karakter

main=interact$show.(==s++show s);s="main=interact$show.(==s++show s);s="

Not: Betiğin sonunda satır sonu karakteri yoktur.

$ runhaskell Self.hs < Self.hs
True

8

GolfScript, 11 karakter

{`".~"+=}.~

=Bu kod olmadan , bu kod bir kaynak olarak kendi kaynak kodunu üreten bir kod olurdu. Bu =, bu dizgiyi, 1eğer eşleşip eşleşmediğini girdi ve çıktı ile karşılaştırır 0. Kıyaslamanın kesin olduğuna dikkat edin - özellikle, girişin sonundaki takip eden yeni satır başarısız olmasına neden olur.

Açıklama:

  • { } GolfScript'te bire bir kod bloğudur;
  • .bu kod bloğunu çoğaltır ve ~ikinci kopyayı yürütür (ilkini yığında bırakarak);
  • `kod bloğunu siler ve ".~"+ ekler .~;
  • son olarak, =sonuçta elde edilen dizgeyi girdiyle karşılaştırır (program başlamadan önce yığın üzerinde GolfScript yorumlayıcısı tarafından dizge olarak itilen) ve 1eşleşip eşleşip eşleşmediklerini döndürür 0.

7

Perl, Infinity 41 38 Karakterler

$_=q(print<>eq"\$_=q($_);eval"|0);eval

Güncelleme: Program artık yeni bir satırla bitmiyor, bu da çok satırlı dosyalarda düzgün çalışacağı anlamına geliyor. STDIN'den girişi girmeden girmeniz gerekir. Windows'ta bunu sadece bir dosyadan okuyarak yapabildim.

Orijinal çözüm:

print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(print<>==q(...

1
Güzel bitti! . . .
Mafya

Kodla başlayan dosya (cat id.pl; echo foo)|perl id.pl
hatası

@GeoffReedy, teşekkürler; program daha önce çok satırlı girişi işlemiyordu. Şimdi düzeltildi.

Kahretsin, bu kod bovling mi?
Matthew Roh

7

> <> , 68 bayt

Balıklar balık kakasını yemeyi sever. Artık onların arkadaşlarını arkadaşlarından ayırt edebildiklerini biliyoruz '.

00v      0+1~$^?)0~\;n0\
  >:@@:@gi:0(?\:a=?/=?!/$1+
  0n;n*=f$=2~~/

Şunları yapabilirsiniz çevrimiçi denemek !


1
Bu 1da kodun herhangi bir öneki için çıktı
Jo King

@JoKing sadece betiğin ön eklerinden daha kötüydü, kesilmiş satırları da kabul etti! Düzelttim, ancak istediğim kadar genel olmadığını hayal kırıklığına uğrattım, tüm kodun eşleştiğinden emin olmak için betiğin sonunda ulaşılan hücreyi kontrol etmek zorunda kaldım. Kesinlikle geliştirilebilir, ancak rahatsız edeceğimden emin değilim.
Aaron,

6

Python 2, 55

a='a=%r;print a%%a==raw_input()';print a%a==raw_input()

Test:

a='a=%r;print a%%a==raw_input()';print a%a==raw_input() -> True

(anything else) -> False


3
İlk satıra eşit olan herhangi bir dosyada başarısız olur a='a=%r;print a%%a==raw_input()';print a%a==raw_input().
boothby

Doğru, çok hatlı giriş desteklenmiyor.
flornquake

Önemsiz bir düzeltme değiştirmek şeklinde olur raw_input()ile __import__('sys').stdin.read().
feersum

Meydan okuma ifadesiyle kafam karıştı (çünkü ingilizce gramer konusunda iyi değilim) Buna izin var mı? print raw_input()==open(__file__).read()? Yalnızca 40 bayttır, raw_input()yaklaşımınızı kullanır , ancak kodunu okur.
Simon

1
@Simon Buna izin verilmez, bu gibi zorluklar için standart boşluklardan biridir. Ve evet, bunun anlamı budurYour program must not access any special files, such as the file of its own source code.
PunPun1000

6

JavaScript ES6, 16 14 bayt

$=_=>_==`$=`+$

Neil sayesinde eksi iki bayt.

İstemi kullanarak giriş yapmamız gerekiyorsa 31 bayt.

$=_=>prompt()==`$=${$};$()`;$()

Uyarı yoluyla çıktı vermemiz gerekirse 38 bayt.

$=_=>alert(prompt()==`$=${$};$()`);$()

Bu doğru Optimizer cevabı tüm kaynak kodunu kabul etmiyor gibi bunu yapmanın yolu.


1
Güzel, yine de yazardım '$='+$.
Neil,

Ah doğru. @Neil
Conor O'Brien,

1
;$()İşlev çağrısı sıranın bir parçası olduğundan, sona ihtiyacın olduğundan eminim . Bu aynı zamanda promptgirdi için hesaba geçmeniz gerekeceği anlamına gelir .
Mama Fun Roll

1
Sorun bu değil. İşlev çağrısı gereklidir çünkü bu, sıranın bir parçasıdır. Kullanıcının bir işlev olarak çağırmasına izin vermek, sırayı mahveder.
Mama Fun Roll

1
deneyin$=_=>prompt()==`$=${$};$()`;$()
Mama Fun Roll

5

Node.js: 54

function f(){console.log(f+'f()'==process.argv[2])}f()

Bir dosyaya kaydederek f.js(tam adın önemi yoktur) ve kullanarak test edebilirsiniz.

node f.js "test"

(yanlış çıktı veren) veya

node f.js "$(< f.js)"

(hangi çıktılar doğru)

Ayrıca eval'e dayanarak farklı bir versiyon hazırladım:

eval(f="console.log('eval(f='+JSON.stringify(f)+')'==process.argv[2])")

Şimdi 72 karakterde, zamanım olduğunda bunu kısaltmaya çalışacağım.


1
@ dan1111 Neden? Hiçbir dosyaya erişmiyor. Programı node.js.'ye alışmamış insanlara nasıl başlatacağımı işaret ediyordum. Dosyayı okumuyor.
Denys Séguret

1
Javascript çözümlerinin tümü, JS'de kendi kaynak kodunuza erişebilmenizden yararlanır. Bu teknik olarak " kendi kaynak kodunun dosyasına erişmek" olmayabilir , ancak aynı şeyi gerçekleştirir. Sanırım cevabınız yasal, sanırım soru bunu özellikle yasaklamıyordu.

Programın bir parçası olan bir fonksiyonun kaynağına (yalnızca hassas olması gereken gövdeye) erişirsiniz. Bu, D'de mixin () kullanmak gibidir. Ancak, benden biri de dahil olmak üzere diğer iki JS yanıtının gerçekten de "programlar" olarak nitelendirildiğini sanmıyorum.
Denys Séguret

@dystroy aslında D içinde karıştırmak, okuma kaynağından daha çok eval kullanmak gibidir
ratchet freak

@ ratchetfreak evet, haklısın. Fakat bence programınız enum değerinin bir tür tortusunu kullanıyor, değil mi? Ve eval / mixin komutunu kullanan herhangi bir kod, fonksiyonun kaynağını kullanmakla aynı numaradır.
Denys Séguret

5

Küçük konuşma (Pharo 2.0 lehçesi)

String'de bu 41 karakter metodunu uygulayın (kod-golf için çirkin formatlama):

isItMe^self=thisContext method sourceCode

Daha sonra bunu bir Çalışma Alanında değerlendirin (printIt, geleneksel Smalltalk yöntemiyle)
Giriş, stdin'den okunmaz, yalnızca iletiyi gönderdiğimiz bir String (Smalltalk'ta başka bir program olabilir?):

'isItMe^self=thisContext method sourceCode' isItMe.

Ama hile yapıyoruz, sourceCode bazı kaynak dosyaları okuyor ...
İşte 51 karaktere sahip olmayan bir değişken :

isItMe
    ^ self = thisContext method decompileString

Ve ile test edin:

'isItMe
    ^ self = thisContext method decompileString' isItMe

Bir Çalışma Alanındaki bir Dize geçerli bir girdi olarak değerlendirilmezse , 116 karakterde İletişim Kutusunun nasıl kullanılacağını görelim.

(UIManager default request: 'type me') = (thisContext method decompileString withSeparatorsCompacted allButFirst: 7)

Decompile formatı CR ve TAB içerdiğinden, bunları Sepeptors Comppacted ile değiştiriyoruz.
Sonra ilk 7 karakteri atladık 'doIt ^'

Sonunda stdin kullanarak 105 karakterli bir değişken var, sadece bu cümleyi komut satırından yorumlayın, daha ana akım hissetmek için:

Pharo -headless Pharo-2.0.image eval "FileStream stdin nextLine = (thisContext method decompileString withSeparatorsCompacted allButFirst: 7)"

4

esnek - 312 karakter

Q \"
N \n
S " "
B \\
P "Q{S}{B}{Q}{N}N{S}{B}n{N}S{S}{Q}{S}{Q}{N}B{S}{B}{B}{N}P{S}{Q}{P}{Q}{N}M{S}{Q}{M}{Q}{N}%%{N}{P}{N}{M}{N} putchar('1');"
M "(.|{N})* putchar('0');"
%%
Q{S}{B}{Q}{N}N{S}{B}n{N}S{S}{Q}{S}{Q}{N}B{S}{B}{B}{N}P{S}{Q}{P}{Q}{N}M{S}{Q}{M}{Q}{N}%%{N}{P}{N}{M}{N} putchar('1');
(.|{N})* putchar('0');

Muhtemelen daha kısa yapılabilir, ancak çok satırlı girişle çalışır (kaynak kod birden fazla satır olduğundan gereklidir) ve hatta programı alt dize olarak içeren girişler için bile geçerlidir. Şu ana kadarki cevapların çoğu bunlardan birinde ya da her ikisinde de başarısız görünüyor.

Derleme komutu: flex id.l && gcc -lfl lex.yy.c


3

D (133 karakter)

enum c=q{import std.stdio;import std.algorithm;void main(){auto i=readln();writeln(equal("auto c=q{"~c~"};mixin(c);",i));}};mixin(c);

3

JavaScript (V8), 35

function i(){alert(prompt()==i+[])}

çağrı i()ve giriş için isteyecektir


+[]JS bunu otomatik tip döküm olacak gibi isteğe bağlı olmalıdır
Downgoat


3

Python 2, 47 bayt

_='_=%r;print _%%_==input()';print _%_==input()

Eklenen çek ile basit bir ip.


Bu işe yaramıyor. printbir fonksiyon Python 3'tür. Bunu print(_%%_==input())';print(_%_==input())Python 2 olarak yapmanız veya değiştirmeniz gerekecektir .
Mego

3

CJam , 12 bayt

{s"_~"+q=}_~

Çevrimiçi deneyin!

açıklama

Bu sadece standart CJam quine çerçevesini kullanır.

{s"_~"+q=}    e# Push this block (function literal).
          _~  e# Copy and run it.

Blok ne yapar:

 s            e# Stringify the top element (this block itself).
  "_~"+       e# Append "_~". Now the source code is on the stack.
       q      e# Read the input.
        =     e# Check if it equals the source code.

Bu tam olarak benim sahip olduğum çözüm.
Esolanging Fruit

2

Tcl, 111 karakter

set c {set c {$c};puts [expr {[read stdin] eq [subst -noc \$c]}]};puts [expr {[read stdin] eq [subst -noc $c]}]

2

Perl, 52 karakter

$_='$/=$\;$_="\$_=\47$_\47;eval";print<>eq$_|0';eval

2

Python, 187 bayt

import sys;code="import sys;code=!X!;print(sys.stdin.read()==code.replace(chr(33),chr(34)).replace(!X!,code,1))";print(sys.stdin.read()==code.replace(chr(33),chr(34)).replace("X",code,1))

Sonunda yeni satır eklememeye dikkat edin. Python-fu'u daha iyi olan biri onu kısaltabilir.


2
Birkaç C=chrbayt bırakmak için kullanabilirsiniz . Ayrıca, değişken adını kısaltın code.
Zach Gates

2
Kimse bir yıldan fazla bir süredir söylemediğinden, PPCG'ye Hoş Geldiniz!
Outgolfer Erik,

2

Kabuğu , 11 bayt

=hS+s"=hS+s

Çevrimiçi deneyin!

açıklama

Açıklama, ¨dizeleri sınırlandırmak için kullanılır (okunamayan çıkışlardan kaçınmak için):

     "=hS+s  -- string literal: ¨=hS+s¨
  S+         -- join itself with
    s        -- | itself "showed": ¨"=hS+s"¨
             -- : ¨=hS+s"=hS+s"¨
 h           -- init: ¨=hS+s"=hS+s¨
=            -- is the input equal?

İşlevini kaldırarak =yapabilirsiniz doğrulamak gerçekten sadece kaynak kendisi maç olacak.


2

> <> , 24 bayt

'1rd3*i={*}50l3-?.~i)*n;

Çevrimiçi deneyin!

Sarma dizgisi değişmezini takiben girişin yığınla aynı olup olmadığını kontrol edin, daha sonra başka bir giriş olmadığını kontrol edin.


2

Jöle , 10 bayt

“Ṿ;$⁼”Ṿ;$⁼

Çevrimiçi deneyin!

“Ṿ;$⁼”Ṿ;$⁼
“Ṿ;$⁼”      String literal: 'Ṿ;$⁼'
        $   Next two links act on the string literal
      Ṿ     Uneval: '“Ṿ;$⁼”'
       ;    Append string: '“Ṿ;$⁼”Ṿ;$⁼' (source code)
         ⁼  Is the string above equal to the input?

2

05AB1E , 15 bayt

0"D34çýQ"D34çýQ

Ekleyerek varsayılan değiştirir (örtülü girdiyle eşitliği kontrol et)0"D34çý"D34çýQ

Çevrimiçi deneyin.

Açıklama:

0                # Push 0 to the stack
                 #  STACK: [0]
 "D34çýQ"        # Push the string 'D34çýQ' to the stack
                 #  STACK: [0, 'D34çýIå']
         D       # Duplicate this string
                 #  STACK: [0, 'D34çýIå', 'D34çýIå']
          34ç    # Push '"' to the stack
                 #  STACK: [0, 'D34çýIå', 'D34çýIå', '"']
             ý   # Join the stack by this '"' delimiter
                 #  STACK: ['0"D34çýIå"D34çýIå']
              Q  # Check if it's equal to the (implicit) input
                 # (and output the top of the stack implicitly as result)

Serin 15 bayt tarafından sağlanan alternatif @Grimy :

187745012D27BJQ

Çevrimiçi deneyin.

Açıklama:

187745012        # Push integer 187745012 
                 #  STACK: [187745012]
         D       # Duplicate it
                 #  STACK: [187745012, 187745012]
          27     # Push integer 27
                 #  STACK: [187745012, 187745012, 27]
            B    # Convert 187745012 to base-27
                 #  STACK: [187745012, "D27BJQ"]
             J   # Join the values on the stack together
                 #  STACK: ["187745012D27BJQ"]
              Q  # Check if it's equal to the (implicit) input
                 # (and output the top of the stack implicitly as result)

3
187745012D27BJQbir kravat.
Grimmy

1

C - 186 176 karakter

Bir astar:

 *a="*a=%c%s%c,b[999],c[999];main(){sprintf(b,a,34,a,34);gets(c);putchar(strcmp(b,c)?'0':'1');}",b[999],c[999];main(){sprintf(b,a,34,a,34);gets(c);putchar(strcmp(b,c)?'0':'1');}

Boşluk ile (bunun programı kırdığını unutmayın):

*a="*a=%c%s%c,b[999],c[999];main(){sprintf(b,a,34,a,34);gets(c);putchar(strcmp(b,c)?'0':'1');}",b[999],c[999];
main() {
  sprintf(b,a,34,a,34);
  gets(c);
  putchar(strcmp(b,c)?'0':'1');
}




1

Runik , 11 bayt

"3X4+kSqi=@

Çevrimiçi deneyin!

TIO güncellendi ve artık girdi okuma sorunu bulunmuyor (ve artık boş bir boşluk gerektirmiyor).

açıklama

>                 Implicit entry
 "                Begin reading as string
  3X4+kSqi=@      Pushed to the stack as a string, loop around
 "                End reading as string
  3X4+            Push 3*10 and 4 to the stack, add them together
      k           Convert to character (")
       S          Swap the top two items on the stack
        q         Concatenate. This leaves only "3X4+kSqi=@ on the stack
         i        Read input
          =       Compare using .Equals, push 1 if equal, else 0
           @      Print and terminate

JoKing'in çözümü:

"'<~qi=@|

açıklama

  <              Entry
 '               Read character (loop around)
"                Push "
         |       Mirror
"                Begin reading string (loop around)
 '<~ri=@|        Push the string '<~qi=@| (loop around)
"                End reading string
 '<~             Push the character < and then discard it
    q            Concatenate, stack contains only "'<~qi=@|
      i          Read input
       =         Compare
        @        Print and terminate


@JoKing Çok akıllıca.
Draco18

Aslında, 9 baytr tersini önler
Jo King

@JoKing Muhtemelen kendime (10 byte'lık bir çözümden) ulaşabilmeliydim, ancak henüz kendi kahvemi almadım . Dün çoktan çalıştım ", solda olmanın gerçekten gidebileceği tek yer olması gerektiğinden, çünkü başka bir yerde olması işleri karmaşıklaştırıyordu. (Ama şimdi ne yaptığını görmek için hata ayıklayıcımda çalıştırmam
gerekti

1

R , 54 bayt

f=function(s)s==paste0("f=function(s)s==", body(f)[3])

Çevrimiçi deneyin!

bodyişlevin gövdesini alır (biraz bölmek, böylece body(f)[3]her şey daha paste0sonra olur). İlginç bir şekilde, bodykodu yeniden biçimlendirir, virgüllerden sonra boşluk ekler vb.

Bu çalışır çünkü body(f)bir tür nesnesidir languageve as.characterbu tür için bir yöntem vardır . Öte yandan fve args(f)tür closureve söyleyebileceğim kadarıyla karakter türüne dönüştürülemez. Lütfen bana dil türünün ne olduğunu sorma…


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.