Autogrammprogramme


34

Dieser Satz verwendet zwei a, zwei c, zwei d, achtundzwanzig e, fünf f, drei g, acht h, elf i, drei l, zwei m, dreizehn n, neun o, zwei p, fünf r, fünfundzwanzig s, dreiundzwanzig t, sechs v, zehn w, zwei x, fünf y und ein z.

Solche Sätze heißen Autogramme . Ihre Aufgabe ist es, ein Programm oder eine Funktion mit einer ähnlichen Eigenschaft zu schreiben: Sie nimmt ein Byte als Eingabe und gibt eine Ganzzahl aus, die angibt, wie oft dieses Byte im Quellcode des Programms vorkommt. Es sollte 0 ausgeben, wenn seine Eingabe nicht in seiner Quelle erscheint.

Ihr Programm darf weder direkt noch indirekt seinen eigenen Quellcode lesen. Stattdessen müssen alle Daten, die für die Ausgabe benötigt werden, fest codiert und quine sein. Ihr Programm muss mindestens ein Byte lang sein.

Das ist , also gewinnt der kürzeste Eintrag (in Bytes). Ich nehme keine Antwort an. Sie können sich also gerne um die kürzeste Lösung in Ihrer Lieblingssprache bewerben.

Es wird dringend empfohlen, eine Erklärung in Ihren Beitrag aufzunehmen.

Bestenlisten

Nachfolgend finden Sie Bestenlisten sowohl für die Gesamtpunktzahl als auch für jede Sprache:


5
Sandkasten . (Es ist seit 2014 da!)
Nathaniel

Sind Funktionen erlaubt oder nur vollständige Programme?
Uriel

1
Hinweis: Antworten ähnlich wie diese als gültig zählen nicht mehr.
User202729

1
FWIW, die richtige Definition von Quine ist ein bisschen stärker als ich es mir für diese Herausforderung wirklich gewünscht hätte. Zum Beispiel würde ich mich sehr freuen, ein Programm zu sehen, das alle Zeichen in einem zusammenhängenden Bereich verwendet und nur eine 1 ausgibt, wenn seine Eingabe in diesem Bereich liegt, obwohl dies keinen Abschnitt des Programms enthält, der codiert ein anderer Teil des Programms ". Aus diesem Grund wäre ich bereit gewesen, das Retina-Beispiel zuzulassen, obwohl es enttäuschend gewesen wäre, wenn es andere vom Posten abgehalten hätte, da es bereits nur 1 Byte groß war. (@ user202729)
Nathaniel

1
Aufgrund meines obigen Kommentars habe ich die Aussage, dass quine-Regeln gelten, entfernt. (Ich habe den Teil über das Nichtlesen des Quellcodes behalten.)
Nathaniel

Antworten:


15

Oktave , 44 Bytes

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

Probieren Sie es online!

Das Ergebnis der Funktion, wenn jedes der Zeichen in der Funktion als Eingabe verwendet wird:

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

Alle anderen eingegebenen Zeichen geben eine Null zurück.

Die Tatsache, dass ich fliehen musste ', verlängerte dies erheblich. Um die 4 Klammern zu berücksichtigen, hatte ich gerade ein Duplikat in der Zeichenfolge. Das Duplizieren von Apostrophen erfordert jedoch Apostrophe, sodass wir nur vom richtigen Ergebnis abweichen. Daher musste ich die Anzahl der Apostrophe mit ihrem ASCII-Wert zählen 39. Dies natürlich bedeutete , dass ich für die Charaktere zu überprüfen hatte 3und 9auch, so dass es eine ganze Menge mehr.


2
Von so etwas hoffe ich mehr zu sehen. (Optimierung für das Problem, anstatt nur ein Standard-Quine zu nehmen und Code hinzuzufügen, um die Zeichen zu zählen.)
Nathaniel

7

Excel, 84 Bytes

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

Find()sucht nach dem Wert in der Zelle A1innerhalb des Strings "123456789,()=MINORFADEOMEN(der """am Anfang steht, um das Zeichen zu maskieren, und wird nur ausgewertet ").

Basierend auf dem Ergebnis von Find()gibt die Mid()Funktion das entsprechende Zeichen aus der Zahlenfolge zurück. Diese Zeichenfolge wurde durch Iteration erstellt, bis die Änderung aufhörte.

