5318008 - Spaß mit Taschenrechnern

32

In Schulen auf der ganzen Welt tippen Kinder eine Zahl in ihren LCD-Taschenrechner, drehen ihn um und lachen, nachdem sie das Wort "Boobies" erfunden haben. Natürlich ist dies das beliebteste Wort, aber es gibt viele andere Wörter, die produziert werden können.

Alle Wörter müssen jedoch kürzer als 10 Buchstaben sein (das Wörterbuch enthält jedoch Wörter, die länger sind, sodass Sie in Ihrem Programm einen Filter ausführen müssen). In diesem Wörterbuch gibt es einige Wörter in Großbuchstaben. Konvertieren Sie also alle Wörter in Kleinbuchstaben.

Erstellen Sie mit einem Wörterbuch in englischer Sprache eine Liste von Zahlen, die in einen LCD-Taschenrechner eingegeben werden können und ein Wort ergeben. Wie bei allen Code-Golf-Fragen gewinnt das kürzeste Programm, um diese Aufgabe zu erfüllen.

Für meine Tests habe ich die UNIX-Wortliste verwendet, die sich wie folgt zusammensetzt:

ln -s /usr/dict/words w.txt

Oder alternativ, bekommen sie hier .

Das obige Bild wurde beispielsweise erstellt, indem die Zahl 35007in den Taschenrechner eingegeben und auf den Kopf gestellt wurde.

Die Buchstaben und ihre jeweiligen Zahlen:

  • b :8
  • g :6
  • l :7
  • ich :1
  • o :0
  • s :5
  • z :2
  • h :4
  • e :3

Beachten Sie, dass, wenn die Zahl mit einer Null beginnt, nach dieser Null ein Dezimalpunkt erforderlich ist. Die Zahl darf nicht mit einem Komma beginnen.

Ich denke das ist MartinBüttners Code, ich wollte dir das nur gutschreiben :)

/* Configuration */

var QUESTION_ID = 51871; // Obtain this from the url
// It will be like http://XYZ.stackexchange.com/questions/QUESTION_ID/... on any question page
var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";

/* App */

var answers = [], page = 1;

function answersUrl(index) {
  return "http://api.stackexchange.com/2.2/questions/" +  QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER;
}

function getAnswers() {
  jQuery.ajax({
    url: answersUrl(page++),
    method: "get",
    dataType: "jsonp",
    crossDomain: true,
    success: function (data) {
      answers.push.apply(answers, data.items);
      if (data.has_more) getAnswers();
      else process();
    }
  });
}

getAnswers();

var SIZE_REG = /\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/;
var NUMBER_REG = /\d+/;
var LANGUAGE_REG = /^#*\s*([^,]+)/;

function shouldHaveHeading(a) {
  var pass = false;
  var lines = a.body_markdown.split("\n");
  try {
    pass |= /^#/.test(a.body_markdown);
    pass |= ["-", "="]
              .indexOf(lines[1][0]) > -1;
    pass &= LANGUAGE_REG.test(a.body_markdown);
  } catch (ex) {}
  return pass;
}

function shouldHaveScore(a) {
  var pass = false;
  try {
    pass |= SIZE_REG.test(a.body_markdown.split("\n")[0]);
  } catch (ex) {}
  return pass;
}

function getAuthorName(a) {
  return a.owner.display_name;
}

