Zuordnung zwischen ganzzahligem und aussprechbarem Wort


10

Zweck

Die Idee ist, den Code bereitzustellen, der erforderlich ist, um eine 32-Bit-Ganzzahl einem aussprechbaren Wort mit maximal 9 Zeichen zuzuordnen. Dies kann beispielsweise nützlich sein, um das Speichern einer Seriennummer zu erleichtern oder ein Formular einzugeben.

Sowohl das Verfahren zum Übersetzen einer Ganzzahl in das entsprechende Wort als auch zum Zurückübersetzen eines Wortes in die entsprechende Ganzzahl sind erforderlich.

Regeln

Es muss eine Eins-zu-Eins-Zuordnung zwischen Ganzzahlen und Wörtern geben, und der gesamte Satz von 32-Bit-Ganzzahlen (oder, anders ausgedrückt, jede Ganzzahl von 0 bis 4294967295) muss zugeordnet werden können. Obwohl offensichtlich nicht alle Wörter aussagekräftig sind und die Eingabe von Wörtern, die keiner Ganzzahl zugeordnet sind, möglicherweise ein nicht angegebenes Verhalten aufweist.

Es steht Ihnen frei, genau zu entscheiden, welche "aussprechbaren" Wörter sinnvoll sind und wie die Zuordnung erfolgt. Die Wörter müssen jedoch mindestens die folgenden Regeln befolgen:

  • Nur die grundlegenden 26 Buchstaben (A ... Z) sollten als Zeichen verwendet werden. Akzente, Gehäuse usw. sollten nicht verwendet werden, um die möglichen Kombinationen zu erweitern.
  • Maximal 9 Zeichen pro Wort.
  • Zwei Konsonanten (BCDFGHJKLMNPQRSTVWXZ - 20 Möglichkeiten) sollten nicht nebeneinander platziert werden (sie müssen von Vokalen umgeben sein).
  • Zwei Vokale (AEIOUY - 6 Möglichkeiten) sollten nicht nebeneinander platziert werden (sie müssen von Konsonanten umgeben sein).

Hinweis: das einfachste System , in dem Sie alle Wörter haben konstruiert , wie CVCVCVCVC( Cwobei ein Konsonant und VVokal) gibt 4147200000 Kombinationen und eine 32 - Bit - Integer hat 4294967296 möglichen Werte, so dass es nicht genug ist. Sie müssen die Anzahl der Kombinationen erweitern, indem Sie entweder kürzere Wörter oder auch VCVCVCVCVKombinationen zulassen.

Es gelten andere Standardregeln, und Standardlücken sind verboten.

Eingänge Ausgänge

Für jede Einreichung müssen zwei Codeteile bereitgestellt werden:

  • Eine, die eine Ganzzahl als Argument / Eingabe verwendet und das entsprechende Wort zurückgibt / druckt
  • Eine, die ein Wort als Argument / Eingabe verwendet und die entsprechende Ganzzahl zurückgibt / druckt

Alternativ können Sie einen einzelnen Code senden, der beide Vorgänge abwickelt:

  • Wenn eine Ganzzahl als Eingabe angegeben wird, wird das entsprechende Wort ausgegeben
  • Wenn eine Zeichenfolge als Eingabe angegeben wird, wird die entsprechende Ganzzahl ausgegeben

Gewinnbedingung

Dies ist ein , bei dem die Antwort mit den wenigsten Bytes (beim Summieren beider Codeteile für Lösungen, die sich für die getrennten Codeteile entscheiden) gewinnt.


Gibt es räumliche oder zeitliche Einschränkungen? Müssen wir in 32 GB Speicher passen?
John Dvorak

@ JanDvorak Nun, wir sollten in der Lage sein, Ihr Programm auf einem "Standard" -Computer zu testen. Aber der Algorithmus sollte einfach sein. Was denken Sie, das so viel Speicher benötigt?
schwächer verlorenes Vertrauen in SE

Ich könnte einfach alle möglichen Wörter mit neun Buchstaben generieren, die Ihrer Formel entsprechen, und dann in die Menge indizieren oder eine binäre Suche durchführen.
John Dvorak

@ JanDvorak Ich muss zugeben, dass ich nicht daran gedacht habe. Ich habe mehr über Lösungen nachgedacht, die im Grunde genommen Basis-26-Konvertierungen durchführen, mit einigen Anpassungen, um die Vokal- / Konsonantenbeschränkung zu erfüllen. Aber ich bezweifle irgendwie, dass die "brutale" Art, die Sie sich vorgestellt haben, Code-Golf effizient sein kann. Wenn ich das wirklich klarstellen muss, nehmen wir an, Sie dürfen nicht mehr als 4 GB Speicher zuweisen.
schwächer verlorenes Vertrauen in SE

Sie können von den Antwortenden verlangen, dass sie ihren Code für einige vorgegebene Werte (0,1,10,2 ** 32-1 und dergleichen) ausführen und dann zurück und die Ergebnisse in die Antwort aufnehmen.
John Dvorak

Antworten:


1

JavaScript (ES6), 205 Byte

p=>(a='bcdfghjklmnpqrstvwxzaeiouy',1/p)?[...Array(9)].map(_=>r=a[p%(n=26-n)+(p=p/n|0,n<7)*20]+r,n=p>(p%=4e9)?20:6,r='')&&r:[...p].map(c=>r=r*(n=26-n)+a.search(c)%20,n=a.search(p[r=0])<20?6:20)&&r+(n<7)*4e9

Der Grenzwert zwischen CVCVCVCVC und VCVCVCVCV ist 4e9, daher beginnt bei 5244160000 (numerische Eingabe) oder zesuwurib(Zeichenfolgeneingabe) ein Fehler .