Wenn das Zeichen in A1nicht gefunden wird, wird Find()ein Fehler zurückgegeben, sodass die IfError()Funktion den Fehler vermeidet und 0stattdessen zurückgibt .

Die Zeichen OMENam Ende der Zeichenfolge, die in der Find()Funktion durchsucht werden, sind doppelte Buchstaben, sodass ihre Position nie zurückgegeben wird, sie jedoch zum Anpassen der Zeichenanzahl benötigt wurden. Ohne sie gab es eine endlose Schleife wechselnder Zählungen. Die Buchstabenanordnung ist stilistische Wahl.


5

JavaScript (ES6), 70 Byte

Liest nicht die Quelle der Funktion, aber das ist ziemlich lang. Übernimmt die Eingabe als 1-Zeichen-Zeichenfolge.

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

Probieren Sie es online!


Sie können dies ein paar verkürzen, indem Sie ein wenig überarbeiten, um die Anzahl der verschiedenen Zeichen i=>'36335633'[i='\\36=\'i|&()25.>[]Odefx~n'.indexOf(i)]||~i&&2
Yair Rand

5

Netzhaut , 1 Byte

Dies wäre nicht gültig, wenn man sich strikt an die Quine-Regeln hält, das OP dies jedoch ausdrücklich in einem Kommentar zulässt .

x

Probieren Sie es online!