function process() {
  answers = answers.filter(shouldHaveScore)
                   .filter(shouldHaveHeading);
  answers.sort(function (a, b) {
    var aB = +(a.body_markdown.split("\n")[0].match(SIZE_REG) || [Infinity])[0],
        bB = +(b.body_markdown.split("\n")[0].match(SIZE_REG) || [Infinity])[0];
    return aB - bB
  });

  var languages = {};
  var place = 1;
  var lastSize = null;
  var lastPlace = 1;
  answers.forEach(function (a) {
    var headline = a.body_markdown.split("\n")[0];
    //console.log(a);
    var answer = jQuery("#answer-template").html();
    var num = headline.match(NUMBER_REG)[0];
    var size = (headline.match(SIZE_REG)||[0])[0];
    var language = headline.match(LANGUAGE_REG)[1];
    var user = getAuthorName(a);
    if (size != lastSize)
      lastPlace = place;
    lastSize = size;
    ++place;
    answer = answer.replace("{{PLACE}}", lastPlace + ".")
                   .replace("{{NAME}}", user)
                   .replace("{{LANGUAGE}}", language)
                   .replace("{{SIZE}}", size)
                   .replace("{{LINK}}", a.share_link);
    answer = jQuery(answer)
    jQuery("#answers").append(answer);

    languages[language] = languages[language] || {lang: language, user: user, size: size, link: a.share_link};
  });

  var langs = [];
  for (var lang in languages)
    if (languages.hasOwnProperty(lang))
      langs.push(languages[lang]);

  langs.sort(function (a, b) {
    if (a.lang > b.lang) return 1;
    if (a.lang < b.lang) return -1;
    return 0;
  });

  for (var i = 0; i < langs.length; ++i)
  {
    var language = jQuery("#language-template").html();
    var lang = langs[i];
    language = language.replace("{{LANGUAGE}}", lang.lang)
                       .replace("{{NAME}}", lang.user)
                       .replace("{{SIZE}}", lang.size)
                       .replace("{{LINK}}", lang.link);
    language = jQuery(language);
    jQuery("#languages").append(language);
  }

}
body { text-align: left !important}

#answer-list {
  padding: 10px;
  width: 50%;
  float: left;
}

#language-list {
  padding: 10px;
  width: 50%px;
  float: left;
}

table thead {
  font-weight: bold;
}

table td {
  padding: 5px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b">
<div id="answer-list">
  <h2>Leaderboard</h2>
  <table class="answer-list">
    <thead>
      <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr>
    </thead>
    <tbody id="answers">

    </tbody>
  </table>
</div>
<div id="language-list">
  <h2>Winners by Language</h2>
  <table class="language-list">
    <thead>
      <tr><td>Language</td><td>User</td><td>Score</td></tr>
    </thead>
    <tbody id="languages">

    </tbody>
  </table>
</div>
<table style="display: none">
  <tbody id="answer-template">
    <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
  </tbody>
</table>
<table style="display: none">
  <tbody id="language-template">
    <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
  </tbody>
</table>

Beta-Zerfall
quelle
4
Kann ein Dezimalpunkt nach der ersten Zahl verwendet werden, auch wenn dies nicht erforderlich ist?
Dennis
1
Müssen wir 0.7734für hallo tippen oder wäre .7734das akzeptabel?
Dennis
3
Was ist das richtige Verhalten, wenn das Wörterbuch Wörter mit Großbuchstaben, Satzzeichen usw. enthält?
Peter Taylor
1
@ Tennis 0.7734ist erforderlich
Beta Decay
4
Was ist mit Wörtern, für die eine nachgestellte Null nach dem Komma erforderlich ist? Zum Beispiel oligoerfordert eine Hinter Null nach dem Komma:0.6170
Mr. Llama

Antworten:

7

CJam, 44 42 Bytes

r{el"oizehsglb"f#W%"0."a.e|N+_,B<*_W&!*r}h

Probieren Sie es online im CJam-Interpreter aus .

Laden Sie den Java-Interpreter herunter und führen Sie Folgendes aus, um das Programm über die Befehlszeile auszuführen:

java -jar cjam-0.6.5.jar 5318008.cjam < /usr/share/dict/words

Wie es funktioniert

r            e# Read a whitespace-separated token from STDIN.
{            e# While loop:
 el          e#   Convert to lowercase.
 "oizehsglb" e#   Push that string.
 f#          e#   Get the index of each character from the input in that string.
             e#   This pushes -1 for "not found".
 W%          e#   Reverse the resulting array.
 "0."a       e#   Push ["0."].
 .e|         e#   Vectorized logical NOT. This replaces an initial 0 with "0.".
 N+          e#   Append a linefeed.
 _,B<*       e#   Repeat the array (array.length < 11) times.
 _W&!*       e#   Repeat the array !(array.intersection(-1)) times.
 r           e#   Read a whitespace-separated token from STDIN.
}h           e# If the token is not empty, repeat the loop.
Dennis
quelle
9

Bash + Coreutils, 54

Nochmals vielen Dank an @TobySpeight für die Golfhilfe.

rev|tr oizehsglb 0-8|sed '/.\{11\}\|[^0-9]/d;s/^0/&./'

Die eingegebene Wortliste stammt aus STDIN:

$ ./5318008.sh < /usr/share/dict/words | head
8
38
338
5338
638
5638
36138
31738
531738
7738
$ 
Digitales Trauma
quelle
"Belie" und "Belies" sind Wörter? Je mehr Sie wissen ...
Clismique
6

Python 2, 271 216 211 205 Bytes

Dies ist die einzige Idee, die ich bisher hatte. Ich werde sie aktualisieren, sobald mir etwas anderes einfällt! Ich nahm an, wir müssten aus einer Datei lesen, aber wenn nicht, lass es mich wissen, damit ich updaten kann :)

Vielen Dank an Dennis, der mir 55 Bytes gespart hat :)

