Program autogram


34

Kalimat ini menggunakan dua a, dua c, dua d, dua puluh delapan e, lima f, tiga g, delapan jam, sebelas i, tiga l, dua m, tiga belas n, sembilan o, dua p, lima r, dua r, dua puluh lima s, dua puluh tiga t, enam v, sepuluh w, dua x, lima y, dan satu z.

Kalimat semacam itu disebut autograms . Tugas Anda adalah menulis program atau fungsi yang memiliki properti serupa: dibutuhkan sebagai input byte, dan menghasilkan integer yang menunjukkan berapa kali byte tersebut muncul dalam kode sumber program. Ini harus menampilkan 0 jika inputnya tidak muncul di sumbernya.

Program Anda tidak boleh membaca kode sumbernya sendiri , secara langsung atau tidak langsung, tetapi semua data yang dibutuhkan untuk menghasilkan outputnya harus berupa hard-coded, gaya quine. Panjang program Anda harus setidaknya satu byte.

Ini adalah , sehingga entri terpendek (dalam byte) menang. Saya tidak akan menerima jawaban, jadi jangan ragu untuk bersaing untuk solusi terpendek dalam bahasa favorit Anda.

Anda sangat dianjurkan untuk memasukkan penjelasan dalam posting Anda.

Papan peringkat

Berikut adalah papan peringkat untuk skor keseluruhan dan per bahasa:


5
Kotak pasir . (Sudah ada di sana sejak 2014!)
Nathaniel

Apakah fungsi diizinkan, atau hanya program lengkap?
Uriel

1
Catatan: Jawaban yang mirip dengan yang ini tidak lagi dianggap valid.
user202729

1
FWIW, definisi quine yang tepat sedikit lebih kuat daripada yang saya inginkan untuk tantangan ini. Sebagai contoh, saya akan sangat senang melihat program yang menggunakan semua karakter dalam beberapa rentang yang berdekatan, dan hanya menghasilkan 1 jika inputnya berada dalam kisaran itu, meskipun ini tidak memiliki "bagian dari program yang mengkodekan bagian berbeda dari program ". Untuk alasan itu saya rela mengizinkan contoh retina, meskipun akan mengecewakan jika menunda orang lain dari memposting, karena sudah hanya 1 byte. (@ user202729)
Nathaniel

1
Karena komentar saya di atas, saya telah menghapus pernyataan bahwa aturan quine berlaku. (Saya telah menyimpan bagian tentang tidak membaca kode sumber.)
Nathaniel

Jawaban:


15

Oktaf , 44 byte

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

Cobalah online!

Hasil fungsi, saat menggunakan masing-masing karakter dalam fungsi sebagai input:

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

Semua karakter input lainnya menghasilkan nol.

Fakta bahwa saya harus melarikan diri 'membuat ini jauh lebih lama. Untuk menjelaskan 4 kurung, saya hanya memiliki duplikat dalam string. Namun, menggandakan tanda kutip membutuhkan tanda kutip, jadi ini hanya membawa kita lebih jauh dari hasil yang benar. Oleh karena itu, saya harus menghitung jumlah apostrof dengan nilai ASCII-nya 39,. Ini tentu saja berarti saya harus memeriksa karakter 3dan 9juga, membuatnya jauh lebih lama.


2
Ini adalah hal yang saya harap bisa saya lihat lebih banyak. (Mengoptimalkan masalah, daripada hanya mengambil quine standar dan menambahkan kode untuk menghitung karakter.)
Nathaniel

7

Excel, 84 byte

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

Find()akan mencari nilai dalam sel A1di dalam string "123456789,()=MINORFADEOMEN( """di awal adalah untuk keluar dari karakter dan akan dievaluasi menjadi adil ").

Berdasarkan hasil Find(), Mid()fungsi akan mengembalikan karakter yang sesuai dari deretan angka. String ini dibuat melalui iterasi hingga berhenti berubah.

Jika karakter dalam A1tidak ditemukan, Find()mengembalikan kesalahan sehingga IfError()fungsi lolos itu untuk kembali 0sebagai gantinya.

Pada OMENakhir string yang dicari dalam Find()fungsi adalah huruf duplikat sehingga posisi mereka tidak akan pernah dikembalikan tetapi mereka diperlukan untuk menyesuaikan jumlah karakter. Tanpa mereka, ada loop tak berujung jumlah berubah. Pengaturan surat adalah pilihan gaya.


5

JavaScript (ES6), 70 byte

Tidak membaca sumber fungsi, tetapi ini cukup panjang. Mengambil input sebagai string 1-karakter.

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

Cobalah online!


