Autogram programları


34

Bu cümle iki a, iki c, iki d, iki yirmi, sekiz, beş f, üç g, sekiz s, on bir, üç l, iki m, on üç, dokuz, iki p, beş r, yirmi beş kullanır s, yirmi üç t, altı v, on w, iki x, beş y ve bir z.

Bu tür cümlelere otogram denir . Göreviniz, benzer bir özelliğe sahip bir program veya işlev yazmaktır: bu, bir bayt girişini alır ve baytın, programın kaynak kodunda kaç kez göründüğünü temsil eden bir tamsayı çıkarır. Girdi kaynağında görünmüyorsa 0 vermelidir.

Programınız doğrudan veya dolaylı olarak kendi kaynak kodunu okumamalı, bunun yerine, çıktısını vermek için ihtiyaç duyduğu tüm veriler kodlu, zarif bir stilde olmalıdır. Programınızın uzunluğu en az bir bayt olmalıdır.

Bu , yani en kısa giriş (bayt cinsinden) kazanır. Bir cevabı kabul etmiyorum, bu yüzden en sevdiğiniz dilde en kısa çözüm için rekabet etmekten çekinmeyin.

Yayınınıza bir açıklama eklemeniz şiddetle tavsiye edilir.

Liderler

Aşağıda hem genel puan hem de dil başına puan tabloları verilmiştir:


5
Sandbox . (2014'ten beri orada!)
Nathaniel

İşlevlere izin verilir mi, yoksa yalnızca tam programlar mı?
Uriel

1
Not: benzer Cevapları bu bir artık geçerli sayılmaz.
user202729

1
FWIW, doğru quine tanımı bu meydan okuma için istediğimden biraz daha güçlü. Örneğin, bazı bitişik aralıktaki tüm karakterleri kullanan bir program gördüğümde çok mutlu olurum ve eğer giriş o aralıktaysa, 1 kodunu verir, ancak bu kod yazılan programın bir bölümünü içermez. programın farklı bir kısmı ". Bu nedenle, retina örneğine izin vermeye istekliydim, ancak zaten 1 bayt olduğu için başkalarının kayıttan kaldırılması hayal kırıklığı yaratıyordu. (@ user202729)
Nathaniel

1
Yukarıdaki yorumum nedeniyle, quine kurallarının geçerli olduğu ifadesini kaldırdım. (Kaynak kodu okumama ile ilgili kısmı tuttum.)
Nathaniel

Yanıtlar:


15

Oktav , 44 bayt

@(x)sum([[39,'(())*,239==@[[]]msuxx']]==x)*2

Çevrimiçi deneyin!

İşlevdeki karakterlerden her birini girdi olarak kullanırken, işlevin sonucu:

'  (  )  *  ,  2  3  9  =  @  [  ]  m  s  u  x  
2  4  4  2  2  2  2  2  4  2  4  4  2  2  2  4  

Diğer tüm giriş karakterleri sıfır döndürür.

Kaçmam gerektiği gerçeği, bunu 'çok daha uzun yaptı. 4 parantezi hesaba katmak için, dizgede bir kopya vardı. Bununla birlikte, kesme işareti kesme kesme işareti alır, bu da bizi doğru sonuçtan daha ileri götürür. Bu nedenle, kesme sayısını ASCII-değeriyle saymak zorunda kaldım 39. Bu elbette karakterleri kontrol etmem gerektiğiydi 3ve 9her şeyi çok daha uzun hale getirdi.


2
Bu daha fazlasını görmeyi umduğum bir şey. (Sadece standart bir quine almak ve karakterleri saymak için kod eklemek yerine, problemi optimize etmek.)
Nathaniel

7

Excel, 84 bayt

=IFERROR(MID("65496331125442343343233",FIND(A1,"""123456789,()=MINORFADEOMEN"),1),0)

Find()A1dize içindeki hücrede bulunan değeri arayacaktır "123456789,()=MINORFADEOMEN( """başlangıçta karakterden kaçmak ve sadece değerlenecektir ").

Sonuçlarına göre Find(), Mid()işlev ilgili karakteri sayı dizisinden döndürür. Bu dize değişmeyi durdurana kadar yineleme ile oluşturuldu.

Karakter A1bulunmazsa, Find()bir hata döndürür, böylece IfError()işlev 0bunun yerine geri dönmesini sağlar .

OMENVarlık içinde aranır dize sonundaki Find()fonksiyonu konumlarını asla geri dönmeyecek ama karakter sayılarını ayarlamak için gerekli bu yüzden yinelenen harfleri. Onlar olmadan, sayıları değişen sonsuz bir döngü vardı. Harf düzenlemesi stilistik bir seçimdir.


5

JavaScript (ES6), 70 bayt

Fonksiyonun kaynağını okumuyor, ama bu oldukça uzun. Girdiyi 1 karakterli bir dize olarak alır.

i=>~(n='\\34=\'in(|)0257?:.>[]Odefx~'.indexOf(i))?'3733544333'[n]||2:0

Çevrimiçi deneyin!


Farklı karakterlerin miktarını azaltmak için biraz elden geçirerek bunu biraz kısaltabilirsiniz: i=>'36335633'[i='\\36=\'i|&()25.>[]Odefx~n'.indexOf(i)]||~i&&2(8 bayt kaydedildi)
Yair Rand

5

Retina , 1 bayt

Bu, kesinlikle kurallara uyma kurallarına uyması halinde geçerli olmaz, ancak OP bir yorumda açıkça izin verdi .

x

Çevrimiçi deneyin!

Retinada, tek satırlı bir program girişteki regex'in oluşumunu sayar. Bu zorluk haricinde herhangi bir tek ASCII karakter ile çözülmektedir `, ., +, *, ?, [, (, ), ^, $, \ve yeni satır.


5

C # (Visual C # Derleyici) , 88 57 bayt

x=>"\\\"(())==>>??..::3300CCaaiinoossttx".Contains(x)?3:0

Çevrimiçi deneyin!

İade 3 dize geçirilen kömürü içeriyorsa, aksi 0. dize tutar Char sahip olmaları gerekmektedir kez ve tam olarak en az kodunun her karakter içeriyor döndürür 3 kodunda kez.

Kevin Cruijssen sayesinde -31 bayt


Güzel yaklaşım! Benden +1. Parantezleri çıkararak (a)=>ve girdiyi char yerine string olarak alarak bazı baytları kaydedebilirsiniz , böylece .ToString()artık gerek a+""kalmaz (ve ayrıca, asla gerekmeyeceğiniz kod golfü zorlukları için de kullanılmış olabilir .ToString()). Ayrıca, .Containszaten bir tane içerdiğinden a, giriş değişkenini 4 yerine her karakter için 3 olacak şekilde farklı kullanılmamış bir karakter ( xya da gibi q) yapabilirsiniz. EDIT: En son kısmı boşver, "4 kez de kullanıldığını gördüm .
Kevin Cruijssen

@KevinCruijssen Tavsiye için teşekkürler. Fakat string girdi olarak geçerli midir? OP'nin giriş olarak bir bayt istediğini mi düşünüyorsunuz?
Hyarus

Tek karakterli bir karakter dizisi olduğu sürece, kesinlikle eminim. Çoğu dil, yalnızca yine de dize değerleri girebilir ve bazı karakterleri hala dize olarak girmeyi seçebilir (örneğin, Java, JavaScript ve Japt gibi). Giriş ve çıkış biçimleri genellikle oldukça esnektir. hala şüphe ediyorsanız yorum yapın :)
Kevin Cruijssen

1
@KevinCruijssen makul sesler. Ve eğer birinden
kaçarsak

2
Giriş olarak tek karakter dizeleri bana göre iyi.
Nathaniel,

4

Haskell , 66 bayt

İlk iki sürüm, esasen gerekli karakterleri filtreleyen ve daha sonra uzunluğu alan bir kuyruktur:

q c=length.filter(==c)$id<>show$"q c=length.filter(==c)$id<>show$"

Çevrimiçi deneyin veya tüm karakterlerle test edin! *


(<>)72 bayt olmadan alternatif

q c=length.filter(==c)$(++)<*>show$"q c=length.filter(==c)$(++)<*>show$"

Çevrimiçi deneyin veya tüm karakterlerle test edin!


Quine olmayan alternatif, 87 86 bayt

Hala daha iyi olabilir, ama sadece üç farklı gruba indirdiğim için mutluyum.

En çok baytı saysa da, bunu en çok seviyorum. Karakter / bayt sayısını 2,3 ve 7 toplamıyla hesaplar (bazı karakterlerin birden fazla grupta nasıl olduğuna dikkat edin):

u t=sum[fst e|e<-[(2," ()-237<=dflnst|"),(3," ()[\\]`mstu"),(7,"\",ee")],t`elem`snd e]

Çevrimiçi deneyin veya tüm karakterlerle test edin!


* ithalat (<>), TIO’nun GHC sürümü 8.0.2


3

Python 2 , 54 52 32 bayt

Ovs sayesinde -20 bayt

("''+.23cnotu()"*2+'"*'*3).count

Çevrimiçi deneyin!


1
Neden lambda veya girdi yok?
Stewie Griffin

2
@StewieGriffin Python otomatik olarak bir yöntem referansını bağlar, yani "xxx".counteşdeğerdir lambda c:"xxx".count(c).
Neil

@StewieGriffin ve ikisini de aynı şekilde kullanıyorsunuz -> f="xxx".countve f=lambda c:"xxx".count(c)olarak adlandırılacaklarf('a')
Rod

3

Kabuğu , 11 10 8 bayt

-2 bayt için teşekkürler Leo !

#sD"#sD"

Çevrimiçi deneyin!

açıklama

Bu, yalnızca ASCII kullanmasını sağlar (çünkü showkarışıklığa neden olur) ve her karakterin iki kez içerildiğinden emin olun :

#sD"#sD"  -- character as input, eg. '"'
   "#sD"  -- string literal (note the redundant '"'): "#sD"
  D       -- double: "#sD#sD"
 s        -- show: "\"#sD#sD\""
#         -- number of occurences: 2

Standart quine uzantısı, 11 bayt

#hS+s"#hS+s

Çevrimiçi deneyin!

açıklama

#hS+s"#hS+s  -- character as input, eg. '"'
     "#hS+s  -- string literal: "#hS+s"
  S+         -- join with itself: ("#hS+s"++)
    s        -- | and itself shown: "\"#hS+s\""
             -- : "#hS+s\"#hS+s\""
 h           -- init: "#hS+s\"#hS+s"
#            -- number of occurences in string: 1

1
Göstermeden önce ipi ikiye katlayarak alıntıları daha kolay yönetebilirsiniz: Çevrimiçi deneyin!
Leo,

3

Java 10, 164 81 57 bayt

q->"q-->>\\\"..ccoonttaaiiss(())??33::00".contains(q)?3:0

Port @Hyarus 'C # cevap , bu yüzden onu upvote emin olun!

Açıklama:

Çevrimiçi deneyin.

q->      // Method with String parameter and integer return-type
  "q->\\\"..ccoonttaaiiss(())??33::00".contains(q)?
         //  If the string above contains the input character
   3     //   Return 3
  :      //  Else:
   0     //   Return 0

Eski 164 baytlık cevap:

c->{var s="c->{var s=%c%s%1$c;return s.format(s,34,s).replaceAll(%1$c[^%1$c+c+']',%1$c%1$c).length();}";return s.format(s,34,s).replaceAll("[^"+c+']',"").length();}

Açıklama:

Çevrimiçi deneyin.

c->{                                  // Method with char parameter and integer return-type
  var s="c->{var s=%c%s%1$c;return s.format(s,34,s).replaceAll(%1$c[^%1$c+c+']',%1$c%1$c).length();}";
                                      //  Unformatted source code
  return s.format(s,34,s)             //  Create the formatted source code (the quine),
          .replaceAll("[^"+c+']',"")  //  remove all characters not equal to the input,
          .length();}                 //  and return the length

-parça:

  • Dize s, biçimlendirilmemiş kaynak kodunu içerir.
  • %sbu stringi kendi içine girmek için kullanılır s.format(...).
  • %c, %1$cVe 34çift tırnak biçimlendirmek için kullanılır.
  • s.format(s,34,s) hepsini bir araya getirir

Zorluk kısmı:

  • .replaceAll("[^"+c+']',"") Girdiye eşit olanlar dışındaki tüm karakterleri siler.
  • .length() sonra bu dize uzunluğunu alır.

Not: .split(c).length( Stringyerine giriş ile char) daha kısa görünebilir, ancak iki sorun var:

  1. İlk karakter yanlış sonuç veriyor, bu nedenle c( c->baştaki kısımla birlikte) giriş yapıldıysa , hatalı bir karakter çok az döndürür. Bu ilave edilmesi suretiyle tespit edilebilir +(c==99?1:0)kaynak kodu ve biçimlendirilmemiş kaynak kodu dize hem de (ve değişen .split(c)için .split(c+""), ama sonra yine aşağıdaki sorun var:
  2. Bir regex karakteri (yani $) .splitgirilirse, yanlış bir sonuç vererek, onu bir regex olarak yorumlar.

3

Haskell , 58 bayt

f c=sum[2|x<-succ '!':"f c=sum[2|x<-succ '!':,x==c]",x==c]

Çevrimiçi deneyin! veya çözümü doğrulayın .

Aynı bayt sayısı alternatifleri:

f c=sum[2|x<-tail$show"f c=sum[2|x<-tail$show,x==c]",x==c]
f c=sum[1|x<-id<>show$"f c=sum[1|x<-id<>show$,x==c]",x==c]

Haskell , 90 bayt

sum.($zip"1234\"$,.[\\]opu+()iklmsz652"$[4,4,11,3,3,3,16,5,3,3,3,3,3,3,3]++[2,2..]).lookup

Çevrimiçi deneyin! veya çözümü doğrulayın . Bu gerçeği kullanır sum Nothing = 0ve örneğin sum (Just 4) = 4.


3

Smalltalk , 112 132 bayt

Smalltalk, golf sahası uygunluğu için tam olarak bilinmemektedir :-)

Karakter sınıfında tanımlanan yöntem (VA Smalltalk ve Squeak'te test edilmiştir, VisualWorks ve Pharo gibi diğer lehçelerde de çalışmalıdır):

a^(0to:6),#(10 18)at:(#('' ',[]^|+68cForu' '#0adefln' '1it' '()' ':s' ' ' '''')findFirst:[:s|s includes:self])+1

Kaynakta meydana gelen karakterler, oluşum sayısına göre gruplanır. Gruplar, alıcıyı içeren ilk kişi için test edilir ve eşleşen oluşum sayısı döndürülür.

Eski yöntem:

a^('''''((((())))):::[[[[]]]]^^^^^0000066666aaaacccccdddddeefffFFFFFiiilllnnnnnrrrrrsssTTTTTuuuu'includes:self)ifTrue:[6]ifFalse:[0]

Yöntemde görünen her karakter tam olarak 6 kez görünür (dizi sabitinde tekrarlanarak), bu nedenle yöntem alıcının ipte olup olmadığını kontrol eder ve aksi takdirde 0 ise 6 döndürür.

Yöntemi yukarıdaki gibi tanımladıktan sonra, kullanarak doğrulayabilirsiniz.

| code |
code := Character sourceCodeAt: #a.
((0 to: 255) collect: [:b | b asCharacter]) reject: [:c | c a = (code occurrencesOf: c)]

Sonuç boş olmalı.


1
PPCG'ye Hoşgeldiniz!
Martin Ender

2

JavaScript, 31 bayt

f=c=>~-`f=${f}`.split(c).length

Çevrimiçi deneyin


1
Sanırım bu kendi kaynak kodunu okuyor, değil mi? Bu açıkça, soruda koyu olarak yasaklandı.
Nathaniel,

1
@ Nathaniel, buraya bakın .
Shaggy

2
Hmm. Dürüst olmak gerekirse, bunun aptalca olduğunu düşünüyorum, ancak sanırım meta konsensüsüne gerçekten katılmıyorum.
Nathaniel,

1
@Nathaniel Değerlendirmeyi kolaylaştıran tüm programlar için, aynı zamanda quin'i de kolaylaştırır.
user202729

1
@ user202729 Bunun olduğunu sanmıyorum, değil mi? Örneğin aynı numarayı Python'da yapamazsınız. Bu tersine bir değerlendirmedir, bir değerlendirme değil
Nathaniel 13:



2

Haskell , 96 bayt

n"n"=15;n"="=14;n" "=2;n";"=13;n"\\"=3;n"\""=25;n"0"=2;n"1"=4;n"2"=4;n"3"=4;n"4"=5;n"5"=5;n n3=0

Çevrimiçi deneyin!

Haskell , 109 bayt

n 'n'=15;n '='=14;n ' '=14;n ';'=13;n '\\'=3;n '\''=25;n '0'=2;n '1'=5;n '2'=4;n '3'=4;n '4'=5;n '5'=5;n n3=0

Çevrimiçi deneyin!

Haskell , 122 bayt

n 'n'=21
n '='=14
n ' '=14
n '\n'=12
n '\\'=4
n '\''=32
n '0'=2
n '1'=5
n '2'=5
n '3'=3
n '4'=5
n '5'=5
n nnnnnn4'''''''=0

Çevrimiçi deneyin!

açıklamalar

Bu cevaplar çok karmaşık değil. Programda bulunan her karakter için birer tane beyannamedir. Sonunda, programda bulunmayan karakterler için 0 döndüren her şeyi yakaladık.

Programda gerekli karakter sayısını en aza indirmek için birkaç püf noktası kullanıyorum ve oradan sayılar doğru çıkıncaya kadar bazı şeylerle uğraştım. Değişken adını son bildirimde, üçünde de doldurduğumu görebilirsiniz. 3 program arasındaki fark, yeni bir satır kullanmayı ;mı yoksa satır sonlarını mı kullanmamı ve Chars'ı giriş olarak mı, yoksa Strings olarak mı seçmeyi seçmemdir. ;Yaklaşım ancak kömür haline bir Strings yok fonksiyon adından sonra boşluk gerektirir çünkü Dizeleri kullanarak Chars daha iyi bir fikir olduğunu görünüyor, sadece kısa kadar şans ve biter alır başkalarına doğuştan üstün görünmemektedir.


: | açıklamada yazımınıza ne oldu
ASCII - sadece

2

Boşluk , 140 bayt

[S S S N
_Push_0][S N
S _Duplicate][S N
S _Duplicate][T N
T   S _Read_STDIN_as_character][T   T   T   _Retrieve][S S S T  S S T   N
_Push_9][T  S S T   _Subtract][S N
S _Duplicate][N
T   S S T   N
_If_0_Jump_to_Label_TAB][S S S T    N
_Push_1][T  S S T   _Subtract][S N
S _Duplicate][N
T   S S N
_If_0_Jump_to_Label_NEWLINE][S S S T    S T T   S N
_Push_22][T S S T   _Subtract][N
T   S T N
_If_0_Jump_to_Label_SPACE][N
S T N
_Jump_to_Label_PRINT][N
S S S T N
_Create_Label_TAB][S S S T  S S T   S T N
_Push_37][N
S T N
_Jump_to_Label_PRINT][N
S S S N
_Create_Label_NEWLINE][S S S T  S S S S T   N
_Push_33][N
S T N
_Jump_to_Label_PRINT][N
S S T   N
_Create_Label_SPACE][S S S T    S S S T T   S N
_Push_70][N
S S N
_Create_Label_PRINT][T  N
S T _Print_as_integer]

Harfler S(boşluk), T(sekme) ve N(yeni satır) yalnızca vurgulama olarak eklenmiştir.
[..._some_action]sadece açıklama olarak eklendi.

70 boşluk, 37 sekme ve 33 yeni satır kullanıldı.

Genellikle sırayla oluşturun Etiketleri kullanabilirsiniz NSSN, NSSSN, NSSTN, NSSSSN, NSSSTN, NSSTSN, NSSTTN, vb Ama ikili bir sayı baskı nedeniyle S=0/ T=1kullanılır ben çıkışa ihtiyacım sayısını etkiler, ben etiketleri kullanılan NSSN, NSSSN, NSSTNve NSSSTNbunun yerine, verdi İkili sayılarla SSSTSSSSTN(33; yeni satırların miktarı), SSSTSSTSTN(37; sekmelerin miktarı) ve SSSTSSSTTSN(70; boşlukların miktarı) basılacak mükemmel miktarda boşluk / sekme .

Sahte kodda açıklama:

Character c = STDIN-input as character
If c is a tab:
  Print 37
Else if c is a new-line:
  Print 33
Else if c is a space:
  Print 70
Else
  Print 0

Örnek çalışır:

Giriş: boşluk

Command       Explanation                   Stack       Heap     STDIN   STDOUT   STDERR

SSSN          Push 0                        [0]
SNS           Duplicate top (0)             [0,0]
SNS           Duplicate top (0)             [0,0,0]
TNTS          Read STDIN as character       [0,0]       {0:32}   \n
TTT           Retrieve                      [0,32]      {0:32}
SSSTSSTN      Push 9                        [0,32,9]    {0:32}
TSST          Subtract top two (32-9)       [0,23]      {0:32}
SNS           Duplicate top (23)            [0,23,23]   {0:32}
NTSSTN        If 0: Jump to Label_TAB       [0,23]      {0:32}
SSSTN         Push 1                        [0,23,1]    {0:32}
TSST          Subtract top two (23-1)       [0,22]      {0:32}
SNS           Duplicate top (22)            [0,22,22]   {0:32}
NTSSN         If 0: Jump to Label_NEWLINE   [0,22]      {0:32}
SSSTSTTSN     Push 22                       [0,22,22]   {0:32}
TSST          Subtract top two (22-22)      [0,0]       {0:32}
NTSTN         If 0: Jump to Label_SPACE     [0]         {0:32}
NSSTN         Create Label_SPACE            [0]         {0:32}
SSSTSSSTTSN   Push 70                       [0,70]      {0:32}
NSTN          Jump to Label_PRINT           [0,70]      {0:32}
NSSN          Create Label_PRINT            [0,70]      {0:32}
TNST          Print as integer              [0]         {0:32}            70
                                                                                  error

Program bir hata ile duruyor: Tanımlanmış bir çıkış yok.
Çevrimiçi deneyin (yalnızca ham alanlar, sekmeler ve yeni satırlarla).

Giriş: sekme

Bunun yerine STDIN \t( 9) olacaktır , bu durumda 0ilk If 0kontrolde olacaktır, LABEL_TAB/ işaretine NSSSTNgidecektir ve 37yerine itip basacaktır .

Çevrimiçi deneyin (yalnızca ham alanlar, sekmeler ve yeni satırlarla).

Giriş: yeni hat

Bunun yerine STDIN \n( 10) olacaktır; bu durumda 0ikinci If 0kontrolde olacaktır, Label_NEWLINE/ konumuna gider NSSSNve 33yerine basıp yazdırır .

Çevrimiçi deneyin (yalnızca ham alanlar, sekmeler ve yeni satırlarla).

Giriş: başka bir şey

Başka herhangi bir giriş karakteri NSTNüçüncü çekimden sonra (Label_PRINT'e atla) yapacaktır If 0, 0bu da hala yığındaydı (en başında çoğalttığımız).

Çevrimiçi deneyin (yalnızca ham alanlar, sekmeler ve yeni satırlarla).


1
Bu, bu zorluk için harika bir dil.
qwr

2

Japt , 27 bayt

\Ua"" a a a " ÄU\\\"a "aU Ä
            " ÄU\\\"a "     // Given this string literal,
                       aU   // find the last index of the input
                          Ä // and add +1.
\Ua"" a a a                 // Do nothing useful, but make the results match.

Mevcut Japt cevaplarından daha uzun, ancak farklı bir yaklaşım kullanıyor.
Tüm karakter karakterlerinin benzersiz sayıda gerçekleşmesi gerektiğine dair doğasında sınırlama vardır.

Bir dize olarak girdi alır.

Çevrimiçi deneyin!


2

Perl, 130 bayt

+print+0+((0)x40,6,6,0,3,43,0,0,0,22,12,6,3,5,2,4,0,1,0,0,0,1,0,1,(0)x28,1,0,1,(0)x6,1,(0)x4,1,(0)x4,1,1,1,0,2,0,1,0,0,0,5)[ord<>]

Yeni satır veya başka boşluk yok. Standart çıktıdan bir satır okur, ancak yalnızca ilk baytları önemser, ardından baytın kendi kaynak kodunda, kaç satırda, yeni bir satır olmadan oluşma sayısını yazdırır.

Program basittir. Kaynak kodun çoğu, olası her bir bayt için cevap veren bir hazır bilgi tablosu tarafından işgal edilir. Sondaki sıfırlar yok sayılır ve bitişik sıfırlar çalışma zamanı sıkıştırılır, ancak bunun dışında özel bir numara yoktur. Programın geri kalanı sadece girişi okur ve cevap tablosuna bakar.

Örneğin 22, 12, 6, 3, 5, 2, 4, 0, 1, 0, kaynak kodundaki kısım rakamların sıklığını verir, dolayısıyla kaynak kodunda 22 sıfır, 12 adet, 6 twos vb. Vardır. Sonuç olarak, 0programın standart girişine girerseniz , program yazdırılır 22.


2

C (gcc) , 1033 bayt

#include <stdio.h>
int main(int argc,char *argv[]){int r=0*14811;switch((int)argv[1][0]){case' ':r=6;break;case'"':r=3;break;case'#':r=2;break;case'%':r=2;break;case'\'':r=101;break;case'(':r=5;break;case')':r=5;break;case'*':r=5*1*1;break;case'.':r=2;break;case':':r=51;break;case';':r=103;break;case'<':r=2;break;case'=':r=52;break;case'>':r=2;break;case'[':r=4;break;case'\\':r=3;break;case']':r=4;break;case'0':r=11;break;case'1':r=20;break;case'2':r=20;break;case'3':r=9;break;case'4':r=7;break;case'5':r=12;break;case'6':r=3;break;case'7':r=2;break;case'8':r=5;break;case'9':r=2;break;case'a':r=106;break;case'b':r=51;break;case'c':r=55;break;case'd':r=4;break;case'e':r=102;break;case'f':r=2;break;case'g':r=4;break;case'h':r=4;break;case'i':r=10;break;case'k':r=51;break;case'l':r=2;break;case'm':r=2;break;case'n':r=8;break;case'o':r=2;break;case'p':r=2;break;case'r':r=108;break;case's':r=53;break;case't':r=8;break;case'u':r=2;break;case'v':r=3;break;case'w':r=2;break;case'{':r=3;break;case'}':r=3;break;}printf("%d",r);}

Çevrimiçi deneyin!

Bu, HAYIR tarafından verilen bir golf yanıtıdır, ancak bu zorluğu aşina olmadığım bir dilde gerçekleştirmeye çalışmak eğlenceliydi. Rakamların oluşumlarını bulma zamanı gelene kadar bu özellikle zor değildi, şimdi bu bir meydan okumaydı. Biraz yaratıcı dengeleme yapmak zorunda kaldım :)


2

C (gcc) , 192 bayt

F(J){J=J-70?J-40?J-41?J-74?J-'{'?J-'}'?J-39?J-48?J-49?J-50?J-51?J-52?J-53?J-54?J-55?J-56?J-57?J-47?J-61?J-63?J-45?J-58?J-59?0:1:23:23:23:1:2:3:3:4:4:14:14:10:10:15:6:4:2:2:25:1:1:1;}//84332211

Çevrimiçi deneyin!

Muhtemelen daha fazla golf oynamak mümkün. Ekstra basamağı eklemek için sonunda bir yorum 'karalama alanı' olarak kullanır. Bir rakamı X'den Y'ye değiştirmem gerektiğinde, telafi etmek için çizikteki Y'lerden birini X'e değiştiririm. Bunun dışında, sadece bir tamsayı alan, büyük bir üçlü koşullu temelli bir değer döndürmek için atama hilesini kullanarak bir işlevdir.


Sayısal sabiti sıfıra sonra 0*84332211diğer C cevabındaki gibi sıfıra hareket ettirerek 1 byte tasarruf edebilirim , ancak daha küçük olacak şekilde yeniden aktive ederek byte'leri de kaydedebilirim, bu yüzden henüz rahatsız etmeyeceğim.
LambdaBeta

Daha az yaygın sayılar için aralık denetimi kullanarak bayt tasarruf edebilir misiniz? yani, 4-9'un nadir karakterler olduğunu kabul edersek, koşullu bir kontrolle hepsini tek seferde halledebiliriz.
qwr

Neredeyse kesin. Bazı sembollerin asla görünmemesi veya bit desenlerinin kullanılabileceği şekilde (örneğin J&1?tüm tuhaf karakterlerin eşleşmesi için) şeyler için akıllı isimler seçerek muhtemelen daha da fazlasını kaldırabiliriz . Bunu yapacak zamanı bulursam golf oynayabilirim.
LambdaBeta

2

x86 .COM, 17 bayt, tartışmalı

0120 BF2001        MOV     DI,0120 (120 be the current address)
0123 B91100        MOV     CX,0011
0126 AE            SCASB
0127 7502          JNZ     012B
0129 FEC4          INC     AH
012B E2F9          LOOP    0126
012D C1E808        SHR     AX,8
0130 C3            RET

36 bayt

0100 BF????        MOV     DI,(an copy of this code)
0103 B91200        MOV     CX,0012
0106 AE            SCASB
0107 7503          JNZ     010C
0109 80C402        ADD     AH,02
010C E2F8          LOOP    0106
010E C1E808        SHR     AX,8
0111 C3            RET

2
Bu okuma kendi kodu değil mi?
Razvan Socol

@RazvanSocol Bence JavaScript çözümü gibi bir şey
l4m2

@RazvanSocol iyi bir dosyaya kaydetme gerektirmez, bu yüzden tamam. çok sayıda fungeoid ve JS de bunu yapar
ASCII-sadece

"Kendi kaynak kodunu okumak" olarak sayılan, yürütülen kodu okuduğunuzu savunuyorum. Şimdi programın bir dize kopyasına sahip olduğunu iddia edebilirsiniz, buradaki çoğu çözümde olduğu gibi, aynı zamanda "kaynak kodunu okuyor", ancak dizge çalıştırılmadı.
qwr

1

Japt , 14 bayt

Qi"QiUè² " ²èU

Dene


açıklama

                   :Implicit input of character string U
  "QiUè² "         :String literal
Qi                 :Append a quotation mark
           ²       :Repeat twice
            èU     :Count the occurrences of U


1

Jöle , 16 bayt

“;⁾w⁸a2”;⁾“”w⁸a2

Çevrimiçi deneyin!

Her karakter tam olarak iki kez görünür.

“;⁾w⁸a2”;⁾“”w⁸a2
“;⁾w⁸a2”;⁾“”     the string ;⁾w⁸a2“”
            w⁸a2 return 2 if input in string

1

x86, 42 40 bayt

Burada diğerleriyle aynı stratejiyi kullanıyorum: Programın benzersiz baytlara sahip bir dize kopyası oluşturun, sonra algirdi aldizgede ise 2 değerini döndürün. Gerçekten çalışan kodu okumamıza izin verirsek , l4m2'nin çözümünü elde ederiz .

Harika bir string komutundan faydalanmalıyım scasb. Bildiğim kadarıyla, yinelenen bayt yok, ancak bu kolayca bozabileceğim bir şey. Dize adresini Yükleme 5 bayt alır ama herhangi kısa çözümün farkında değilim (64-bit leave ripofset ile 6 bayt alır).

-2 02kere kullanmaktan kaçınmak için geriye doğru atlayarak .

.section .text
.globl main
main:
        mov     $0xff, %eax

start:
        push    $20             # program length
        pop     %ecx            # counter
        mov     $str, %edi      # load string

loop:
        scasb                   # if (al == *(edi++))  
        jne     loop1           
        mov     $2, %al         # ret 2
end:    ret             
loop1:
        loop    loop            # do while (--counter)
        xor     %eax, %eax      # ret 0
        jmp     end

str:    .byte 0x6a,0x14,0x59,0xbf,0xf4,0x83,0x04,0x08 
        .byte 0xae,0x75,0x03,0xb0,0x02,0xc3,0xe2,0xf8
        .byte 0x31,0xc0,0xeb,0xf9 

Hexdump (elf32-i386 ikili dosya biçiminde, obj dosyası maalesef adrese göre 00bayt olarak str):

000003e0  6a 14 59 bf f4 83 04 08  ae 75 03 b0 02 c3 e2 f8  |j.Y......u......|
000003f0  31 c0 eb f9 6a 14 59 bf  f4 83 04 08 ae 75 03 b0  |1...j.Y......u..|
00000400  02 c3 e2 f8 31 c0 eb f9                           |....1...|

x86, 256 bayt

Dev bir yorumun eşdeğeri olan sıkıcı cevap. Giriş cl, hemen 1 inç döndürür al. Boş zamanlarım olduğunda gerçek bir cevap vereceğim.

00000039  b0 01 c3 00 02 03 04 05  06 07 08 09 0a 0b 0c 0d  |................|
00000049  0e 0f 10 11 12 13 14 15  16 17 18 19 1a 1b 1c 1d  |................|
00000059  1e 1f 20 21 22 23 24 25  26 27 28 29 2a 2b 2c 2d  |.. !"#$%&'()*+,-|
00000069  2e 2f 30 31 32 33 34 35  36 37 38 39 3a 3b 3c 3d  |./0123456789:;<=|
00000079  3e 3f 40 41 42 43 44 45  46 47 48 49 4a 4b 4c 4d  |>?@ABCDEFGHIJKLM|
00000089  4e 4f 50 51 52 53 54 55  56 57 58 59 5a 5b 5c 5d  |NOPQRSTUVWXYZ[\]|
00000099  5e 5f 60 61 62 63 64 65  66 67 68 69 6a 6b 6c 6d  |^_`abcdefghijklm|
000000a9  6e 6f 70 71 72 73 74 75  76 77 78 79 7a 7b 7c 7d  |nopqrstuvwxyz{|}|
000000b9  7e 7f 80 81 82 83 84 85  86 87 88 89 8a 8b 8c 8d  |~...............|
000000c9  8e 8f 90 91 92 93 94 95  96 97 98 99 9a 9b 9c 9d  |................|
000000d9  9e 9f a0 a1 a2 a3 a4 a5  a6 a7 a8 a9 aa ab ac ad  |................|
000000e9  ae af b1 b2 b3 b4 b5 b6  b7 b8 b9 ba bb bc bd be  |................|
000000f9  bf c0 c1 c2 c4 c5 c6 c7  c8 c9 ca cb cc cd ce cf  |................|
00000109  d0 d1 d2 d3 d4 d5 d6 d7  d8 d9 da db dc dd de df  |................|
00000119  e0 e1 e2 e3 e4 e5 e6 e7  e8 e9 ea eb ec ed ee ef  |................|
00000129  f0 f1 f2 f3 f4 f5 f6 f7  f8 f9 fa fb fc fd fe ff  |................|

1

APL (Dyalog Klasik) , 30 bayt

⊢⊢⊢11-11-11-'''''''1''⊢-⍳⍳0'⍳⊢

Çevrimiçi deneyin!

açıklama

APL'de, dizgelerin içindeki tek tırnak işaretleri iki katına çıkarılarak çıkarılır, yani programda kullanılan her karakteri içeren '''''''1''⊢-⍳⍳0'dizedir '''1'⊢-⍳⍳0.

APL dizileri, varsayılan olarak 1 indekslidir ve 1 + max indexeleman bulunmazsa ilginç bir şekilde indeks fonksiyon fonksiyonu döner .

Böylece dizgede indeks kullanılarak girdi döndürülür.

Input    Index    Count
'        1        10
1        4        7
⊢        6        5
-        7        4
⍳        8        3
0        10       1
<other>  11       0

Görüldüğü gibi 11 - indexprogramdaki karakterlerin sayısını verir. Yani, temel algoritma

11-'''''''1''⊢-⍳⍳0'⍳⊢

Gerisi, boşluklara güzelce sığmalarını sağlamak için karakter sayılarını şişiriyor.


1

R , 135 bayt

Esinlenen bu Python cevap .

Önceki sürümler kırıldı. @ Giuseppe'ye pastegerek olmadığını belirttiği için teşekkürler, 18 byte kazandı . lengths(regmatches(z,gregexpr(x,z)))dan bu cevap .

function(x,z=rep(c("afilo2679=:","hmpu15'","nstxz","cgr","e","()",'"',","),c(2:5,7,9,15,16)))sum(lengths(regmatches(z,gregexpr(x,z))))

Çevrimiçi deneyin!



0

Ruby, 48 bayt

->x{%q[->x{%q[].count(x.chr)*2}].count(x.chr)*2}

%q[str]bir dize değişmezi yazmaktan daha uygun bir yoldur, "str"çünkü herhangi bir kaçış olmadan kendi içine yuvalanabilir. Bu yüzden içindeki kopya dışında tüm kodu girdim, sonra sayımı iki katına çıkardım.


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.