Danke auch an Sp3000 für das Speichern von 6 Bytes :)

d,f,g='oizehsglb',[x.lower()for x in open('w.txt').read().split('\n')if len(x)<10],[]
for x in f:
 c=x[::-1]
 for b in d:c=c.replace(b,`d.find(b)`)
 g=[g,g+[['0.'+c[1:],c][c[0]!='0']]][c.isdigit()]
print g
Kade
quelle
Ich kenne nicht viel von Python, aber würde etwas "oizehsglb".index(b)nicht kürzer sein?
Dennis
3
d[b] == "oizehsglb".index(b). Möglicherweise fehlt eine Besetzung für Zeichenfolge / Charakter.
Dennis
1
Oh, wow, mir ist nie in den Sinn gekommen, dass die Zahlen, die wir ersetzen konnten, Zahlenwerte in der richtigen Reihenfolge hatten. Ja, das wird definitiv funktionieren! Vielen Dank!
Kade,
1
Nicht getestet, aber: 1) .findist kürzer als .index, 2) Abhängig von der Version, die Sie haben, mindestens in 2.7.10 openohne ein Standardargument für den Modus r, 3) funktioniert nicht nur for x in open(...)? (Möglicherweise muss eine nachgestellte Zeile entfernt werden.) Ist dies nicht der Fall, .split('\n')ist sie kürzer als.splitlines()
Sp3000 20.06.15
1
Auch g+=[['0.'+c[1:],c][c[0]!='0']]*c.isdigit(), und Sie können durch Umkehren in ein paar mehr sparen fdann tun for c in fstatt mit c=x[::-1]. Auch Sie nur feinmal verwenden, so müssen Sie es nicht als Variable
speichern
6

JavaScript (ES7), 73 Byte

Dies ist in ES7 in nur 73 Bytes möglich:

s=>[for(w of s)'oizehsglb'.search(w)].reverse().join``.replace(/^0/,'0.')

Ungolfed:

var b = function b(s) {
    return s.length < 10 && /^[bglioszhe]*$/.test(s) ? s.replace(/./g, function (w) {
        return 'oizehsglb'.search(w);
    }).reverse().join('').replace(/^0/, '0.') : '';
};

Verwendung:

t('hello'); // 0.7734
t('loose'); // 35007
t('impossible'); //

Funktion:

t=s=>                       // Create a function 't' with an argument named 's' 
   [                        // Return this array  comprehension
     for(i of s)            // Loops through each letter in the string
     'oizehsglb'.search(w)  // Converts it to it's corresponding number
   ]
  .reverse().join``         // Reverse the array and make it a string
  .replace(/^0/,'0.')       // If the first character is a 0, add a decimal after it

Ich habe dies auf der UNIX-Wortliste ausgeführt und die Ergebnisse in einen Einfügebehälter gestellt:

Ergebnisse

Der Code, mit dem die Ergebnisse in Firefox abgerufen werden :