Sechs Monate später ... Ich vergebe Ihnen die Akzeptanzpunkte, da Sie der kürzeste sind (und ich kann die Antwort von rturnbull nicht akzeptieren, was der Klarstellung, die ich in den Kommentaren gemacht habe, nicht entspricht).
schwächer verlorenes Vertrauen in SE

2

PHP, 353 Bytes

Kodierung + Dekodierung

is_numeric($argn)enthält den Booleschen Wert. Es ist wahr, wenn die Eingabe eine ganze Zahl ist.

$c=array_diff(range(A,Z),$v=[A,E,I,O,U,Y]);sort($c);if(is_numeric($a=$argn)){$r=($a)%26<6?$v[$a%26]:$c[$a%26-6];$a=$a/26^0;while($a){$z=count($t=in_array($r[0],$v)?$c:$v);$r=$t[$n=$a%$z].$r;$a=$a/$z^0;}echo$r;}else{for($p=1;$i++<strlen($a);){$u=($b=in_array($a[-$i],$c))?$c:$v;$s+=array_flip($u)[$a[-$i]]*$p+($b&$i<2?6:0);$p*=$i>1?count($u):26;}echo$s;}

PHP, 190 Bytes (Encode) + 195 Bytes (Decodieren) = 385 Bytes

Codierung

$c=array_diff(range(A,Z),$v=[A,E,I,O,U,Y]);sort($c);$r=($a=$argn)%26<6?$v[$a%26]:$c[$a%26-6];$a=$a/26^0;while($a){$z=count($t=in_array($r[0],$v)?$c:$v);$r=$t[$n=$a%$z].$r;$a=$a/$z^0;}echo$r;

5391360000 = 26 * 120 ** 4 Kombinationen sind verfügbar

Online-Versionscodierung ohne E_NOTICE

Erweitert

$c=array_diff(range(A,Z),$v=[A,E,I,O,U,Y]);
sort($c); # End of Prepare the two array
$r=($a=$argn)%26<6?$v[$a%26]:$c[$a%26-6]; #base 26 decision input mod 26 <6 end with vowel
$a=$a/26^0; #integer division input with 26
while($a){
    $z=count($t=in_array($r[0],$v)?$c:$v); # use vowel if last entry is consonant and viceversa
    $r=$t[$n=$a%$z].$r; # base 6 or base 20 decision
    $a=$a/$z^0; # divide through base
}echo$r; # Output result

Eingabe => Ausgabe

4294967296 => TYPYQACOV 
333 => DAT 
1 => E 
7 => C 
4294967276 => UTOPOQAMI

Wenn Sie immer 9 Byte Ergebnis müssen ersetzen Sie bitte while($a)mit while(strlen($r)<9)+ 10 Bytes

Dekodierung

$c=array_diff(range(A,Z),$v=[A,E,I,O,U,Y]);sort($c);for($p=1;$i++<strlen($a=$argn);){$u=($b=in_array($a[-$i],$c))?$c:$v;$s+=array_flip($u)[$a[-$i]]*$p+($b&$i<2?6:0);$p*=$i>1?count($u):26;}echo$s;

Erweitert

$c=array_diff(range("A","Z"),$v=["A","E","I","O","U","Y"]);
sort($c); # End of Prepare the two array
for($p=1;$i++<strlen($a=$argn);){ 
    $u=($b=in_array($a[-$i],$c))?$c:$v; # find use array for $a[-$i]
    $s+=array_flip($u)[$a[-$i]]*$p+($b&$i<2?6:0); # sum value
    $p*=$i>1?count($u):26; # raise multiple for next item
}echo$s;

Eingabe => Ausgabe

ABABABABE => 1
E => 1
UTOPOQAMI => 4294967276
BABABADAT => 333
DAT => 333
TYPYQACOV => 4294967296

Online-Versionsdecodierung ohne E_NOTICE

Zusätzliche Prüfung

Wenn wir eine Überprüfung benötigen, ob eine Zeichenfolge gültig ist.

Fügen Sie $x.=$b?:0;am Ende der Decodierungsschleife + 10 Bytes hinzu

Ersetzen Sie echo$s;mit echo!preg_match('#([01])\1$#',$x)?$s:_;+ 32 Bytes


1

R, 165 Bytes

Kodierung und Dekodierung in einer Funktion.

Diese Funktion verwendet die Brute-Force-Methode, um alle möglichen Werte zu erstellen und dann einfach den Index zurückzugeben, wenn eine Zeichenfolgeneingabe erfolgt, und die Zeichenfolge zurückzugeben, wenn eine Ganzzahleingabe erfolgt. Infolgedessen ist es sehr langsam und benötigt mehr als 16 GB Speicher!

function(x){i=c(1,5,9,15,21,25)
d=apply(expand.grid(c<-letters[-i],v<-letters[i],c,v,c,v,c,v,c(c,"")),1,paste,collapse="")
`if`(mode(x)=="numeric",d[x],which(d==x))}

4.354.560.000 Werte sind möglich. Dies umfasst alle Zeichenfolgen der Form CVCVCVCV (C), wobei das letzte C optional ist.


@ mbomb007 Gigabyte, Entschuldigung für den Tippfehler. Die Funktion codiert und decodiert je nachdem, ob das Argument eine Zeichenfolge oder eine Ganzzahl ist. Ich habe den Beitrag aktualisiert, um dies zu verdeutlichen.
Rturnbull

Kann der Downvoter einen Kommentar hinterlassen, um eine Verbesserung vorzuschlagen? Vielen Dank.
Rturnbull

1
In den Kommentaren der Frage stellt dim klar, dass Sie nicht mehr als 4 GB Speicher verwenden können ....
Socratic Phoenix
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.