Anda dapat mempersingkat banyak ini dengan mengerjakan ulang sedikit untuk menurunkan jumlah karakter yang berbeda: i=>'36335633'[i='\\36=\'i|&()25.>[]Odefx~n'.indexOf(i)]||~i&&2(8 byte disimpan)
Yair Rand

5

Retina , 1 byte

Ini tidak akan valid jika mengikuti aturan quine secara ketat, tetapi OP secara eksplisit mengizinkannya dalam komentar .

x

Cobalah online!

Dalam retina, program garis tunggal menghitung kemunculan regex dalam input. Tantangan ini diselesaikan dengan karakter ASCII tunggal kecuali `, ., +, *, ?, [, (, ), ^, $, \dan baris baru.


5

C # (Visual C # Compiler) , 88 57 byte

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

Cobalah online!

Mengembalikan 3 jika string berisi char yang lewat, jika tidak menghasilkan 0. String berisi setiap karakter kode minimal sekali dan persis jumlah yang diperlukan untuk memiliki char 3 kali dalam kode.

-31 byte terima kasih kepada Kevin Cruijssen


Pendekatan yang bagus! +1 dari saya. Anda dapat menyimpan beberapa byte dengan menghapus tanda kurung di sekitar (a)=>dan mengambil input sebagai string daripada char sehingga .ToString()tidak lagi diperlukan (dan a+""bisa digunakan juga, untuk tantangan kode-golf Anda tidak akan pernah perlu .ToString()). Juga, karena .Containssudah mengandung a, Anda dapat membuat variabel input menjadi karakter yang tidak digunakan yang berbeda (seperti xatau q) untuk memiliki 3 untuk setiap karakter, bukan 4. EDIT: Jangan pedulikan bagian terakhir, saya melihat "digunakan 4 kali juga sekarang.
Kevin Cruijssen

@KevinCruijssen Terima kasih atas sarannya. Tetapi apakah string valid sebagai input? Mengingat OP meminta byte sebagai input?
Hyarus

Selama itu string karakter tunggal saya cukup yakin itu. Kebanyakan bahasa hanya dapat memasukkan nilai string, dan beberapa yang memiliki karakter masih memilih untuk memasukkan sebagai string (seperti Java, JavaScript, dan Japt misalnya. Format input dan output biasanya cukup fleksibel. Tetapi Anda selalu dapat meminta OP dalam berkomentar jika Anda masih ragu. :)
Kevin Cruijssen

1
@KevinCruijssen terdengar masuk akal. Dan jika kita lolos dari salah satu dari "kita bahkan bisa turun ke 3 yang diinginkan per char
Hyarus

2
String karakter tunggal sebagai input tidak masalah bagi saya.
Nathaniel

4

Haskell , 66 byte

Dua versi pertama pada dasarnya quine yang memfilter karakter yang diperlukan dan kemudian mengambil panjangnya:

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

Cobalah online atau uji dengan semua karakter! *


Alternatif tanpa (<>), 72 byte

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

Cobalah online atau uji dengan semua karakter!


Alternatif non-quine, 87 86 byte

Mungkin masih bisa ditingkatkan, tetapi saya senang bahwa saya turun ke hanya tiga kelompok yang berbeda.

Saya suka yang terbaik ini, meskipun itu yang paling banyak byte. Itu menghitung jumlah karakter / byte sebagai jumlah dari 2,3 dan 7 (perhatikan bagaimana beberapa karakter dalam beberapa grup):

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

Cobalah online atau uji dengan semua karakter!


* diimpor (<>)karena versi GHC TIO adalah 8.0.2


3

Python 2 , 54 52 32 byte

-20 bytes terima kasih kepada ovs

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

Cobalah online!


1
Kenapa Anda tidak punya lambda atau input?
Stewie Griffin

2
@StewieGriffin Python secara otomatis mengikat referensi metode, jadi "xxx".countsama dengan lambda c:"xxx".count(c).
Neil

@StewieGriffin dan Anda menggunakan keduanya dengan cara yang sama -> f="xxx".countdan f=lambda c:"xxx".count(c)akan disebut sebagaif('a')
Rod

3

Sekam , 11 10 8 byte

Terima kasih Leo untuk -2 byte!

#sD"#sD"

Cobalah online!

Penjelasan

Ini memastikan bahwa itu hanya menggunakan ASCII (karena showakan mengacaukannya) dan bahwa setiap karakter berisi dua kali:

#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

Ekstensi quine standar, 11 byte

#hS+s"#hS+s

Cobalah online!

Penjelasan

#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
Anda dapat mengelola penawaran dengan lebih mudah dengan menggandakan string sebelum menunjukkannya: Coba online!
Leo

3

Java 10, 164 81 57 byte

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

Port jawaban @Hyarus 'C # , jadi pastikan untuk menghapusnya!

Penjelasan:

Cobalah online.

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

Old 164-byte jawaban:

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

Penjelasan:

Cobalah online.

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

:

  • String sberisi kode sumber yang tidak diformat.
  • %sdigunakan untuk memasukkan String ini ke dalam dirinya sendiri dengan s.format(...).
  • %c, %1$cdan 34digunakan untuk memformat tanda kutip ganda.
  • s.format(s,34,s) menempatkan semuanya bersama-sama

Bagian tantangan:

  • .replaceAll("[^"+c+']',"") menghapus semua karakter kecuali yang sama dengan input.
  • .length() lalu butuh panjang dari String ini.

CATATAN: .split(c).length(dengan Stringinput sebagai ganti char) mungkin tampak lebih pendek, tetapi memiliki dua masalah:

  1. Karakter pertama memberikan hasil yang salah, jadi jika c(dengan c->sebagai bagian utama) adalah input, itu akan salah mengembalikan satu karakter terlalu sedikit. Ini dapat diperbaiki dengan menambahkan +(c==99?1:0)kode sumber dan String kode sumber yang tidak diformat (dan berubah .split(c)menjadi.split(c+"") , tetapi kemudian kita masih memiliki masalah berikut:
  2. Jika karakter regex (yaitu $) adalah input, .splitakan menafsirkannya sebagai regex, memberikan hasil yang salah.

3

Haskell , 58 byte

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

Cobalah online! atau verifikasi solusinya .

Alternatif jumlah byte yang sama:

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 byte

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

Cobalah online! atau verifikasi solusinya . Menggunakan fakta itu sum Nothing = 0dan misalnya sum (Just 4) = 4.


3

Smalltalk , 112 132 byte

Smalltalk tidak dikenal karena kecocokan golfnya :-)

Metode yang didefinisikan dalam karakter kelas (diuji dalam VA Smalltalk dan Squeak, harus bekerja dalam dialek lain seperti VisualWorks dan Pharo juga):

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

Karakter yang muncul di sumber dikelompokkan berdasarkan jumlah kejadian. Grup diuji untuk yang pertama yang berisi penerima, dan jumlah kejadian yang cocok dikembalikan.

Metode lama:

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

Setiap karakter yang muncul dalam metode muncul tepat 6 kali (dengan diulang dalam konstanta string), jadi metode hanya memeriksa apakah penerima terkandung dalam string dan mengembalikan 6 jika ya, 0 sebaliknya.

Setelah mendefinisikan metode seperti di atas, Anda dapat memvalidasinya menggunakan

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

Hasilnya harus kosong.


1
Selamat datang di PPCG!
Martin Ender

2

JavaScript, 31 byte

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

Cobalah online


1
Saya pikir ini membaca kode sumbernya sendiri, bukan? Itu secara eksplisit dilarang, tebal, dalam pertanyaan.
Nathaniel

1
@Nathaniel, lihat di sini .
Shaggy

2
Hmm. Yah jujur ​​saya pikir itu bodoh, tapi saya tidak bisa benar-benar tidak setuju dengan konsensus meta kurasa.
Nathaniel

1
@Nathaniel Untuk semua program yang membuat eval mudah, mereka juga membuat quine mudah.
user202729

1
@ user202729 Saya rasa itu tidak mengikuti, kan? Anda tidak dapat melakukan trik yang sama dengan Python, misalnya. Ini adalah eval terbalik, bukan eval
Nathaniel



2

Haskell , 96 byte

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

Cobalah online!

Haskell , 109 byte

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

Cobalah online!

Haskell , 122 byte

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

Cobalah online!

Penjelasan

Jawaban-jawaban ini tidak terlalu canggih. Ini adalah serangkaian deklarasi, satu untuk setiap karakter yang ada dalam program. Pada akhirnya kami memiliki tangkapan semua yang mengembalikan 0 untuk karakter yang tidak ada dalam program.

Saya menggunakan beberapa trik untuk meminimalkan jumlah karakter yang diperlukan dalam program dan dari sana saya mengutak-atik hal-hal sampai jumlahnya ternyata tepat. Anda dapat melihat bahwa saya telah mengisi nama variabel dalam deklarasi terakhir, di ketiganya. Perbedaan antara 3 program ini adalah apakah saya memilih untuk menggunakan baris baru atau ;untuk jeda baris dan apakah saya memilih untuk mengambil karakter sebagai input atau string. The ;pendekatan tampaknya tidak inheren lebih unggul dari orang lain itu hanya akan beruntung dan berakhir up lebih pendek, namun hal itu tampaknya bahwa menggunakan String adalah ide yang lebih baik dari Chars karena Chars memerlukan spasi setelah nama fungsi sebuah String tidak.


: | apa yang terjadi pada ejaan Anda dalam penjelasannya
ASCII

2

Spasi , 140 byte

[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]

Huruf S(spasi), T(tab), dan N(baris baru) ditambahkan hanya sebagai penyorotan.
[..._some_action]ditambahkan sebagai penjelasan saja.

70 spasi, 37 tab, dan 33 baris baru yang digunakan.

Biasanya saya menggunakan Buat Label dalam urutan NSSN, NSSSN, NSSTN, NSSSSN, NSSSTN, NSSTSN, NSSTTN, dll Tapi karena mencetak nomor di mana biner S=0/ T=1digunakan mempengaruhi jumlah saya perlu output, saya menggunakan label NSSN, NSSSN, NSSTN, dan NSSSTNsebagai gantinya, yang memberikan jumlah sempurna spasi / tab yang akan dicetak dengan angka biner SSSTSSSSTN(33; jumlah baris baru), SSSTSSTSTN(37; jumlah tab), dan SSSTSSSTTSN(70; jumlah spasi).

Penjelasan dalam pseudo-code:

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

Contoh berjalan:

Input: spasi

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 berhenti dengan kesalahan: Tidak ada jalan keluar yang ditentukan.
Cobalah online (dengan spasi, tab, dan hanya baris baru).

Masukan: tab

STDIN akan menjadi \t( 9) sebagai gantinya, dalam hal ini akan menjadi 0pada If 0cek pertama , pergi ke LABEL_TAB/ NSSSTN, dan akan mendorong dan mencetak37 sebagai gantinya.

Cobalah online (dengan spasi, tab, dan hanya baris baru).

Input: baris baru

STDIN akan menjadi \n( 10) sebagai gantinya, dalam hal ini akan 0di If 0cek kedua , pergi ke Label_NEWLINE/ NSSSN, dan akan mendorong dan mencetak 33sebagai gantinya.

Cobalah online (dengan spasi, tab, dan hanya baris baru).

Input: apa pun

Input-karakter lain akan dilakukan NSTN(Langsung ke Label_PRINT) setelah If 0pemeriksaan ketiga , mencetak 0yang masih di tumpukan (yang telah kami duplikasi di awal).

Cobalah online (dengan spasi, tab, dan hanya baris baru).


1
Ini adalah bahasa yang bagus untuk tantangan ini.
qwr

2

Japt , 27 byte

\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.

Lebih panjang dari jawaban Japt yang ada, tetapi menggunakan pendekatan yang berbeda.
Memiliki batasan yang melekat bahwa semua karakter harus muncul beberapa kali.

Mengambil input sebagai string.

Cobalah online!


2

Perl, 130 byte

+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<>]

Tidak memiliki baris baru atau spasi putih lainnya. Membaca baris dari output standar, tetapi hanya peduli dengan byte pertamanya, lalu mencetak berapa kali byte itu terjadi dalam kode sumbernya sendiri dalam desimal, tanpa baris baru.

Program ini mudah. Sebagian besar kode sumber ditempati oleh tabel literal yang memberikan jawaban untuk setiap byte yang mungkin. Nol trailing dihilangkan, dan nol yang berdekatan dikompresi run-time, tetapi tidak ada trik khusus selain itu. Sisa program hanya membaca input dan mencari jawabannya di tabel.

Sebagai contoh, bagian 22, 12, 6, 3, 5, 2, 4, 0, 1, 0dalam kode sumber memberikan frekuensi digit, sehingga ada 22 nol, 12 angka, 6 dua dll dalam kode sumber. Akibatnya, jika Anda memasukkan 0input standar program, program akan mencetak 22.


2

C (gcc) , 1033 byte

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

Cobalah online!

Ini TIDAK berarti jawaban golf, tetapi menyenangkan untuk mencoba menyelesaikan tantangan ini dalam bahasa yang tidak saya kenal. Itu bukan tantangan yang sangat sulit sampai tiba saatnya untuk menemukan kemunculan digit, sekarang ITU adalah tantangan. Harus melakukan sedikit penyeimbangan kreatif :)


2

C (gcc) , 192 byte

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

Cobalah online!

Mungkin bisa bermain golf lebih jauh. Menggunakan komentar di bagian akhir sebagai 'ruang awal' untuk menambahkan angka tambahan Ketika saya harus mengubah digit dari X ke Y, saya mengubah salah satu Y di awal menjadi X untuk mengkompensasi. Selain itu, ini hanya fungsi yang mengambil integer, menggunakan trik penugasan untuk mengembalikan nilai berdasarkan kondisi ternary besar.


Saya dapat menyimpan 1 byte dengan menggerakkan konstanta numerik ke setelah nol 0*84332211seperti pada jawaban C lainnya, tetapi saya juga dapat menyimpan byte dengan refactoring yang lebih kecil, jadi saya tidak akan repot dulu.
LambdaBeta

Bisakah Anda menyimpan byte dengan menggunakan pemeriksaan rentang untuk angka yang kurang umum? yaitu jika kita menganggap 4-9 adalah karakter langka, kita dapat menanganinya sekaligus dengan cek bersyarat.
qwr

Hampir pasti. Kami mungkin bisa menghapus lebih banyak lagi dengan memilih nama yang pandai untuk hal-hal sehingga simbol-simbol tertentu tidak pernah muncul atau sehingga pola bit dapat digunakan (misalnya J&1?untuk mencocokkan semua karakter aneh). Saya dapat melanjutkan golf ini jika saya menemukan waktu untuk melakukannya.
LambdaBeta

2

x86 .COM, 17 byte, kontroversial

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 byte

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
Bukankah ini membaca kode sendiri?
Razvan Socol

@RazvanSocol Saya pikir ini seperti solusi JavaScript
l4m2

@ RazvanSocol juga tidak perlu menyimpan dalam file jadi tidak apa-apa. banyak fungeoid dan JS juga melakukan ini
hanya ASCII

Saya berpendapat Anda membaca kode yang dieksekusi, yang dianggap sebagai "membaca kode sumber sendiri". Sekarang Anda bisa berdebat memiliki salinan string dari program ini, karena kebanyakan solusi di sini, juga "membaca kode sumber", tetapi string tersebut tidak dieksekusi.
qwr

1

Japt , 14 byte

Qi"QiUè² " ²èU

Cobalah


Penjelasan

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


1

Jelly , 16 byte

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

Cobalah online!

Setiap karakter muncul tepat dua kali.

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

1

x86, 42 40 byte

Di sini saya menggunakan strategi yang sama dengan yang lain: Buat salinan string dari program dengan byte unik, lalu kembalikan 2 in aljika inputnya alada di dalam string. Jika kita membiarkan diri kita membaca kode yang benar-benar dijalankan, kita mendapatkan solusi l4m2 .

Saya harus menggunakan instruksi string yang keren scasb. Sepengetahuan saya, tidak ada duplikat byte, tapi ini adalah sesuatu yang saya mudah gagal. Memuat alamat string yang membutuhkan waktu 5 bytes tapi aku tidak mengetahui adanya solusi yang lebih pendek (64-bit leadaririp dengan offset mengambil 6 byte).

-2 dengan melompat mundur untuk menghindari penggunaan 02dua kali.

.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 (dari format file biner elf32-i386, karena sayangnya file obj memiliki 00byte untuk stralamat):

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 byte

Jawaban membosankan itu setara dengan komentar raksasa. Input in cl, segera mengembalikan 1 in al. Saya akan membuat jawaban yang sebenarnya ketika saya memiliki waktu luang.

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 Classic) , 30 byte

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

Cobalah online!

Penjelasan

Dalam APL, tanda kutip tunggal dalam string diloloskan dengan menggandakan, begitu '''''''1''⊢-⍳⍳0'juga string'''1'⊢-⍳⍳0 , yang berisi setiap karakter yang digunakan dalam program.

Array APL secara default diindeks, dan fungsi indeks, yang menarik, kembali 1 + max index jika elemen tidak ditemukan.

Jadi, dengan menggunakan index-of pada string dan input kembali

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

Seperti yang dapat dilihat, 11 - indexberikan jumlah karakter dalam program. Jadi, algoritma dasarnya adalah

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

Sisanya membengkak jumlah karakter untuk memungkinkan mereka masuk dengan baik ke dalam slot.


1

R , 135 byte

Terinspirasi oleh jawaban Python ini .

Versi sebelumnya rusak. Terima kasih kepada @Giuseppe karena menunjukkan bahwa pastetidak diharuskan menyimpan sekitar 18 byte. lengths(regmatches(z,gregexpr(x,z)))dari jawaban ini .

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

Cobalah online!



0

Ruby, 48 byte

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

%q[str]adalah cara yang lebih nyaman untuk menulis string literal daripada "str"karena dapat bersarang di dalam dirinya sendiri tanpa melarikan diri. Jadi saya hanya memasukkan seluruh kode kecuali untuk salinan di dalamnya, lalu gandakan jumlahnya.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.