document.querySelector('pre').innerHTML.split('\n').map(i => t(i.toLowerCase())).join('\n').replace(/^\s*[\r\n]/gm, '');
Downgoat
quelle
Was passiert mit t('Impossible')?
Arturo Torres Sánchez
@ ArturoTorresSánchez Du hast Recht, ich habe das behoben
Downgoat
ist join`` ES2015 oder ist es vor ES2015?
WallyWest
@WallyWest Das ist eine ES6-Funktion. Es wird in den meisten
gängigen
Was ist das Besondere an ES7?
Arjun
5

Python 2, 121 Bytes

for s in open("w.txt"):
 L=map("oizehsglb".find,s[-2::-1].lower())
 if-min(L)<1>len(L)-9:print`L[0]`+"."[L[0]:]+`L`[4::3]

Es wird davon w.txtausgegangen, dass die Wörterbuchdatei mit einem nachgestellten Zeilenumbruch endet und keine leeren Zeilen enthält.

Sp3000
quelle
3

GNU sed, 82

(einschließlich 1 für -r)

Vielen Dank an @TobySpeight für die Golfhilfe.

s/$/:/
:
s/(.)(:.*)/\2\1/
t
s/://
y/oizehsglb/012345678/
/.{11}|[^0-9]/d;s/^0/&./

Die eingegebene Wortliste stammt aus STDIN:

$ sed -rf 5318008.sed /usr/share/dict/words | tail
3705
53705
1705
0.705
50705
5705
505
2
0.02
5002
$ 
Digitales Trauma
quelle
2

TI-BASIC, 75 88 Bytes

edit 2: egal, das ist technisch immer noch ungültig, da es immer nur ein wort akzeptiert (kein wörterbuch). Ich werde versuchen, es zu reparieren, um mehr als ein Wort als Eingabe zuzulassen ...

bearbeiten: oops; Ich ließ es ursprünglich am Ende eine .0 anzeigen, wenn die letzte Zahl 0 war, nicht umgekehrt. Behoben, obwohl dies eine schlechte Problemumgehung ist (zeigt "0" neben der Zahl an, wenn sie mit 0 beginnt, andernfalls werden zwei Leerzeichen an derselben Stelle angezeigt). Auf der hellen Seite werden Wörter wie "Otto" (zeigt beide Nullen an) richtig behandelt, da keine Dezimalzahl angezeigt wird!


Ich kann mir keine bessere Sprache dafür vorstellen. Kann definitiv mehr Golf spielen, aber ich bin im Moment zu müde. Die Tilde ist das Negationssymbol [der ( - )Knopf].

Die Eingabe erfolgt über die Antwortvariable des Rechners. Dies bedeutet, was auch immer zuletzt ausgewertet wurde (wie _in der interaktiven Python-Shell). Sie müssen also eine Zeichenfolge auf dem Startbildschirm eingeben (Anführungszeichen ist aktiviert ALPHA+), drücken ENTERund das Programm ausführen. Alternativ können Sie einen Doppelpunkt verwenden, um Befehle zu trennen. Wenn Sie das Programm also "CALCTEXT" nennen und es in der Zeichenfolge "HELLO" ausführen möchten, können Sie eingeben, "HELLO":prgmCALCTEXTanstatt sie separat auszuführen .