In der Netzhaut zählt ein einzeiliges Programm das Vorkommen dieses regulären Ausdrucks in der Eingabe. Diese Herausforderung wird von einem einzelnen ASCII - Zeichen gelöst außer `, ., +, *, ?, [, (, ), ^, $, \und Newline.


5

C # (Visual C # -Compiler) , 88.57 Byte

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

Probieren Sie es online!

Gibt 3 zurück, wenn der String das übergebene Zeichen enthält, andernfalls 0. Der String enthält jedes Zeichen des Codes mindestens einmal und genau den Betrag, der erforderlich ist, um das Zeichen 3 Mal im Code zu haben.

-31 Bytes dank Kevin Cruijssen


Netter Ansatz! +1 von mir. Sie können einige Bytes einsparen, indem Sie die Klammern entfernen (a)=>und die Eingabe als Zeichenfolge anstelle von char verwenden, sodass dies .ToString()nicht mehr erforderlich ist (und a+""auch für Code-Golf-Herausforderungen verwendet werden könnte, die Sie niemals benötigen werden .ToString()). Da .Containsbereits ein enthalten ist a, können Sie die Eingabevariable auch zu einem anderen unbenutzten Zeichen (wie xoder q) machen, um 3 für jedes Zeichen anstelle von 4 zu haben ".
Kevin Cruijssen

@ KevinCruijssen Danke für den Rat. Aber ist ein String als Eingabe gültig? Betrachtet man OP, das nach einem Byte als Eingabe gefragt wird?
Hyarus

Solange es sich um eine einzelne Zeichenfolge handelt, bin ich mir ziemlich sicher. Die meisten Sprachen können ohnehin nur Zeichenfolgenwerte eingeben, und einige, deren Zeichen noch Zeichenfolgen sind (z. B. Java, JavaScript und Japt). Die Eingabe- und Ausgabeformate sind normalerweise recht flexibel Kommentar, wenn Sie immer noch Zweifel haben. :)
Kevin Cruijssen

1
@ KevinCruijssen klingt vernünftig. Und wenn wir einer der "entkommen, können wir sogar die gewünschten 3 pro
Zeichen erreichen

2
Einzelne Zeichenketten als Eingabe sind für mich in Ordnung.
Nathaniel

4

Haskell , 66 Bytes

Die ersten beiden Versionen sind im Wesentlichen eine Quine, die die erforderlichen Zeichen filtert und dann die Länge annimmt:

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

Probieren Sie es online aus oder testen Sie mit allen Charakteren! *


Alternative ohne (<>)72 Bytes

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

Probieren Sie es online aus oder testen Sie mit allen Charakteren!


Nicht quine Alternative, 87 86 Bytes

Könnte noch verbessert werden, aber ich bin froh, dass ich es auf nur drei verschiedene Gruppen geschafft habe.

Ich mag dieses am besten, obwohl es die meisten Bytes zählt. Es berechnet die Anzahl der Zeichen / Bytes als Summe von 2,3 und 7 (beachten Sie, wie einige Zeichen in mehreren Gruppen sind):

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

Probieren Sie es online aus oder testen Sie mit allen Charakteren!


* Importiert, (<>)da die GHC-Version von TIO 8.0.2 ist


3

Python 2 , 54 52 32 Bytes

-20 bytes dank ovs

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

Probieren Sie es online!


1
Wie kommt es, dass Sie weder Lambda noch Input haben?
Stewie Griffin

2
@StewieGriffin Python bindet automatisch eine Methodenreferenz und "xxx".countist äquivalent zu lambda c:"xxx".count(c).
Neil

@StewieGriffin und Sie verwenden beide auf die gleiche Weise -> f="xxx".countund f=lambda c:"xxx".count(c)werden alsf('a')
Rod

3

Schale , 11 10 8 Bytes

Danke Leo für -2 Bytes!

#sD"#sD"

Probieren Sie es online!

Erläuterung

Dies stellt sicher, dass nur ASCII verwendet wird (da showdies zu Problemen führen würde) und dass jedes Zeichen zweimal enthalten ist:

#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

Standard-Quine-Erweiterung, 11 Byte

#hS+s"#hS+s

Probieren Sie es online!

Erläuterung

#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
Sie können die Anführungszeichen einfacher verwalten, indem Sie die Zeichenfolge verdoppeln, bevor Sie sie anzeigen
Leo

3

Java 10, 164 81 57 Bytes

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

Port of @Hyarus 'C # -Antwort , also stelle sicher, dass du ihn positiv bewertest!

Erläuterung:

Probieren Sie es online aus.

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

Alte 164-Byte-Antwort:

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

Erläuterung:

Probieren Sie es online aus.

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

-Teil:

  • Der String senthält den unformatierten Quellcode.
  • %swird verwendet, um diesen String in sich selbst mit dem einzugeben s.format(...).
  • %c, %1$cUnd die 34werden verwendet , um die doppelten Anführungszeichen zu formatieren.
  • s.format(s,34,s) setzt alles zusammen

Herausforderungsteil:

  • .replaceAll("[^"+c+']',"") Entfernt alle Zeichen mit Ausnahme derjenigen, die der Eingabe entsprechen.
  • .length() nimmt dann die Länge dieses Strings an.

HINWEIS: .split(c).length(mit StringEingabe anstelle von char) mag kürzer erscheinen, weist jedoch zwei Probleme auf:

  1. Das erste Zeichen gibt ein falsches Ergebnis aus. Wenn also c(mit c->als führendem Teil) eingegeben wird, wird fälschlicherweise ein Zeichen zu wenig zurückgegeben. Dies kann durch Zugabe fixiert werden +(c==99?1:0)sowohl im Quellcode und unformatiert Quellcode String (und Ändern .split(c)zu .split(c+""), aber dann haben wir noch folgendes Problem:
  2. Wenn ein Regex-Zeichen (dh $) eingegeben wird, .splitwird es als Regex interpretiert, was zu einem falschen Ergebnis führt.

3

Haskell , 58 Bytes

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

Probieren Sie es online! oder überprüfen Sie die Lösung .

Alternativen für die gleiche Bytezahl:

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 Bytes

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

Probieren Sie es online! oder überprüfen Sie die Lösung . Nutzt die Tatsache, dass sum Nothing = 0und z sum (Just 4) = 4.


3

Smalltalk , 112 132 Bytes

Smalltalk ist nicht gerade für seine Golftauglichkeit bekannt :-)

In der Klasse Character definierte Methode (getestet in VA Smalltalk und Squeak, sollte auch in anderen Dialekten wie VisualWorks und Pharo funktionieren):

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

In der Quelle vorkommende Zeichen werden nach Anzahl der Vorkommen gruppiert. Die Gruppen werden auf die erste getestet, die den Empfänger enthält, und die Anzahl der übereinstimmenden Vorkommen wird zurückgegeben.

Alte Methode:

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

Jedes Zeichen, das in der Methode vorkommt, kommt genau sechsmal vor (indem es in der Zeichenfolgenkonstante wiederholt wird). Die Methode überprüft also nur, ob der Empfänger in der Zeichenfolge enthalten ist, und gibt 6 zurück, wenn dies der Fall ist, andernfalls 0.

Nachdem Sie die Methode wie oben definiert haben, können Sie sie mit validieren

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

Das Ergebnis sollte leer sein.


1
Willkommen bei PPCG!
Martin Ender

2

JavaScript, 31 Bytes

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

Probieren Sie es online aus


1
Ich denke, das liest seinen eigenen Quellcode, nicht wahr? Das ist in der Frage ausdrücklich verboten, in Fettdruck.
Nathaniel

1
@ Nathaniel, siehe hier .
Shaggy

2
Hmm. Ehrlich gesagt denke ich, dass das dumm ist, aber ich kann dem Metakonsens nicht wirklich widersprechen, nehme ich an.
Nathaniel

1
@ Nathaniel Für alle Programme, die das Auswerten erleichtern, machen sie auch das Auswerten einfach.
user202729

1
@ user202729 Ich glaube nicht, dass das folgt, oder? In Python können Sie beispielsweise nicht denselben Trick ausführen. Dies ist eine umgekehrte Auswertung, keine Auswertung
Nathaniel



2

Haskell , 96 Bytes

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

Probieren Sie es online!

Haskell , 109 Bytes

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

Probieren Sie es online!

Haskell , 122 Bytes

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

Probieren Sie es online!

Erklärungen

Diese Antworten sind nicht besonders ausgefeilt. Es handelt sich um eine Reihe von Erklärungen, eine für jedes im Programm vorhandene Zeichen. Am Ende haben wir einen catch all, der für Zeichen, die nicht im Programm vorhanden sind, 0 zurückgibt.

Ich benutze ein paar Tricks, um die Anzahl der im Programm benötigten Zeichen zu minimieren, und von da an habe ich mit den Dingen herumgespielt, bis die Zahlen genau richtig waren. Sie können sehen, dass ich den Variablennamen in der letzten Deklaration aufgefüllt habe, in allen drei. Der Unterschied zwischen den 3 Programmen besteht darin, ob ich eine neue Zeile oder einen ;Zeilenumbruch gewählt habe und ob ich Zeichen als Eingabe oder Zeichenfolgen gewählt habe. Der ;Ansatz scheint den anderen nicht überlegen zu sein, er hat nur Glück und endet kürzer. Es scheint jedoch, dass die Verwendung von Strings eine bessere Idee ist als Zeichen, da Zeichen Leerzeichen nach dem Funktionsnamen erfordern und Zeichen nicht.


: | Was ist mit deiner Rechtschreibung in der Erklärung passiert?
Nur ASCII

2

Leerzeichen , 140 Bytes

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

Buchstaben S(Leerzeichen), T(Tabulator) und (Zeilenvorschub) werden Nnur als Hervorhebungen hinzugefügt.
[..._some_action]nur als Erklärung hinzugefügt.

70 Leerzeichen, 37 Tabulatoren und 33 neue Zeilen.

Normalerweise verwende ich die Etiketten erstellen in der Reihenfolge NSSN, NSSSN, NSSTN, NSSSSN, NSSSTN, NSSTSN, NSSTTN, etc. Aber weil eine Reihe Druck , wo die binären S=0/ T=1verwendet wird , um die Anzahl betrifft ich ausgeben müssen, ich die Etiketten NSSN, NSSSN, NSSTN, und NSSSTNstattdessen das gab die Perfekte Anzahl von Leerzeichen / Tabulatoren, die mit den Binärzahlen SSSTSSSSTN(33; Anzahl der Zeilenwechsel), SSSTSSTSTN(37; Anzahl der Tabulatoren) und SSSTSSSTTSN(70; Anzahl der Leerzeichen) gedruckt werden sollen .

Erklärung im Pseudocode:

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

Beispiel läuft:

Eingabe: Leerzeichen

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

Programm stoppt mit Fehler: Kein Exit definiert.
Probieren Sie es online aus (nur mit Leerzeichen, Tabulatoren und Zeilenumbrüchen).

Eingabe: tab

STDIN wird stattdessen \t( 9) sein, in welchem ​​Fall es 0bei der ersten If 0Prüfung sein wird, geht zu LABEL_TAB/ NSSSTNund wird 37stattdessen drücken und drucken .

Probieren Sie es online aus (nur mit Leerzeichen, Tabulatoren und Zeilenumbrüchen).

Eingabe: Neue Zeile

STDIN wird stattdessen \n( 10) sein, in welchem ​​Fall es 0bei der zweiten If 0Prüfung sein wird, geht zu Label_NEWLINE/ NSSSNund wird 33stattdessen drücken und drucken .

Probieren Sie es online aus (nur mit Leerzeichen, Tabulatoren und Zeilenumbrüchen).

Eingabe: alles andere

Jedes andere Eingabezeichen NSTN(Sprung zu Label_PRINT) druckt nach der dritten If 0Prüfung 0dasjenige aus, das sich noch auf dem Stapel befand (das wir am Anfang dupliziert haben).

Probieren Sie es online aus (nur mit Leerzeichen, Tabulatoren und Zeilenumbrüchen).


1
Dies ist eine großartige Sprache für diese Herausforderung.
Qwr

2

Japt , 27 Bytes

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

Länger als die vorhandene Japt-Antwort, verwendet jedoch einen anderen Ansatz.
Hat die inhärente Einschränkung, dass alle Zeichen eine eindeutige Anzahl von Malen auftreten müssen.

Übernimmt die Eingabe als Zeichenfolge.

Probieren Sie es online!


2

Perl, 130 Bytes

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

Hat keine Zeilenumbrüche oder andere Leerzeichen. Liest eine Zeile aus der Standardausgabe, kümmert sich jedoch nur um die ersten Bytes und gibt dann die Häufigkeit aus, mit der das Byte in seinem eigenen Quellcode dezimal ohne eine neue Zeile vorkommt.

Das Programm ist unkompliziert. Der größte Teil des Quellcodes wird von einer Literal-Tabelle belegt, die die Antwort für jedes mögliche Byte angibt. Nachgestellte Nullen werden weggelassen und benachbarte Nullen werden zur Laufzeit komprimiert, aber es gibt keinen anderen speziellen Trick als diesen. Der Rest des Programms liest einfach die Eingabe und schlägt die Antwort in der Tabelle nach.

Zum Beispiel gibt der Teil 22, 12, 6, 3, 5, 2, 4, 0, 1, 0im Quellcode die Häufigkeit der Ziffern an, sodass der Quellcode 22 Nullen, 12 Einsen, 6 Zweien usw. enthält. Infolgedessen 0wird das Programm gedruckt , wenn Sie die Standardeingabe des Programms eingeben 22.


2

C (gcc) , 1033 Bytes

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

Probieren Sie es online!

Dies ist keineswegs eine gelungene Antwort, aber es hat Spaß gemacht, diese Herausforderung in einer Sprache zu meistern, die ich nicht kenne. Es war keine besonders schwierige Herausforderung, bis es Zeit wurde, die Vorkommen der Ziffern zu finden. Jetzt war DAS eine Herausforderung. Musste ein wenig kreativ balancieren :)


2

C (gcc) , 192 Bytes

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

Probieren Sie es online!

Möglicherweise kann man weiter Golf spielen. Verwendet einen Kommentar am Ende als "Arbeitsbereich", um zusätzliche Ziffern hinzuzufügen. Wenn ich eine Ziffer von X in Y ändern muss, ändere ich eines der Ys im Scratch in ein X, um dies zu kompensieren. Davon abgesehen ist dies nur eine Funktion, die eine Ganzzahl annimmt und mit dem Zuweisungstrick einen Wert zurückgibt, der auf einer großen ternären Bedingung basiert.


Ich kann 1 Byte einsparen, indem ich die numerische Konstante 0*84332211wie in der anderen C-Antwort nach Null verschiebe , aber ich kann auch Bytes einsparen, indem ich sie umgestalte, um sie kleiner zu machen. Ich werde mich also noch nicht darum kümmern.
LambdaBeta

Können Sie Bytes sparen, indem Sie eine Bereichsüberprüfung für die weniger gebräuchlichen Zahlen verwenden? Das heißt, wenn wir annehmen, dass 4-9 seltene Zeichen sind, können wir sie alle mit einer bedingten Prüfung gleichzeitig behandeln.
Qwr

Fast sicher. Wir könnten wahrscheinlich noch mehr entfernen, indem wir clevere Namen für Dinge auswählen, so dass bestimmte Symbole niemals erscheinen oder die Bitmuster verwendet werden können (z. B. J&1?um alle ungeraden Zeichen abzugleichen). Ich kann dies weiter Golf spielen, wenn ich die Zeit dazu finde.
LambdaBeta

2

x86 .COM, 17 Bytes, umstritten

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 Bytes

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
Ist das nicht ein eigener Code?
Razvan Socol

@RazvanSocol Ich denke, es ist wie die JavaScript-Lösung
l4m2

@RazvanSocol Nun, es muss nicht in einer Datei gespeichert werden, also ist es in Ordnung. Viele Fungeoids und JS tun dies auch
ASCII

Ich behaupte, Sie lesen Code, der ausgeführt wird, was als "Lesen des eigenen Quellcodes" gilt. Jetzt könnte man argumentieren, dass eine String-Kopie des Programms, wie die meisten Lösungen hier, auch das "Lesen von Quellcode" ist, aber der String wird nicht ausgeführt.
QWR

1

Japt , 14 Bytes

Qi"QiUè² " ²èU

Versuch es


Erläuterung

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


1

Gelee , 16 Bytes

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

Probieren Sie es online!

Jedes Zeichen erscheint genau zweimal.

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

1

x86, 42 40 Bytes

Hier wende ich dieselbe Strategie an wie bei anderen: Erstelle eine String-Kopie des Programms mit eindeutigen Bytes und gib 2 in zurück, alwenn sich die Eingabe alim String befindet. Wenn wir uns erlauben, tatsächlich ausgeführten Code zu lesen, erhalten wir die Lösung von l4m2 .

Ich muss eine coole String-Anweisung benutzen scasb. Nach meinem besten Wissen gibt es keine doppelten Bytes, aber das ist etwas, was ich leicht vermasseln würde. Die Zeichenfolge Adresse Laden dauert 5 Bytes , aber ich bin mir nicht bekannt , dass kürzere Lösung (64-Bit leavon ripmit Offset dauert 6 Bytes).

-2 durch Rückwärtsspringen, um eine 02doppelte Verwendung zu vermeiden .

.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 (vom binären Dateiformat elf32-i386, da obj-Datei leider 00Bytes für strAdresse hat):

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 Bytes

Langweilige Antwort, die einem riesigen Kommentar entspricht. Eingabe in cl, gibt sofort 1 in zurück al. Ich werde eine tatsächliche Antwort geben, wenn ich Zeit habe.

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'⍳⊢

Probieren Sie es online!

Erläuterung

In APL werden einfache Anführungszeichen in Zeichenfolgen durch Verdoppeln maskiert, ebenso '''''''1''⊢-⍳⍳0'wie die Zeichenfolge'''1'⊢-⍳⍳0 , die alle im Programm verwendeten Zeichen enthält.

APL-Arrays sind standardmäßig 1-indiziert, und der Funktionsindex gibt interessanterweise zurück 1 + max index wenn das Element nicht gefunden wird.

Verwenden Sie also index-of für die Zeichenfolge, und die Eingabe wird zurückgegeben

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

Wie man sieht, 11 - indexgibt es die Anzahl der Zeichen im Programm. Der grundlegende Algorithmus ist also

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

Der Rest ist das Aufblähen der Charaktere, damit sie gut in die Slots passen.


1

R , 135 Bytes

Inspiriert von dieser Python-Antwort .

Frühere Versionen waren fehlerhaft. Dank @ Giuseppe für den Hinweis, dass pastees nicht erforderlich war, sparte es 18 Bytes oder so. lengths(regmatches(z,gregexpr(x,z)))ist aus dieser Antwort .

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

Probieren Sie es online!



0

Ruby, 48 Bytes

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

%q[str]Dies ist eine bequemere Möglichkeit, ein Zeichenfolgenliteral zu schreiben, als "str"dies der Fall ist, weil es in sich selbst geschachtelt werden kann, ohne dass ein Escapezeichen auftritt. Also habe ich nur den gesamten Code mit Ausnahme der darin enthaltenen Kopie eingefügt und dann die Anzahl verdoppelt.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.