In Salesforce CRM hat jedes Objekt eine alphanumerische ID mit 15 Zeichen, bei der zwischen Groß- und Kleinschreibung unterschieden wird. Wenn jemand neugierig ist, ist es tatsächlich die Basis-62-Nummer . Für die Datenmigration und -integration verwendete Tools unterstützen jedoch möglicherweise die Groß- und Kleinschreibung. Um dies zu vermeiden, können IDs sicher in alphanumerische IDs konvertiert werden, bei denen die Groß- und Kleinschreibung keine Rolle spielt. Dabei wird an die ID eine 3-stellige alphanumerische Prüfsumme angehängt. Der Konvertierungsalgorithmus lautet:
Beispiel :
a0RE000000IJmcN
Teilen Sie die ID in drei 5-stellige Blöcke auf.
a0RE0 00000 IJmcN
Kehre jeden Brocken um.
0ER0a 00000 NcmJI
Ersetzen Sie jedes Zeichen in jedem Block durch
1
Großbuchstaben oder durch0
andere.01100 00000 10011
Ermitteln Sie für jede 5-stellige Binärzahl
i
das Zeichen an der Positioni
in der Verkettung von Großbuchstaben und Ziffern 0-5 (ABCDEFGHIJKLMNOPQRSTUVWXYZ012345
).00000 -> A, 00001 -> B, 00010 -> C, ..., 11010 -> Z, 11011 -> 0, ..., 11111 -> 5`
Ausbeute:
M A T
Hängen Sie diese Zeichen, die Prüfsumme, an die ursprüngliche ID an.
Ausgabe :
a0RE000000IJmcNMAT
Schreiben Sie ein Programm oder eine Funktion, die eine 15-stellige alphanumerische Zeichenfolge (ASCII) als Eingabe verwendet und eine 18-stellige ID zurückgibt.
Die Eingabevalidierung ist von dieser Frage ausgeschlossen. Programme können bei ungültiger Eingabe einen beliebigen Wert zurückgeben oder abstürzen.
Bitte verwenden Sie keine Salesforce propretiary Sprachen Funktionen , die diese Herausforderung trivial (wie Formel machen CASESAFEID()
, die Umwandlung Id
zu String
in APEX & c).
Testfälle
a01M00000062mPg -> a01M00000062mPgIAI
001M000000qfPyS -> 001M000000qfPySIAU
a0FE000000D6r3F -> a0FE000000D6r3FMAR
0F9E000000092w2 -> 0F9E000000092w2KAA
aaaaaaaaaaaaaaa -> aaaaaaaaaaaaaaaAAA
AbCdEfGhIjKlMnO -> AbCdEfGhIjKlMnOVKV
aBcDEfgHIJKLMNO -> aBcDEfgHIJKLMNO025
public class X{public X(Id i){System.debug((String)i);}}
. Funktioniert jedoch nur mit gültigen Salesforce-IDs.Antworten:
Ruby, 97 Bytes
Dieser hat ein paar wirklich nette Tricks.
Mein ursprünglicher Instinkt für die Aufteilung der Saite in Gruppen von 5 Zeichen war
each_slice
:Es stellt sich heraus, dass dies im Vergleich zu einer einfachen Regex (
x.chars.each_slice(5)
vs.x.scan(/.{5}/)
) zu lange dauert . Dies scheint im Nachhinein offensichtlich, aber ich habe nie wirklich darüber nachgedacht ... Vielleicht kann ich hier einige meiner alten Ruby-Antworten optimieren.Das, worauf ich in dieser Antwort am meisten stolz bin, ist der folgende Code:
Okay, hier ist ein Hintergrund für die Nicht-Rubyisten. Ruby trennt Boolesche Werte (
TrueClass
,FalseClass
) vollständig von Ganzzahlen / Zahlen (Numeric
). Dies bedeutet, dass es auch keine automatische Konvertierung von true nach 1 und false nach 0 gibt. Dies ist beim Golfen ärgerlich (aber eine gute Sache ... für alle anderen Zwecke).Der naive Ansatz zum Überprüfen, ob ein einzelnes Zeichen in Großbuchstaben geschrieben ist (und 1 oder 0 zurückgibt) ist
Wir können dies ein wenig weiter unten (wieder mit einem regulären Ausdruck):
Aber dann habe ich wirklich nachgedacht. Hmm ...
=~
gibt den Index einer Übereinstimmung (also für unser einzelnes Zeichen immer,0
wenn es eine Übereinstimmung gibt) odernil
bei Nichtübereinstimmung einen falschen Wert zurück (alles andere außerFalseClass
ist in Ruby wahr). Der||
Operator nimmt seinen ersten Operanden, wenn er wahr ist, und seinen zweiten Operanden, wenn er wahr ist. Daher können wir dies bis auf Golf spielenOkay, schauen wir uns an, was hier passiert. Wenn
y
es sich um einen Großbuchstaben handelt,[^A-Z]
stimmt dieser nicht überein , sodass der reguläre Ausdruck zurückgegeben wirdnil
.nil || 1
ist1
, so werden Großbuchstaben1
. Wenny
alles andere als ein Großbuchstabe, kehrt der regex Teil0
(weil es eine Übereinstimmung mit dem Index ist0
), und da0
truthy ist,0 || 1
ist0
.... und erst nachdem ich das alles ausgeschrieben habe, merke ich, dass dies tatsächlich die gleiche Länge ist wie
y=~/[A-Z]/?1:0
. Haha, na ja.quelle
Pyth,
2322 Bytes1 Byte von FryAmTheEggman gespeichert .
Probieren Sie es online aus. Testsuite.
Dies könnte das erste Mal sein, dass ich die
p
Rint-Anweisung beim Golfen verwendet habe.Erläuterung
quelle
MATL , 24 Bytes
Verwendet die aktuelle Version (9.1.0) der Sprache / des Compilers.
Beispiele
Erläuterung
quelle
JavaScript (ES6), 108
Prüfung
quelle
CJam, 27 Bytes
Führen Sie alle Testfälle aus.
Eine ziemlich einfache Implementierung der Spezifikation. Der interessanteste Teil ist die Umwandlung in Zeichen in der Prüfsumme. Wir addieren 17 zum Ergebnis jedes Blocks. Nehmen Sie das Modulo 43 und fügen Sie das Ergebnis dem Charakter hinzu
'0
.quelle
Japt, 46 Bytes
Mit der Länge nicht allzu zufrieden, aber ich finde keinen Weg, um Golf zu spielen. Probieren Sie es online!
quelle
JavaScript (ES6),
137132 Bytes4 Bytes gespart dank @ ՊՓԼՃՐՊՃՈԲՍԼ !
Erläuterung
Diese Herausforderung ist überhaupt nicht für JavaScript geeignet. Es gibt keine kurze Möglichkeit, eine Zeichenfolge umzukehren, und es sieht so aus, als ob die kürzeste Möglichkeit, die Zahl in ein Zeichen umzuwandeln, darin besteht, jedes mögliche Zeichen hart zu codieren.
Wenn die Ziffern in der Prüfsumme in Kleinbuchstaben angegeben werden dürfen, kann dies in 124 Bytes erfolgen:
Prüfung
Code-Snippet anzeigen
quelle
parseInt([...n].reverse().join``,2)
könnte zu geändert werden+`0b${[...n].reverse().join``}`
..replace(/.{5}/g,n=>/*stuff*/)
.MATLAB,
10098 BytesAls Eingabe wird ein String abgefragt und die Ausgabe auf dem Bildschirm angezeigt.
Erläuterung
Ich benutze hier wahrscheinlich den einfachsten Ansatz:
Jetzt unter 100 Bytes dank Luis Mendo!
quelle
e=['A':'Z',48:53]
PHP,
186181 BytesUngeplündert
Ich begann zu denken, ich könnte es viel kürzer machen, aber mir gingen die Ideen aus, um es kürzer zu machen.
quelle
Python 2, 97 Bytes
quelle
PowerShell, 162 Byte
OK, in diesem passiert eine Menge ordentliches Zeug. Ich werde mit der zweiten Zeile beginnen.
Wir nehmen die Eingabe als String über
$args[0]
und setzen sie$a
für die spätere Verwendung. Dies ist so gekapselt,()
dass es ausgeführt und das Ergebnis zurückgegeben wird (dh$a
), sodass wir es sofort mit den Ergebnissen von drei Funktionsaufrufen verketten können(f ...)
. Jeder Funktionsaufruf als Argument übergibt die Eingabezeichenfolge in umgekehrter Reihenfolge Chunks als char-Array indiziert - das heißt, für den Beispiel - Eingang,$a[4..0]
wird gleich@('0','E','R','0','a')
mit jedem Eintrag als char, kein String.Nun zur Funktion, wo das eigentliche Fleisch des Programms ist. Wir nehmen Eingaben als
$f
, aber sie werden erst gegen Ende verwendet. Konzentrieren wir uns also zuerst darauf. Da es als char-Array übergeben wurde (dank unserer vorherigen Indizierung), können wir es sofort in eine Schleife mit leiten$f|%{...}
. Innerhalb der Schleife nehmen wir jedes Zeichen und führen eine Regex-Übereinstimmung durch, bei-cmatch
der zwischen Groß- und Kleinschreibung unterschieden wird. Wir setzen das als Ganzzahl mit der Einkapselung um+()
, dann wird dieses Array aus Einsen und-join
Nullen zu einer Zeichenfolge verarbeitet. Dies wird dann als erster Parameter im .NET-[convert]::ToInt32()
Aufruf übergeben, um die Binärzahl (Basis2
) in eine Dezimalzahl zu ändern . Wir verwenden diese resultierende Dezimalzahl, um eine Zeichenfolge zu indizieren (-join(...)[...]
). Die Zeichenfolge wird zuerst als Bereich formuliert(65..90)
, der als Zeichen-Array umgewandelt und dann mit dem Bereich verkettet wird(0..5)
(dh die Zeichenfolge ist"ABCDEFGHIJKLMNOPQRSTUVWXYZ012345"
). Das heißt, Sie geben das entsprechende Zeichen aus der Zeichenfolge zurück.quelle
Jolf, 30 Bytes
Endlich ein wohl noch jolfbarer! Probieren Sie es hier aus!
quelle
Python 3,
201 174138 BytesEin großes Dankeschön an Trang Oul für den Hinweis auf eine Funktionsdeklaration, die es nicht mehr geben musste. Und ternäre Python-Operatoren. Und eine falsche Ausgabe. Gib ihm nur die Gegenstimmen.
quelle
z()
einmal verwenden, können Sie ihren Aufruf ersetzen und 25 Bytes sparen. Außerdem weist Ihr Code statt falsch[
zu0
.if else
mit dieser Konstruktion mit ternärem Operator und zweiten.J, 36 Bytes
Verwendung:
Probieren Sie es hier online aus.
quelle
C,
120118 BytesFunktioniert für jede Eingabe, deren Länge ein Vielfaches von 5 ist :)
Ungolfed
quelle
{}
j;main(n,v,s)char**v,*s;{for(printf(s=v[1]);*s;s+=5,putchar(n+65-n/442))for(n=0,j=5;j--;n=n*2+isupper(s[j]));}
n/26*17
Ausdruck sehr wichtig , daher ist das Ersetzen durch 442 keine Option. Soweit!!isupper
diese Funktion auf meinem System nicht 1 für true zurückgibt, gibt sie 256 zurück. Dies!!
ist eine kurze Möglichkeit, sie in einen 0/1-Rückgabewert zu konvertieren, egal was passiert . YMMV.C # 171 Bytes
Ich bin nicht wirklich gut darin geübt, C # zu spielen, aber hier ist ein Schuss.
quelle
char.IsUpper(t)
können durch ersetzt werdent>=65&t<=90
(&
auf Bool in C # ist im Grunde ein Golf-Shorter&&
ohne Kurzschluss).447
ist kürzer als26*17
. Sie müssen keine separateSelect
Anweisung ausführen: Sie können das Ternär direkt in die Anweisung einschließenSum
. Ziehen Sie in Betracht, alle diese Verwendungen vonSubstring
durch eine Schleife zu ersetzen, dieTake
stattdessen auf basiert , zfor(int i=0;i<3;i++)s.Skip(i*5).Take(5)
. Für zukünftige Referenzu!=""
wäre kürzer alsu.Length>0
(aber das ist nicht mehr nötig, wenn Sie verwendenTake
).n/26*17
ist nicht gleichbedeutend mitn/442
, aber ansonsten danke für die Vorschläge. Wie gesagt, ich bin nicht sehr erfahren im Golfen in C #, daher ist das alles großartige Dinge, die ich in Zukunft in Betracht ziehen sollte.C # 334
Auf Wunsch werde ich meinen Code wieder lesbar machen und veröffentlichen.
quelle
Python 3, 87 Bytes
quelle