seq(inString("OIZEHSGLB",sub(Ans,X,1))-1,X,length(Ans),1,~1
Text(0,0,sub("0.  ",1+2(0 or Ans(1)),2),sum(seq(Ans(X)10^(dim(Ans)-X),X,1,dim(Ans
MI Wright
quelle
2

Python 2, 147 158 156 Bytes

Mir hat diese 0 gefehlt. Anforderung. Hoffe jetzt klappt es in Ordnung.

edit : ".readlines ()" entfernt und es funktioniert immer noch; p

edit2 : Einige Leerzeichen wurden entfernt und der Ausdruck in die 3. Zeile verschoben

edit3 : 2 Bytes dank Sp3000 gespeichert (Leerzeichen nach dem Drucken entfernt und 'index' in 'find' geändert)

for x in open("w.txt"):
 a="oizehsglb";g=[`a.find(b)`for b in x[::-1].lower()if b in a]
 if len(g)==len(x)-1<10:
  if g[0]=="0":g[0]="0."
  print"".join(g)
heo
quelle
1

Python 2, 184 174 Bytes

for s in open('w.txt'):
 try:a=''.join(map(lambda c:dict(zip('bglioszhe','867105243'))[c],s[:-1][::-1]));a=[a,'0.'+a[1:]][a[0]=='0'];print['',''.join(a)][len(s)<11]
 except:0
Dieter
quelle
1

Ruby 2, 88 86 Bytes

x="oizehsglb"
puts$_.tr(x,"0-8").reverse.sub /^0/,"0." if$_.size<11&&$_.delete(x)<?A

Die Byteanzahl umfasst 2 für die lnOptionen in der Befehlszeile:

$ ruby -ln 5318008.rb wordlist.txt
daniero
quelle
In diesem Fall ==""kann durch ersetzt werden <?A. Und keine Notwendigkeit für gsub()so sub()ist genug.
Manatwork
1

C 182 172 169/181 172 Bytes

char*l="oizehsglb",S[99],*s,*t;main(x){for(;t=S+98,gets(S);){for(s=S;*s;s++)if(x=strchr(l,*s|32))*--t=48+x-(int)l;else break;*t==48?*t--=46,*t=48:0;*s||s-S>10?0:puts(t);}}

Erweitert

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *l="oizehsglb",S[99],*s,*t;

main(int x, char **argv)
{
    for (;t=S+98,gets(S);){
        for (s=S;*s;s++)
            if (x=strchr(l,*s|32))
                *--t=48+x-(int)l;
            else
                break;
        if (*t==48) {       // '0'
            *t--=46;        // '.'
            *t=48;  // '0'
        }

        if (!*s && s-S <= 10)
            puts(t);
    }
}

Verwenden der verknüpften Datei words.txt mit Konvertierung in Kleinbuchstaben:

$ ./a.out  < words.txt  | tail
2212
0.2
0.802
0.602
7702
37702
0.02
321607002
515002
0.02002

$ ./a.out < words.txt   | wc -l
 550
ein Benutzer
quelle
1
Werde nicht *s|32als Kleine Umwandlung in diesem Zusammenhang arbeiten?
Hagen von Eitzen
Großartige Idee! Vielen Dank!
Einige Benutzer
1

Haskell, 175 Bytes ohne Importe (229 Bytes mit Importen)

Relevanter Code (z. B. in Datei Calc.hs):

import Data.Char(toLower)
import Data.Maybe(mapMaybe)
s="oizehsglb\n"
g('0':r)="0."++r
g x=x
main=mapM_(putStrLn.g.reverse.mapMaybe(`lookup`zip s['0'..'8'])).filter(\l->length l<10&&all(`elem`s)l).lines.map toLower=<<getContents

$ cat /usr/share/dict/words | runghc Calc.hs
saep
quelle
0

Java, 208 200 176 Bytes

String f(char[] w){String o="",l="oizehsglb";for(int i=w.length;i>0;i--)o+=l.indexOf(w[i-1]|32);if(o.contains("-")||o.length()>8)o="  ";return o.charAt(0)+"."+o.substring(1);}

Erweitert

String f(char[] w)
{
    String o = "", l = "oizehsglb";
    for(int i = w.length; i > 0; i--)
        o+=l.indexOf(w[i-1]|32);
    if(o.contains("-")||o.length() > 8)
        o = "  ";
    return o.charAt(0) + "." + o.substring(1);
}

Es wird immer die Dezimalstelle hinzugefügt, und wenn ungültig, wird "." Zurückgegeben. Funktioniert aber sonst so wie es soll. : P

Vielen Dank an LegionMammal978!

Whitcomb L. Judson
quelle
Sie können 7 Bytes sparen, indem Sie ;String l=zu ,l=und =o+zu wechseln +=.
LegionMammal978,